导入csv文件到Excel中,不丢失前导零



我正在尝试将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"

相关内容

  • 没有找到相关文章

最新更新