Использование PowerShell для преобразования из Excel XLSX в файл с разделителями табуляции без установленного Excel - PullRequest
1 голос
/ 06 мая 2019

У нас есть некоторая автоматизация, для которой мы хотим использовать 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, есть ли лучший способ преобразовать его в файл с разделителями?

1 Ответ

0 голосов
/ 07 мая 2019

Попробуйте использовать string Builder для объединения строк:

[System.Text.StringBuilder]$delimited_content = ""
[System.Text.StringBuilder]$row_string = ""
.
[void]$row_string.Clear()
.
[void]$row_string.Append( $actual_value )
.
[void]$delimited_content.Append($row_string)
.
$delimited_content.ToString() | out-file $output_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...