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

时间:2015-10-08 12:15:30

标签: excel powershell

我有两台电脑,一台是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

看起来好像在Windows10中value2属性的行为不同,考虑到它是相同版本的excel,这很奇怪。

现在问题: 是否存在将数据导入单元格的修复/解决方法,这不涉及遍历所有单元格。

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

1 个答案:

答案 0 :(得分:0)

因为这对你有用,我会把它充实为答案。总而言之,要注意.text,.value,.value2和.formula [或.formulaR1C1]之间的区别。请参见前面3的讨论:

What is the difference between .text, .value, and .value2?

在这里讨论.Formula:

Can Range.Value2 & Range.Formula have different values in C#, not VBA?

没有弄清楚为什么这些中的任何一个可能具有不同的值(简而言之,格式化和其他元数据可能以不同的方式对某些选项产生影响,具体取决于对给定单元格的条目类型),之后阅读那些Q&如上所述,我只是在提到单元格中的内容时总是使用Formula。在大多数情况下,这也是您可能希望VBA查看的内容。将.value2更改为.formula似乎在这里工作,虽然我不知道为什么Windows版本之间会出现这种情况。