【发布时间】:2022-11-17 07:52:21
【问题描述】:
我正在尝试将 csv 文件导入 Excel。有很多关于如何执行此操作的示例,其中大多数都是让您在 excel 中打开 csv,然后将数据复制出来,然后将其粘贴到工作簿中您想要的任何位置。我正在这样做并且效果很好......直到你有一个列,其中有带前导零的字段并且 Excel 截断前导零,所以我添加了一个命令来设置零的数量: $sh1_wb1.Range("L:L").NumberFormat = "000000000"
这似乎工作得很好......但是当另一个系统正在处理此工作表时,它看不到前导零。当我打开工作表并单击该字段时,前导零丢失了。 (另一个系统看到的是单元格中的实际值,而不是显示的值。)
换句话说,即使我看到: 000012345,当我实际点击单元格时,它显示那里是12345。
我知道发生的事情是,当我在 excel 中打开 .csv(进行复制)时,excel 会删除前导零。这只是 Excel 所做的事情。
我尝试通过遍历所有单元格并从 .csv 文件中单独移动它们来构建 Excel 工作表,但该过程非常缓慢。这是我用来执行此操作的代码。它有效,但每个 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 的唯一方法是将其作为数据源连接到它,并在导入它之前,将其转换为该列文本。
有谁知道是否可以使用 PowerShell 将某些列的格式值修改为 Import Text into Excel?
非常感谢您的任何建议或帮助!
【问题讨论】:
-
我有 VBA 代码可以导入 Excel 损坏的“日期”数据。我将尝试使用前导零,看看它是否有效,然后发布代码。不幸的是,这只会在几个小时内发生。
-
创建 csv 文件,在其中使用
TAB字符(PowerShell 中的"`t")作为这些值的前缀。 Excel 将按原样保留它们并将其视为文本
标签: excel powershell csv