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
相关产品推荐
相关产品推荐

