在 Java 中读取 xlsx 复选框值

Posted

技术标签:

【中文标题】在 Java 中读取 xlsx 复选框值【英文标题】:Reading xlsx checkbox values in Java 【发布时间】:2016-05-13 06:35:51 【问题描述】:

我正在用 Java 读取一个 xlsx 文件,我需要检查一些复选框。现在我正在为此使用 Apache POI,但我看不到如何访问这些复选框(它们是使用开发人员选项卡 -> 插入 -> 表单控件插入到 excel 中的)。

对于 xls 文件,我设法通过以下提示访问它们:Reading Excel checkbox values in Java Apache POI

在 poi how-to 页面 (https://poi.apache.org/spreadsheet/how-to.html) 的“XSSF 和 SAX(事件 API)”部分中,我可以看到如何使用 SAXParser 浏览文档。这样我也可以看到复选框在工作表上,但我无法达到它们的价值。 我有的是这样的:

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

所以复选框在那里,但我不知道它的值...... 有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

您是对的,POI 目前无法读取这些值,因为它需要比现在使用的更新版本的 OOXML 规范(“http://schemas.microsoft.com/office/spreadsheetml/2009/9/main”):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 复选框值的主要内容,如果未能解决你的问题,请参考以下文章

未正确读取复选框值

如何通过 django 读取 excel 文件中的复选框值?

iText - 读取复选框值

读取动态添加的复选框值

如何使用 VBA 从 Excel 用户窗体中读取复选框的值

使用php将复选框状态写入/读取文件