我正在尝试将CSV文件导入Excel。有很多关于如何做到这一点的例子,其中大多数都是你在Excel中打开CSV,然后复制数据,然后粘贴到工作簿中,无论你想要它。我正在这样做,而且效果很好……直到您有一个列,其中有带前导零的字段,并且Excel截断前导零,所以我添加了一个命令来设置零的数量:
$sh1_wb1.Range("L:L").NumberFormat = "000000000"
这似乎工作得很好…但是当这个工作表被另一个系统处理时,它看不到前导零。当我打开工作表并单击进入字段时,前导零丢失了。(另一个系统看到单元格中的实际值,而不是显示的值。)
换句话说,即使我看到:000012345
,当我点击单元格时,它显示的是12345
我知道发生了什么是,当我在Excel中打开。csv(做复制),Excel放弃前导零。这只是Excel做的一件事。
我试过通过循环所有单元格并从.csv文件中单独移动它们来构建Excel表,但这个过程非常缓慢。这是我用来做这件事的代码。它可以工作,但每一行需要大约5秒,我每个工作表有大约30,000行(进入一个需要大约15个选项卡填充的Excel,每个选项卡有30,000行),所以即使它工作,也需要大约41个小时来处理一个工作表。:
(
$inputfile = $csvpath
$outputfile = $xlpath
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$wb = $excel.Workbooks.Add()
$ws = $wb.Sheets.Item(1)
$ws.Cells.NumberFormat = "@"
write-host "Opening $inputfile"
$i = 1
Import-Csv $inputfile | Foreach-Object {
$j = 1
foreach ($prop in $_.PSObject.Properties)
{
if ($i -eq 1) {
$ws.Cells.Item($i, $j).value = $prop.Name
} else {
$ws.Cells.Item($i, $j).value = $prop.Value
}
$j++
}
$i++
}
$wb.SaveAs($outputfile,51)
$wb.Close()
$excel.Quit()
write-output "Success"
我发现的唯一方法是有效地(手动)将带有前导零的数值的。csv文件"正确地"导入Excel;是作为数据源连接到它,在导入它之前,将它转换为使该列成为Text。
有没有人知道,如果一个导入文本到Excel,与修改格式值的某些列可以使用PowerShell?
非常感谢您的任何建议或帮助!
如果您不希望Excel将值视为数字(忘记格式,格式只是用于显示目的而不是用于实际值),您可以在粘贴数据之前将列的NumberFormat
设置为文本,然后它不会剥离任何前导零。比如:
$inputfile = $csvpath
$outputfile = $xlpath
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$wb = $excel.Workbooks.Add()
$ws = $wb.Sheets.Item(1)
$ws.Cells.NumberFormat = "@"
write-host "Opening $inputfile"
$i = 1
Import-Csv $inputfile|ConvertTo-Csv -NoTypeInformation -Delimiter "`t"|clip
$excel.ActiveCell.PasteSpecial()
$wb.SaveAs($outputfile,51)
$wb.Close()
$excel.Quit()
write-output "Success"