You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中使用OpenXML无法访问Sheet对象属性的问题咨询

问题:OpenXML SDK中无法访问Sheet对象的属性

我编写了一段PowerShell脚本,用于获取xlsm文档中最后一个工作表的类型:

Add-Type -Path "C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll"
$Document = $null
$Document = [DocumentFormat.OpenXml.Packaging.SpreadsheetDocument]::Open("C:\Users\200207121\Documents\Sandbox\FastPrep_S7_Modified_AVELIA_LZB.xlsm", $false)
$Sheets = $Document.WorkbookPart.Workbook.Sheets
$LastSheet = $Sheets.LastChild
Write-Host $LastSheet.GetType()
$Document.Close()

执行后输出:

DocumentFormat.OpenXml.Spreadsheet.Sheet

确认$LastSheet是Sheet类型,但无法访问官方文档中列出的多数属性,比如执行以下代码:

Write-Host "Type is $($LastSheet.GetType())"
Write-Host "State is $($LastSheet.State)"
Write-Host "state is $($LastSheet.state)"

输出为:

Type is DocumentFormat.OpenXml.Spreadsheet.Sheet
State is
state is

已尝试下载最新版OpenXML包并导入,问题依旧。请问为何无法访问这些属性?是否使用了错误的库、文档过时还是语法有误?


原因分析

在OpenXML SDK中,Sheet对象本身只是工作簿中工作表的引用条目,仅包含工作表的基础元数据(如Name、SheetId、Id),而State这类属性属于工作表的实际内容部分(即Worksheet对象),并非直接存储在Sheet对象里。

解决方法

要访问State等属性,需要通过Sheet对象的Id属性找到对应的WorksheetPart,再从中获取Worksheet对象:

Add-Type -Path "C:\Program Files (x86)\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll"
$Document = [DocumentFormat.OpenXml.Packaging.SpreadsheetDocument]::Open("C:\Users\200207121\Documents\Sandbox\FastPrep_S7_Modified_AVELIA_LZB.xlsm", $false)
$Sheets = $Document.WorkbookPart.Workbook.Sheets
$LastSheet = $Sheets.LastChild

# 获取对应的WorksheetPart
$worksheetPart = $Document.WorkbookPart.GetPartById($LastSheet.Id)
$worksheet = $worksheetPart.Worksheet

# 访问State属性(对应SheetState)
Write-Host "State is $($worksheet.SheetState)"

$Document.Close()

补充说明

  • Sheet的核心作用是关联工作簿与实际工作表内容,它本身不包含工作表的状态、单元格数据等具体信息。
  • 若工作表的状态为默认可见,文档中可能不会显式存储SheetState属性,此时读取结果为空属于正常情况。

内容的提问来源于stack exchange,提问作者Arthur Attout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:25:28