我正在尝试使用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
答案 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);
}