PowerShell Excel ComObject Open 自定义分隔符

3
我在 Powershell Excel ComObject 中遇到了一个问题,即无法接受逗号 , 以外的定界符。一些外部 .csv 文件使用不同的分隔符,例如分号 ;、管道符 | 等等。

所以,有没有解决办法使其接受自定义分隔符?我尝试使用 Import-Csv $fileloop -Delimiter ';',它可以工作。但我希望继续使用 -ComObject 进行处理,因为我的脚本都是使用 ComObject 编写的,并且我需要解析和检查列和行以及一些额外的功能。

下面是打开 .csv 文件以进行进一步处理的相关代码片段:

$path      = "C:\Users\1.csv"
$objexcel  = New-Object -ComObject Excel.Application
$workbook  = $objexcel.Workbook.Open($path)
$worksheet = $workbook.activesheet
$colMax    = ($WorkSheet.UsedRange.Columns).count
$intcolMax = $colMax
$intRowMax = ($WorkSheet.UsedRange.Rows).count
.....

我研究了一些相关主题并进行了测试,但它们都没有起作用:

  1. PowerShell Workbooks.Open 以分号为分隔符
  2. https://kb.paessler.com/en/topic/2293-i-have-trouble-opening-csv-files-with-microsoft-excel-is-there-a-quick-way-to-fix-this

测试结果:
1. 脚本需要具有高可移植性,这意味着脚本将传递给其他用户使用,因此需要避免在 Windows 的区域和语言设置上使用设置方法。
2. 脚本需要处理大量的大型 .csv 文件,因此需要避免使用类似于 Import-Csv $fileloop -Delimiter ';'| Export-Csv $commadelimiteroutput -Delimiter ',' 的方法来重建一个新的逗号分隔的 .csv 文件,然后再使用 ComObject 进行处理。

如果缺少信息或不清楚,请告诉我。


Excel目前是否正在打开所有数据都在第一列的文件?如果是,您可以使用它的text to columns方法来定义自定义分隔符。 - David Rushton
1个回答

1
不要使用Open方法,而是使用OpenText。这允许设置自定义分隔符,但并非必需,因为它也允许使用$true/$false作为一些标准分隔符。
将分号;的参数设置为$true,其他分隔符设置为$false
$objexcel.WorkBooks.OpenText(`
                $path,        # Filename
                2,            # Origin
                1,            # StartRow
                1,            # DataType
                1,            # TextQualifier
                $false,       # ConsecutiveDelimiter
                $false,       # Tab
                $true,        # Semicolon
                $false,       # Comma
                $false,       # Space
                $false,       # Other - $true/$false
                $false,       # OtherChar - specify the character if Other is $true
                @(@(3,3),@(1,2))         # FieldInfo
)

对于 FieldInfo,您可以在这里获取枚举值。我已经使用了与文档示例相同的示例,将列3指定为xlMDYFormat,列1指定为xlTextFormat,但是在PowerShell中实现。

之前尝试过这个解决方案,也尝试了你的代码来替换我当前正在使用的Open方法。不幸的是,代码会停止并抛出异常:(System.Management.Automation.RuntimeException)
  • 错误信息:您无法在空值表达式上调用方法。 对于这个异常有什么想法吗?
- Yong Cai
1
我已经对OpenText进行了一些研究,发现它可能无法直接处理.csv文件扩展名。参考链接:https://stackoverflow.com/questions/27491558/finding-powershell-names-for-excel-features - Yong Cai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接