मेरे पास कुछ संख्या में 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 प्राप्त करना और एक्सएमएल को पार्स करना, लेकिन चीजें जल्दी से बालों वाली हो गईं।

क्या पीओआई के माध्यम से इस तरह के फॉर्म नियंत्रणों को प्रबंधित करने का कोई अनुशंसित तरीका है?

0
Allen Luce 29 मार्च 2017, 01:21

1 उत्तर

सबसे बढ़िया उत्तर

मैं सीधे एक्सएमएल के साथ झुकाव समाप्त कर दिया:

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 पंक्तियों में नीचे ले जाता है। मुझे बटन का नाम खोजना था (जो एक्सेल के माध्यम से करना आसान नहीं हो सकता है, मैंने सीधे फाइल का निरीक्षण किया)। मैं अनुमान लगा रहा हूँ कि यह प्रयोग में आने वाले एक्सेल के संस्करण के प्रति बहुत संवेदनशील होने वाला है।

0
Allen Luce 1 अप्रैल 2017, 00:53