Powershell 得到 excel 公式结果
Powershell get excel formula result
我在 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 文件,在 A1:A5 处填写了 'X',我想测试它出现了多少次。如果我执行以下操作,我将 return 公式:
$excel = New-Object -ComObject excel.application
$excel.visible = $True
$workbook = $excel.Workbooks.Add()
$sheetDest = $workbook.Worksheets.Item(1)
$sheetDest.Name = "Test for Whosebug"
$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
你可以运行这个确切的代码来测试它,但如果我误解了你的问题,请详细说明。
这应该可以解决问题:
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
我在 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 文件,在 A1:A5 处填写了 'X',我想测试它出现了多少次。如果我执行以下操作,我将 return 公式:
$excel = New-Object -ComObject excel.application
$excel.visible = $True
$workbook = $excel.Workbooks.Add()
$sheetDest = $workbook.Worksheets.Item(1)
$sheetDest.Name = "Test for Whosebug"
$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
你可以运行这个确切的代码来测试它,但如果我误解了你的问题,请详细说明。
这应该可以解决问题:
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