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

Editing charts in a docx file using docx4j

我正在尝试使用 docx4j 编辑 docx 文件中的图表。我似乎无法增加图表中的行数(如条形图中的条数)。我可以减少行数,效果很好。当我尝试增加行数时,变量中的值被正确更改(代码中的 ctNumvals 和 ctStrVals)。但是当我打开编辑后的文档时,图表只显示原始行数(编辑前),以及我输入的最后一组数据。

代码如下:

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));

变量'data'是一个LinkedHashMap

我发现我做错了什么。

当我创建新柱时,

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);
}