在Java中读取xlsxcheckbox值

我正在阅读Java中的xlsx文件,我需要检查一些checkbox。 现在我正在使用Apache POI,但是我看不到如何访问这些checkbox(它们使用“开发”选项卡 – >插入 – >窗体控件插入到Excel中)。

对于xls文件,我设法通过以下提示访问它们: 读取Java Apache POI中的Excelcheckbox值

在poi how-to页面( https://poi.apache.org/spreadsheet/how-to.html )的“XSSF和SAX(Event API)”部分中,我可以看到如何使用SAXParser来通过文件。 这样我也可以看到checkbox在工作表上,但我无法得到它们的价值。 我有什么是这样的:

public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); ContentHandler handler = new SheetHandler(); parser.setContentHandler(handler); return parser; } private static class SheetHandler extends DefaultHandler { private boolean inControl; public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if (inControl || "control".equals(localName)) { System.out.print(name + ": "); for (int i = 0; i < attributes.getLength(); i++) { System.out.print(attributes.getQName(i) + "=" + attributes.getValue(i) + "; "); } inControl = true; System.out.println(); } } public void endElement(String uri, String localName, String name) throws SAXException { if (inControl) { if ("control".equals(localName)) { inControl = false; } } } public void characters(char[] ch, int start, int length) throws SAXException { if (inControl) { System.out.println(" value: " + new String(ch, start, length)); } } } 

当我在一个带有两个checkbox的xlsx文件上使用它时,我在控制台中得到以下内容:

 control: shapeId=1025; r:id=rId4; name=Check Box 1; controlPr: defaultSize=0; autoFill=0; autoLine=0; autoPict=0; anchor: moveWithCells=1; from: xdr:col: value: 1 xdr:colOff: value: 371475 xdr:row: value: 1 xdr:rowOff: value: 85725 to: xdr:col: value: 2 xdr:colOff: value: 542925 xdr:row: value: 2 xdr:rowOff: value: 104775 control: shapeId=1026; r:id=rId5; name=Check Box 2; controlPr: defaultSize=0; autoFill=0; autoLine=0; autoPict=0; anchor: moveWithCells=1; from: xdr:col: value: 1 xdr:colOff: value: 323850 xdr:row: value: 3 xdr:rowOff: value: 9525 to: xdr:col: value: 2 xdr:colOff: value: 495300 xdr:row: value: 4 xdr:rowOff: value: 28575 

所以checkbox在那里,但我不知道它的价值…有人可以帮我解决这个问题吗?

您是对的,POI目前无法读取这些值,因为它需要比现在使用的更新版本的OOXML规范(“ http://schemas.microsoft.com/office/spreadsheetml/2009/9/main”):http : //schemas.openxmlformats.org/spreadsheetml/2006/main

手动XMLparsing的关系似乎是从工作表/ sheetX.xml通过工作表/ _rels / sheetX.xml.rels,并从那里到包含实际checked-property的ctrlProps / ctrlPropX.xml。

在sheetX.xml中, control标签中的r:id指向以下关系:

 <mc:AlternateContent> <mc:Choice Requires="x14"> <controls> <mc:AlternateContent> <mc:Choice Requires="x14"> <control name="Check Box 1" r:id="rId3" shapeId="1025"> <controlPr autoFill="0" autoLine="0" autoPict="0" defaultSize="0"> <anchor moveWithCells="1"> <from> <xdr:col>1</xdr:col> <xdr:colOff>190500</xdr:colOff> <xdr:row>0</xdr:row> <xdr:rowOff>171450</xdr:rowOff> 

有了这个ID,你可以通过关系文件来识别相关的ctrlProp.xml文件:

 <Relationship Id="rId3" Target="../ctrlProps/ctrlProp1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp"/> 

通过这个,你可以../ctrlProps/ctrlProp1.xml包含checked-status的文件../ctrlProps/ctrlProp1.xml

 <formControlPr xmlns="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" checked="Checked" lockText="1" noThreeD="1" objectType="CheckBox"/>