我有两台电脑,一台是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。
答案 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版本之间会出现这种情况。