【问题标题】:Imported .csv file with formulas导入的带有公式的 .csv 文件
【发布时间】:2015-04-14 07:12:38
【问题描述】:

我使用 powershell 导入了一个逗号分隔的 csv 文件。 我被导入并看起来应该如此。问题是,单元格包含公式。 比如=20+50+70。除非我单击顶部字段中的输入,否则不会计算它。 另一个问题是,一些单元格包含像 =50,2+70,5 这样的数字。这些细胞excel根本不明白。它无法计算它们,除非我删除 ,或用点 (.) 替换它。但这不是一种可能。 我该如何解决这个问题? 使用 powershell 导入 csv 文件:

[threading.thread]::CurrentThread.CurrentCulture = 'en-US'
$wbpath=Join-Path "$psscriptroot" 'file.xlsx'
$importcsv=Join-Path "$psscriptroot" 'file.csv'
$xl = New-Object -ComObject Excel.Application
$xl.Visible = $false
$xl.Workbooks.OpenText($importcsv)
$xl.DisplayAlerts = $false
[threading.thread]::CurrentThread.CurrentCulture = 'en-US'
$xl.ActiveWorkbook.SaveAs($wbpath,51)
$xl.Quit()
while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)){'released'}

[threading.thread]::CurrentThread.CurrentCulture = 'en-US'

是必要的,否则我会出错,因为我的系统区域不是我们。

谢谢。

CSV 样本:

name1.name1.name1,"=20","=7,65","=20,01"
name2.name2.name2,"=20+10","=4,96+0,65","=20,01+10"
name3.name3.name3,"=20","=4,96+0,88","=21,01+11"

【问题讨论】:

  • CSV 不包含公式,那么您的意思是某些单元格包含这些字符串吗?我不确定除非我点击顶部字段中的输入 是什么意思。你有一些示例输入和预期输出吗?这将使这更容易确定
  • CSV 文件看起来像这样 Name,=20+20,=20,=1+80,5+9,=20。等等。 Excel 应该解释并计算它。就像我导入 csv ma​​ualle 或手动输入数据一样。顶部字段是指 excel 中的编辑字段,位于顶部。
  • 如果我将它输入到 excel 中,我得到 120,7。这没什么特别的。就像我说的。只有当我使用 powershell 导入它时它才不起作用。
  • 我也遇到了同样的问题。就我而言,我最初是通过使用 Powershell 直接创建 excel 文件开始的。但是,这样做会慢 50 倍以上。使用 Excel 对象时,处理 800 条记录需要 10 分钟。使用 CSV 对象需要几秒钟。我发现在 powershell 中使用 Excel 对象创建超链接是延迟的主要原因。我的解决方法是创建 CSV,将字段设置为“Z = hyperlink(“url”,“text”)”,然后在 Excel 中查找/替换“Z=”到“=”,每次数据都需要完成正在更新。
  • 您可能想尝试将小数点分隔符设置为 ',' (Get-Culture).NumberFormat.NumberDecimalSeparator = ','

标签: excel powershell


【解决方案1】:

听起来你需要

a) 强制工作表计算

b) 如果您要坚持使用en-US 语言环境,那么您需要将这些逗号替换为小数点。这就是 GB/US 标准以及 Excel 将如何解释小数。不过,我强烈建议您坚持设置数据的语言环境。

(未经测试,因为我目前在 Mac 上)

[threading.thread]::CurrentThread.CurrentCulture = 'en-US'
$wbpath=Join-Path "$psscriptroot" 'file.xlsx'
$importcsv=Join-Path "$psscriptroot" 'file.csv'
$xl = New-Object -ComObject Excel.Application
$xl.Visible = $false
$wb = $xl.Workbooks.OpenText($importcsv)
$xl.DisplayAlerts = $false
[threading.thread]::CurrentThread.CurrentCulture = 'en-US'
$sh = $wb.Sheets.Item(1)
# loop through the used range and replace any commas with decimals
foreach ($cell in $sh.usedRange)
{
    [string]$formula = $cell.formula
    $formula -replace ',','.'
    $cell.formula = $formula
}
# force the sheet to calculate
$sh.Calculate()
$xl.ActiveWorkbook.SaveAs($wbpath,51)
$xl.Quit()
while([System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)){'released'}

【讨论】:

    【解决方案2】:

    与上一个答案一样,您必须考虑语言环境;并非所有 .csv 文件都具有相同的格式,具体取决于它们编码的国家/地区语言环境。虽然 UTF 是标准的,但在某些方面 CSV 是一种“传统格式”,即使它是使用纯文本传输数据的最轻量级、最简单的方法。

    山姆已经回答了大部分困难的问题,所以我将添加一些内容。如果您正在制作一个自动化解决方案并与多个国家/地区合作,有几种方法可以确定它的编码方式。你可以走技术更熟练的路线,实现一个类似于https://gist.github.com/jpoehls/2406504 的自定义函数,或者,因为它是一个 CSV,你可以做出一个不错的猜测,因为最常见的编码格式使用不同的分隔符;我相信你提到的那个使用标签作为编码。

    我将重点介绍 Excel 导入中的那些,因为没有提到这些。 “数据”选项卡中有一个相当简洁的功能,可让您根据使用的分隔符自定义导入。在第三步中,当您按下“高级”时,它允许您告诉它源数据正在使用哪个分隔符(逗号或小数),一旦您选择该分隔符并按“完成”,它会将结果转换为您的语言环境设置为对于 Excel 并正确评估函数。 Example picture 因此,工作流程是打开一本新的 Excel 书,选择数据 > 从文本并从那里继续。它会将您选择的语言环境中的文本(在您的情况下可能是 1252)转换为您指定的任何十进制格式。

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多