【问题标题】:Powershell get excel formula resultPowershell获取excel公式结果
【发布时间】:2020-03-23 03:31:25
【问题描述】:

我在 powershell 脚本中使用 excel COM 对象,我想在单元格中插入公式(可能格式化单元格,因为它可以是文本格式而不是常规格式),然后获取公式结果并插入此结果(作为文本)在另一个单元格中。

我的问题是我无法将单元格重新格式化为一般格式,因此我只能将公式作为纯文本获取。

到目前为止我已经尝试过:

$elecFormula1 = "=...Some valid and tested formula"
$sheetDest.Cells.Item($dummyCellX, $dummyCellY).NumberFormat = "General" # This throws an error
$sheetDest.Cells.Item($dummyCellX, $dummyCellY).Formula = $elecFormula1
$key = "" + $sheetDest.Cells.Item($dummyCellX, $dummyCellY).Value2
$sheetDest.Cells.Item($i, 2) = $key

【问题讨论】:

  • 现在,作为一种临时解决方案,我将公式单元格放置在不应该有任何格式的远处,但这不是一个理想的解决方案(特别是如果有人格式化整个工作表)跨度>

标签: excel powershell com


【解决方案1】:

这应该可以解决问题:

Add-Type -AssemblyName Microsoft.Office.Interop.Excel

$excel               = New-Object -ComObject Excel.Application
$excel.Visible       = $True
$excel.DisplayAlerts = $False 

$workbook            = $excel.Workbooks.Open( "C:\Users\myUser\Desktop\test.xlsx", [System.Type]::Missing, $false ) 

$worksheet = $workbook.WorkSheets.item(1)
[void]$worksheet.activate()

$worksheet.Range("A1").NumberFormat = ""
$worksheet.Range("A1").NumberFormat = $worksheet.Range("A1").NumberFormatLocal # "General" or "Standard"
$worksheet.Range("A1").Formula = "=1+1"

$result = $worksheet.Range("A1").value2

$result

[void]$workbook.Close( $false ) 
[void]$excel.Quit() 

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null

【讨论】:

  • 所以解决方案是“常规”格式可以是“标准”,具体取决于当地人?有没有办法强迫一个本地人?我已经遇到了公式分隔符(“,”或“;”)的问题
  • 公式必须设置为英文格式!例如。 sverweis => vlookup。由于某些原因,单元格格式不同,有时是“常规”,有时是“标准”。首先清除格式,然后使用 NumberFormatLocal 检查正确的术语“常规”或“标准”
【解决方案2】:

假设我有一个 Excel 文件,在 A1:A5 处填写了“X”,并想测试它发生了多少次。如果我执行以下操作,我将返回公式:

$excel = New-Object -ComObject excel.application 
$excel.visible = $True
$workbook = $excel.Workbooks.Add()
$sheetDest = $workbook.Worksheets.Item(1)
$sheetDest.Name = "Test for StackOverflow"
$row = 0
$column = 1
for($i = 0; $i -le 4; $i++){
    $row++
    $sheetDest.Cells.Item($row,$column) = "X"
}
$formula = '=COUNTIF(A1:A5,"X")'
$sheetDest.Cells.Item(6,1) = $formula
$fieldValue = $sheetDest.Cells.Item(6,1).value2
$formula = $sheetDest.Cells.Item(6,1).Formula
Write-Host "Value is $fieldValue"
Write-Host "Formula is $formula"

它会为你写出公式和值!然后可以使用以下方法在其他位置设置该值:

$sheetDest.Cells.Item($someRow,$someColumn) = $fieldValue

你可以运行这个确切的代码来测试它,但如果我误解了你的问题,请详细说明。

【讨论】:

  • 对不起,如果我不清楚,英语不是我的母语。我的问题更多是单元格格式,因为我将大部分工作表格式化为文本,但我想重新格式化一些特定的单元格以输入公式。但是,当我尝试设置“常规”格式时出现错误。请参阅@f6a4 答案,我认为这是我搜索的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
相关资源
最近更新 更多