2017-03-28 18 views
0

フォームコントロールを含むいくつかのxlsmファイルがあります。私はプログラム的に各シート上のいくつかの行の特定のボタンを移動したいと思います。Apache POIでXLSXフォームコントロールの位置を変更する

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経由で管理する方法はありますか?

答えて

0

私は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のバージョンに非常に敏感になると思っています。

関連する問題