2015-01-02 3 views
1

Я пытаюсь редактировать диаграммы в файле docx с помощью docx4j. Я не могу увеличить количество строк (как, например, количество баров в гистограмме) в диаграмме. Я могу уменьшить количество строк, что отлично работает. Когда я пытаюсь увеличить количество строк, значения в переменных изменяются корректно (ctNumvals и ctStrVals в коде). Но когда я открываю отредактированный документ, на диаграмме отображается только исходное количество строк (до редактирования), с последними наборами данных, которые я ввел.Редактирование диаграмм в файле docx с использованием docx4j

Вот код:

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

Переменная «данные» является LinkedHashMap

ответ

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

благодарит за публикацию ответа – GBP

 Смежные вопросы

  • Нет связанных вопросов^_^