Windows10上的Excel 2013范围值2的解决方法

我有两台电脑,一台是windows7,一台是windows10。 这两台电脑使用Excel 15.0.4753.1003。

以下脚本在Windows10上失败:

function write-toexcelrange(){ param( #The range should be a cell in the upper left corner where you want to "paste" your data [ValidateNotNullOrEmpty()] $Range, # data should be in the form of a jagged multiarray ("row1Column1","row2column2"),("row2column1","row2column2") # if data is a simple array of values, it will be interpreted as 1 column with multiple rows # Rows can differ in length [validatenotnullorempty()] [array]$data ) $rows=0 $cols=0 if($data -is [array]) { foreach($row in $data){ $rows++ $cols=[math]::max($cols,([array]$row).length) } #Create multiarray $marr=new-object 'string[,]' $rows,$cols for($r=0;$r -lt $marr.GetLength(0);$r++) { for($c=0;$c -lt $marr.GetLength(1);$c++) { $marr[$r,$c]=[string]::Empty } } for($r=0;$r -lt $rows;$r++) { if($data[$r] -is [array]){ for($c=0;$c -lt ([array]$data[$r]).length;$c++) { $marr[$r,$c]=$data[$r][$c].ToString() } } else { $marr[$r,0]=$data[$r].ToString() } } $wrr=$range.resize($rows,$cols) $wrr.value2=$marr } else { $wrr=$range $wrr.value2=$data } #Return the range written to $wrr } $excel = New-Object -ComObject Excel.Application $excel.visible = $true $defaultsheets=$excel.SheetsInNewWorkbook $excel.SheetsInNewWorkbook=1 $wb = $Excel.Workbooks.add() $excel.SheetsInNewWorkbook=$defaultsheets $mysheet = $wb.worksheets.item(1) $mysheet.name = "test" write-toexcelrange -Range $mysheet.range("A1") -data $exceldata|out-null 

有以下错误:

 Unable to cast object of type 'System.String[,]' to type 'System.String'. At C:\data\rangetest.ps1:38 char:9 + $wrr.value2=$marr + ~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], InvalidCastException + FullyQualifiedErrorId : System.InvalidCastException 

看起来,如果value2属性在Windows10中的行为不同,这是奇怪的考虑它是相同版本的Excel。

现在的问题是:是否有一个修复/解决方法来获取数据到单元格,这不涉及到所有的单元格循环。

更新1这是由'Eh'培根等级build议我尝试.Formula属性。 有用! 我还注意到,Windows10使用Powershell v5,而我的Windows7使用Powershell v4。

既然这对你有用,我会把它作为一个答案充实。 总结一下,注意.text,.value,.value2和.formula [或.formulaR1C1]之间的区别。 请参阅这里的第一个3的讨论:

.text,.value和.value2有什么区别?

这里的公式和讨论:

Range.Value2&Range.Formula在C#中有不同的值,而不是VBA?

没有深入了解为什么这些可以有不同的价值(简而言之,格式化和其他元数据可以以不同的方式对某些选项产生影响,取决于给定单元格的inputtypes),在阅读完这些Q&A之后上面,我只是总是使用公式时,指的是在一个单元格内。 在大多数情况下,这就是你想要的VBA。 改变.value2到.formula似乎在这里工作,虽然我不知道为什么这将是Windows版本之间的情况。