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

时间:2015-01-02 07:30:18

标签: bar-chart 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

1 个答案:

答案 0 :(得分:2)

我发现了我做错了什么。

当我创建新栏时,

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