读取 Java 中的 xlsx 复选框值
Reading xlsx checkbox values in Java
我正在 Java 中读取 xlsx 文件,我需要选中一些复选框。现在我正在为此使用 Apache POI,但我看不到如何访问这些复选框(使用开发人员选项卡 -> 插入 -> 表单控件将它们插入 excel)。
对于 xls 文件,我设法通过以下提示访问它们:Reading Excel checkbox values in Java Apache POI
在 poi 操作方法页面 (https://poi.apache.org/spreadsheet/how-to.html) 的 "XSSF and SAX (Event API)" 部分,我可以看到如何使用 SAXParser 浏览文档。这样我也可以看到 sheet 上的复选框,但我无法获取它们的值。
我有的是:
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));
}
}
}
当我在带有两个复选框的 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
所以复选框在那里,但我不知道它的值...
有人可以帮我解决这个问题吗?
你是对的,POI 目前无法读取这些值,因为它需要更新版本的 OOXML 规范 ("http://schemas.microsoft.com/office/spreadsheetml/2009/9/main") than used right now: http://schemas.openxmlformats.org/spreadsheetml/2006/main
手动 XML 解析的关系似乎是从 worksheets/sheetX.xml 通过 worksheets/_rels/sheetX.xml.rels 然后从那里到 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
其中包含检查状态:
<formControlPr xmlns="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
checked="Checked" lockText="1" noThreeD="1" objectType="CheckBox"/>
我正在 Java 中读取 xlsx 文件,我需要选中一些复选框。现在我正在为此使用 Apache POI,但我看不到如何访问这些复选框(使用开发人员选项卡 -> 插入 -> 表单控件将它们插入 excel)。
对于 xls 文件,我设法通过以下提示访问它们:Reading Excel checkbox values in Java Apache POI
在 poi 操作方法页面 (https://poi.apache.org/spreadsheet/how-to.html) 的 "XSSF and SAX (Event API)" 部分,我可以看到如何使用 SAXParser 浏览文档。这样我也可以看到 sheet 上的复选框,但我无法获取它们的值。 我有的是:
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));
}
}
}
当我在带有两个复选框的 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
所以复选框在那里,但我不知道它的值... 有人可以帮我解决这个问题吗?
你是对的,POI 目前无法读取这些值,因为它需要更新版本的 OOXML 规范 ("http://schemas.microsoft.com/office/spreadsheetml/2009/9/main") than used right now: http://schemas.openxmlformats.org/spreadsheetml/2006/main
手动 XML 解析的关系似乎是从 worksheets/sheetX.xml 通过 worksheets/_rels/sheetX.xml.rels 然后从那里到 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
其中包含检查状态:
<formControlPr xmlns="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
checked="Checked" lockText="1" noThreeD="1" objectType="CheckBox"/>