Powershell: скрипт для преобразования листа Excel в CSV с использованием предустановленных функций - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь написать сценарий на PowerShell, который может oop просматривать листы Excel из подготовленного файла Excel и извлекать диапазон значений на каждом листе, которые я затем передаю в командлет import-csv. Это первый шаг в более крупном скрипте, который воздействует на файлы csv; Я пытаюсь объединить все шаги в один удобный сценарий.

Моя проблема в том, что мне нужно:

  • сценарий для работы без установленного Excel (исключает COM-объект Excel.Application)

  • невозможно установить модули PowerShell (за исключением популярного ImportExcel).

  • можно использовать с файлами xlsx (исключает Jet 4.0 с объектом Excel 8.0)

  • Не требует разрешений на загрузку / администратора для каталогов или имеет простые обходные пути для этого.

Вкратце:

Возможен ли импорт листа Excel в CSV с помощью сценария PowerShell только с предварительно установленными Windows функциями?

Следующим лучшим вариантом будут минимальные изменения, такие как объединение небольшой библиотеки с сценарий, на который можно легко сослаться в сценарии (попадут ли Open XML SDK или EPPlus 4.5.3.3 в эту категорию?).

Спасибо.

1 Ответ

1 голос
/ 18 июня 2020

Можно работать с необработанными данными Excel, но вам придется «перепроектировать» формат. Мне удалось получить некоторые полезные данные из простого листа очень .

Чтобы проверить и поэкспериментировать с этим, создайте пустую папку и сохраните документ Excel как Book1xlsx с некоторыми значениями, например это:

| Name    | Value |
| adf     | 5     |
| fgfdg   | 4     |
| dfgdsfg | 3     |

Затем поместите туда этот скрипт и посмотрите результат. Если ваши данные более продвинуты, вам, вероятно, придется потратить немало времени на выяснение того, как называются разные типы и листы, и как их искать.

unzip Book1.xlsx

[xml]$sheet = Get-Content "xl\worksheets\sheet1.xml"
[xml]$strings = Get-Content "xl\sharedStrings.xml"

$stringsTable = $strings.sst.si.t

$data = $sheet.worksheet.sheetData.row | % {
    # Each column for each row is in the "c" variable
    # (The ,@() is a hack to avoid powershell from turning everything into a single array)
    return ,@($_.c | % {
        # There is a "t" property that represents the type. 
        if ($_.t -like "s") {
            # "s" means a string. To get the actual content we need to look up in the strings xml
            return $stringsTable[$_.v]
        } elseif ($_.t -like "") {
            # Empty type means integer, we can return the value as is
            return $_.v
        }
    })
}

# Data will be a 2 dimensional array
# $data[0][0] will refer to A1
# $data[1][0] will refer to A2
# $data[0][1] will refer to B1
$data

Надеюсь, это будет достаточно, чтобы вы начали.

Изменить: вот также код для преобразования двухмерного массива в PSObject, который вы можете использовать с Export-Csv.

$headers = $data[0]

$dataObject = $data | Select-Object -Skip 1 | % {
    $row = $_
    $index = 0
    $object = @{}
    foreach ($column in $row) {
        $object[$headers[$index]] += $column
        $index++
    }
    return [PSCustomObject]$object
}

$dataObject | Export-Csv ...
...