使用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)