У нас есть некоторая автоматизация, для которой мы хотим использовать PowerShell для Windows-бокса, на котором нельзя установить Excel, и поэтому у меня нет доступа к объектам Excel COM.Моя цель - преобразовать файл Excel размером ~ 250 000 строк в файл с разделителями табуляции для быстрой загрузки в Teradata.
У меня была идея распаковать файл XLSX (поскольку в любом случае это действительно переименованный файл ZIP) и прочитатьследующие два файла XML: sharedStrings.xml и sheet1.xml.sharedStrings.xml содержит реальные значения ячеек и текст, как указано в sheet1.xml.
Кажется, что работает следующее, но только с небольшими файлами.С большими файлами это идет слишком медленно, хотя я пытаюсь автоматически конвертировать.Вот что я пробовал до сих пор, используя PowerShell:
$path_shared_strings = "Excel File\xl\sharedStrings.xml"
$path_xml_sheet = "Excel File\xl\worksheets\sheet1.xml"
$xml_shared_strings = New-Object -TypeName "System.Xml.XmlDocument"
$xml_shared_strings.Load($path_shared_strings)
$xml_sheet = New-Object -TypeName "System.Xml.XmlDocument"
$xml_sheet.Load($path_xml_sheet)
$output_file = "test.csv"
$delimited_content = ""
$tot_rows = ($xml_sheet.worksheet.sheetData.row.Count)
$tot_cols = ($xml_sheet.worksheet.sheetData.row[1].c.Count)
for($row_cnt = 0; $row_cnt -le ($tot_rows - 1); $row_cnt++)
{
$row_string = ""
for($col_cnt = 0; $col_cnt -le ($tot_cols - 1); $col_cnt++)
{
if( $col_cnt -gt 0 ) { $row_string = $row_string + " " }
$indexed_value = $xml_sheet.worksheet.sheetData.row[$row_cnt].c[$col_cnt].v
$actual_value = $xml_shared_strings.sst.si.t[$indexed_value]
$row_string = $row_string + $actual_value
if( $col_cnt -eq ($tot_cols - 1) ) { $row_string = $row_string + "`r`n" }
}
$delimited_content = $delimited_content + $row_string
}
$delimited_content | out-file $output_file
Мой вопрос: есть ли лучший способ?Или, если наш единственный не COM-объект - через XML, есть ли лучший способ преобразовать его в файл с разделителями?