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 个方便的脚本中。
我的问题是我需要:
无需安装 Excel 即可运行的脚本(排除 COM 对象 Excel.Application)
无法安装 powershell 模块(排除流行的 ImportExcel)。
可用于 xlsx 文件(排除带有 excel 对象 8.0 的 jet 4.0)
不需要 downloads/admin 目录权限或对此有简单的解决方法。
简而言之:
是否可以通过仅预安装 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 ...
我正在尝试在 powershell 中编写一个脚本,该脚本可以从准备好的 Excel 文件循环遍历 Excel sheets 并在每个 sheet 中提取一系列值],然后我将其通过管道传输到 import-csv cmdlet 中。这是作用于 csv 文件的更大脚本的第一步;我正在尝试将所有步骤整合到 1 个方便的脚本中。
我的问题是我需要:
无需安装 Excel 即可运行的脚本(排除 COM 对象 Excel.Application)
无法安装 powershell 模块(排除流行的 ImportExcel)。
可用于 xlsx 文件(排除带有 excel 对象 8.0 的 jet 4.0)
不需要 downloads/admin 目录权限或对此有简单的解决方法。
简而言之:
是否可以通过仅预安装 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 ...