【问题标题】:Powershell - Import csv file into Excel without losing leading zeroesPowershell - 将 csv 文件导入 Excel 而不会丢失前导零
【发布时间】: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


【解决方案1】:

如果您不希望 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"

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 2011-03-11
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多