Powershell:使用预安装功能将 excel sheet 转换为 csv 的脚本

Powershell: Script for converting excel sheet to csv using pre-installed functionality

我正在尝试在 powershell 中编写一个脚本,该脚本可以从准备好的 Excel 文件循环遍历 Excel sheets 并在每个 sheet 中提取一系列值],然后我将其通过管道传输到 import-csv cmdlet 中。这是作用于 csv 文件的更大脚本的第一步;我正在尝试将所有步骤整合到 1 个方便的脚本中。

我的问题是我需要:

简而言之:

是否可以通过仅预安装 Windows 功能的 PowerShell 脚本将 excel sheet 导入 CSV?

下一个最好的办法是进行最小的调整,例如将一个小型库与脚本捆绑在一起,以便在脚本中轻松引用(Open XML SDK 或 EPPlus 4.5.3.3 是否属于此类? ).

谢谢。

可以使用原始 Excel 数据,但您必须 "reverse engineer" 格式。我能够从 非常 简单的 sheet.

中获得一些有用的数据

要对此进行测试和尝试,请创建一个空文件夹并将 Excel 文档另存为 Book1xlsx,并使用如下值:

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

然后把这个脚本放在那里,看看结果。如果您的数据更高级,您可能需要花费大量时间来弄清楚不同类型和 sheet 的命名方式,以及如何查找它们。

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 ...