Powershell xlsx到csv(包括格式化整列和替换特定列中的空单元格)
我想让powershell comand执行以下操作-但我没有能力解决此问题:-) 理想的: 输入“file.xlsx” 输出“file.csv” (如果csv到csv太麻烦就可以了)Powershell xlsx到csv(包括格式化整列和替换特定列中的空单元格),powershell,Powershell,我想让powershell comand执行以下操作-但我没有能力解决此问题:-) 理想的: 输入“file.xlsx” 输出“file.csv” (如果csv到csv太麻烦就可以了) 将“日期”列中日期为空的单元格设置为“xxx” 将列日期的字符从“.”格式化/替换为“-” 设置(如果需要)-编码utf8 谢谢既然您说“csv到csv很好”,那么如果您先将Excel文件导出到csv,您可以这样做: Import-Csv -Path 'D:\Test\file.csv' -UseCulture
Import-Csv -Path 'D:\Test\file.csv' -UseCulture |
Select-Object Firm, Code,
@{Name = 'Date'; Expression = {
if ([string]::IsNullOrWhiteSpace($_.Date)) { 'xxx' }
else { $_.Date.Replace('.', '-') }
}} |
Export-Csv -Path 'D:\Test\new_file.csv' -UseCulture -Encoding UTF8 -NoTypeInformation
我正在使用switch-UseCulture
,因此导入Csv和导出Csv都将使用Excel使用的相同分隔符
编辑 谢谢你的评论。从问题来看,不清楚真正的列标题是什么 头
'Fulde navn'
有一个额外的问题。因为它在Excel文件中是明确的单引号,当将其保存为CSV时,CSV中的头变成Fulde navn'
。正如您所看到的,Excel删除了第一个单引号,但保留了结束引号
您可以通过在保存为CSV之前在Excel中删除标题周围的这些引号,或者在代码中以“Fulde navn'
的形式列出该标题来解决此问题
在下面编辑的代码中,我使用了它(尽管我更喜欢删除原始Excel文件中的引号)
为了保留字符æå
,我们还需要强制Excel导出UTF8,我找到的唯一方法是将其保存为Unicode文本(.txt)
,这将创建一个扩展名为.txt的制表符分隔文件
在Excel中,选择另存为…
并选择文件类型Unicode文本(.txt)Unicode
:
编辑2(最终版本) 当前代码:
Import-Csv -Path 'D:\input.csv' -UseCulture |
Select-Object 'Virksomhedskode', 'Afdelingskode', 'Kode', 'Fulde navn', 'Stillingsbetegnelse', 'CPR-nummer', 'Bogføringsgruppekode', 'Ansættelsesdato',
@{Name = 'Fratrædelsesdato'; Expression = {
if ([string]::IsNullOrWhiteSpace($_.Fratrædelsesdato)) { 'xxx' }
else { $_.Fratrædelsesdato.Replace('.', '-') }
}} |
Export-Csv -Path 'D:\edited.csv' -UseCulture -Encoding utf8 -NoTypeInformation
谢谢。但我似乎对我的字符有问题。utf8和其他格式的字符都用“?”显示。我在列中有这些标题(包括æå)正确的标题是:Virksomhedskode,Afdelingskode,Kode,'Fulde navn',Stillingsbetegnelse,CPR nummer,Bogføringsgruppekode,Fratrædelsesdato,Ansættelssdato,Fratrædelsesdato is='Date',如果我试图将标题改为noneæåååå,似乎有效?有解决方案吗?@KasperM请参阅在我的回答中编辑。有两个与Excel相关的问题需要解决。很抱歉,有点不清楚。xlsx报告中没有引用标题“Fulde navn”。我只是在运行powershell命令时这样做的。很抱歉,保存txt文件似乎更让我吃惊。而且报告是自动生成的,因此如果需要打开文件并保存到txt,我们可以在excel中进行少量替换后,是否可以将文件保存到csv?或者我是否遗漏了什么?谢谢您的帮助。@KasperM否,保存到
Unicode文本(.txt)
保存为CSV,但这是Excel保存为UTF8的唯一方式。与“常规”CSV的唯一区别在于,字段由制表符分隔,而不是逗号。对于PowerShell,这一点都不麻烦。Excel以其蹩脚的导入/导出功能而闻名。每个人都希望能够使用自行选择的deli导出斜接字符和自行选择的编码,但helas,Excel就是它。@KasperM我已再次编辑了答案,并输入代码,直接使用.xlsx文件自动转换。这样,您就不必手动保存Excel文件。
$Path = 'D:\Test\file.xlsx'
Write-Host "Converting file '$Path'"
# convert the Excel file to a temporary TAB-delimited Unicode file
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$workbook = $excel.Workbooks.Open($Path)
$workbook.Worksheets.Item(1).Activate()
# Excel up to and incuding version 2016, has no option to export csv format
# in UTF8 encoding so we save as Unicode Text (*.txt)
# this in fact is a Tab-delimited csv file, normally called '*.tsv', '*.tab' or simply '*.csv'
# as of Excel 2019, you can try $xlCSVUTF8 = 62
$xlUnicodeText = 42 # https://docs.microsoft.com/en-us/office/vba/api/excel.xlfileformat
# save to a file with the same path and name, but a different extension
$tempFile = [System.IO.Path]::ChangeExtension($Path, '.tab' )
$workbook.SaveAs($tempFile, $xlUnicodeText)
$workbook.Close()
$excel.Quit()
# important: cleanup used COM objects
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
Write-Host "Creating new CSV file '$tempFile'"
# read the exported .tab file, adjust the 'Fratrædelsesdato' field and
# save as true CSV file in UTF8 encoding
Import-Csv -Path $tempFile -Delimiter "`t" -Encoding Unicode |
Select-Object 'Virksomhedskode', 'Afdelingskode', 'Kode', 'Fulde navn',
'Stillingsbetegnelse', 'CPR-nummer', 'Bogføringsgruppekode',
@{Name = 'Fratrædelsesdato'; Expression = {
if ([string]::IsNullOrWhiteSpace($_.Fratrædelsesdato)) { 'xxx' }
else { $_.Fratrædelsesdato.Replace('.', '-') }
}}, 'Ansættelsesdato' |
Export-Csv -Path 'D:\Test\new_file.csv' -UseCulture -Encoding UTF8 -NoTypeInformation
# you can now delete the temporary tab-delimited file
Remove-Item $tempFile
Import-Csv -Path 'D:\input.csv' -UseCulture |
Select-Object 'Virksomhedskode', 'Afdelingskode', 'Kode', 'Fulde navn', 'Stillingsbetegnelse', 'CPR-nummer', 'Bogføringsgruppekode', 'Ansættelsesdato',
@{Name = 'Fratrædelsesdato'; Expression = {
if ([string]::IsNullOrWhiteSpace($_.Fratrædelsesdato)) { 'xxx' }
else { $_.Fratrædelsesdato.Replace('.', '-') }
}} |
Export-Csv -Path 'D:\edited.csv' -UseCulture -Encoding utf8 -NoTypeInformation