当前位置: 首页 > 知识库问答 >
问题:

使用docx4j编辑docx文件中的图表

戚高洁
2023-03-14
WordprocessingMLPackage template = WordprocessingMLPackage.load(new File(resultFile));

        Chart chart = (Chart) template.getParts().get(new PartName(chartPartName));
        List<Object> objects = chart.getJaxbElement().getChart().getPlotArea()
                .getAreaChartOrArea3DChartOrLineChart();

        //update chart values in doc

        for (Object object : objects) {

            if (object instanceof CTBarChart) {

                List<CTBarSer> ctBarSers = ((CTBarChart) object).getSer();

                for (CTBarSer ctBarSer : ctBarSers) {

                    List<CTNumVal> ctNumVals = ctBarSer.getVal().getNumRef().getNumCache().getPt();
                    List<CTStrVal> ctStrVals = ctBarSer.getCat().getStrRef().getStrCache().getPt();

                    while (data.size() < ctNumVals.size()) {
                        ctNumVals.remove(data.size());
                    }

                    while (data.size() < ctStrVals.size()) {
                        ctStrVals.remove(data.size());
                    }

                    while (data.size() > ctNumVals.size()) {
                        CTNumVal numVal = new CTNumVal();
                        ctNumVals.add(ctNumVals.size(), numVal);
                    }

                    while (data.size() > ctStrVals.size()) {
                        CTStrVal strVal = new CTStrVal();
                        ctStrVals.add(ctStrVals.size(), strVal);
                    }

                    ctBarSer.getVal().getNumRef().getNumCache().getPtCount().setVal(data.size());
                    ctBarSer.getCat().getStrRef().getStrCache().getPtCount().setVal(data.size());

                    for (CTNumVal ctNumVal : ctNumVals) {
                        ctNumVal.setV(valItr.next());
                    }

                    for (CTStrVal ctStrVal : ctStrVals) {
                        ctStrVal.setV(keyItr.next());
                    }
                }
            }
        }
        template.save(new File(resultFile));

共有1个答案

邴和雅
2023-03-14

我已经发现我做错了什么。

当我创建新条时,

while (data.size() > ctNumVals.size()) {
    CTNumVal numVal = new CTNumVal();
    ctNumVals.add(ctNumVals.size(), numVal);
}

while (data.size() > ctStrVals.size()) {
    CTStrVal strVal = new CTStrVal();
    ctStrVals.add(ctStrVals.size(), strVal);
}

默认情况下,新条形图的idx值设置为0。这使得您创建的任何条形图都是图表的第一条形图(覆盖实际的第一条形图)。只需将idx值设置为适当的值,如下所示。

while (data.size() > ctNumVals.size()) {
    CTNumVal numVal = new CTNumVal();
    numVal.setIdx(ctNumVals.size());
    ctNumVals.add(ctNumVals.size(), numVal);
}

while (data.size() > ctStrVals.size()) {
    CTStrVal strVal = new CTStrVal();
    strVal.setIdx(ctStrVals.size());
    ctStrVals.add(ctStrVals.size(), strVal);
}
 类似资料: