使用Apache POI更改XLSX表单控制位置

我有一些包含表单控件的xlsm文件。 我想以编程方式将每个工作表上的特定按钮向下移动几行。 我的第一个希望是做这样的事情:

FileInputStream inputStream = new FileInputStream(new File("t.xlsm"));
XSSFWorkbook wb = new XSSFWorkbook(inputStream);
XSSFSheet xs = (XSSFSheet)wb.getSheetAt(1);
RelationPart rp = xs.getRelationParts().get(0);
XSSFDrawing drawing = (XSSFDrawing)rp.getDocumentPart();

for(XSSFShape sh : drawing.getShapes()){
    XSSFClientAnchor a = (XSSFClientAnchor)sh.getAnchor();
    if (sh.getShapeName().equals("Button 2")) {
        a.setRow1(a.getRow1()+10);
        a.setRow2(a.getRow2()+10);
    }
}

但是,由XSSFDrawing.getShapes()给出的形状对象是副本,并且它们的任何更改都不会在wb.write()之后反映到文档中。

我尝试了其他一些方法,比如获取CTShape和解析XML,但事情很快就会变得多毛。

有没有一种推荐的方式来通过POI管理像这样的表单控件?


我最终直接摆弄XML:

wb = new XSSFWorkbook(new File(xlsmFile));
XSSFSheet s = wb.getSheet("TWO");
XmlObject[] subobj = s.getCTWorksheet().selectPath(declares+
            " .//mc:AlternateContent/mc:Choice/main:controls/mc:AlternateContent/mc:Choice/main:control");

String targetButton = "Button 2";
int rowsDown = 10;

for (XmlObject obj : subobj) {
    XmlCursor cursor = obj.newCursor();
    cursor.push();
    String attrName = cursor.getAttributeText(new QName("name"));
    if (attrName.equals(targetButton)) {
        cursor.selectPath(declares+" .//main:from/xdr:row");
        if (!cursor.toNextSelection()) {
            throw new Exception();
        }
        int newRow = Integer.parseInt(cursor.getTextValue()) + rowsDown;
        cursor.setTextValue(Integer.toString(newRow));

        cursor.pop();
        cursor.selectPath(declares+" .//main:to/xdr:row");
        if (!cursor.toNextSelection()) {
            throw new Exception();
        }
        newRow = Integer.parseInt(cursor.getTextValue()) + rowsDown;
        cursor.setTextValue(Integer.toString(newRow));
    }
    cursor.dispose();
}

这将命名按钮向下移动10行。 我不得不发现按钮名称(这可能不容易通过Excel完成,我直接检查文件)。 我猜这对于使用的Excel版本会非常敏感。

链接地址: http://www.djcxy.com/p/37987.html

上一篇: Changing XLSX form control location with Apache POI

下一篇: In my application not getting proper row number or value .(Apache poi)