java-ApachePOI绘图区域,具有多个图表

java-ApachePOI绘图区域,具有多个图表,java,apache-poi,powerpoint,openxml,xslf,Java,Apache Poi,Powerpoint,Openxml,Xslf,我正在尝试使用PowerPoint文件作为模板来生成另一个PowerPoint,以替换carts数据。为了保持模板的外观尽可能相似,我只是尝试替换需要替换的数据,复制图表第一个CT*Ser中的所有其他数据。当绘图区域内只有一个图表时,大多数图表(目前我对饼图、条形图和折线图感兴趣)都可以正常工作 当打印区域有多个图表时(在我的例子中,是一个包含多个系列的条形图和一个只有一个系列的折线图),似乎有问题,Microsoft PowerPoint无法打开该文件或其一部分,因为它似乎处于管理状态 为了实

我正在尝试使用PowerPoint文件作为模板来生成另一个PowerPoint,以替换carts数据。为了保持模板的外观尽可能相似,我只是尝试替换需要替换的数据,复制图表第一个
CT*Ser
中的所有其他数据。当绘图区域内只有一个图表时,大多数图表(目前我对饼图、条形图和折线图感兴趣)都可以正常工作

当打印区域有多个图表时(在我的例子中,是一个包含多个系列的条形图和一个只有一个系列的折线图),似乎有问题,Microsoft PowerPoint无法打开该文件或其一部分,因为它似乎处于管理状态

为了实现这一点,我对每个图表和图表类型执行以下代码(graph是我用来在模板文件中保留引用的对象)

if(graph.getType().equals(ctrea3dchart.class.getName()){
CTArea3DChart c=plot.getArea3DChartArray()[graph.getIndex()];
int removeSeries=c.getSerray().length;
对于(int s=0;s0;
如果(删除){
int cntDlbls=ser.getDLbls().getDLblArray().length;
对于(int d=0;d
总结:

  • 克隆第一个CT*Ser
  • 更换idx、订单和tx
  • 如果CT*Ser中有带有DLbl标签的DLbl,我移除DLbl,然后添加它们,并将delete设置为true
  • 修改Cat;
  • 如果类别都是数值,我使用NumRefs,else strefs
  • 修改Val
  • 删除以前的系列
  • 我也更改了后台Excel资源,只使用数据来构建图形(在绘图区域中,每个图形一张纸)。我也检查了对单元格和单元格范围的引用,它们都正常

    我使用以下软件检查了生成的文件,并报告了结果:

    • 自由行办公室(如我所料)
    • Onlyoffice(工作正常,但似乎不支持每个绘图区域的多个图表?)
    • Microsoft Powerpoint desktop(打开文件时出错,尝试还原,但失败,无法从错误的幻灯片加载幻灯片内容)
    • Microsoft Powerpoint online(不打开该文件)
    是否有一种相对简单的方法来验证powerpoint文件并查找阻止该文件使用powerpoint的错误?有没有办法可靠地诊断这些问题?在linux上工作

    模板文件已使用Powerpoint创建。如果我没有报告软件版本,我很抱歉,但我不记得了
    if (graph.getType().equals(CTArea3DChart.class.getName())) {
        CTArea3DChart c = plot.getArea3DChartArray()[graph.getIndex()];
        int removeSeries = c.getSerArray().length;
        for (int s = 0; s < graph.getSeries().size(); s++) {
            CTAreaSer ser = (CTAreaSer) c.getSerArray(0).copy();
            ser.getIdx().setVal(s);
            ser.getOrder().setVal(s);
            //ser.unsetSpPr();
            Serie serie = graph.getSeries().get(s);
            boolean delete = ser.isSetDLbls() && ser.getDLbls().getDLblArray().length > 0;
            if (delete) {
                int cntDlbls = ser.getDLbls().getDLblArray().length;
                for (int d = 0; d < cntDlbls; d++) {
                    ser.getDLbls().removeDLbl(0);
                }
            }
            ser.unsetTx();
            CTStrRef serTitle = ser.addNewTx().addNewStrRef();
            serTitle.setF(graph.getSheetName() + "!$" + (char) ('B' + s) + "$1");
            CTStrData serTitleData = serTitle.addNewStrCache();
            serTitleData.addNewPtCount().setVal(1);
            CTStrVal serTitleDataVal = serTitleData.addNewPt();
            serTitleDataVal.setIdx(0);
            serTitleDataVal.setV(serie.getTitle());
            // Cat
            CTAxDataSource cat = ser.getCat();
            if (cat.isSetNumRef()) {
                cat.unsetNumRef();
            }
            if (cat.isSetStrRef()) {
                cat.unsetStrRef();
            }
            if (serie.isNumericCategories()) {
                CTNumRef numRef = cat.addNewNumRef();
                numRef.setF(graph.getSheetName() + "!$A$2:$A$" + (serie.getCategories().size() + 1));
                CTNumData data = numRef.addNewNumCache();
                data.setFormatCode("General");
                CTUnsignedInt cnt = data.addNewPtCount();
                cnt.setVal(serie.getCategories().size());
                int r = 0;
                for (String v : serie.getCategories()) {
                    CTNumVal pt = data.addNewPt();
                    pt.setIdx(r++);
                    pt.setV(StringUtils.isBlank(v) ? "0" : v);
                    if (delete) {
                        CTDLbl dlbl = ser.getDLbls().addNewDLbl();
                        dlbl.addNewIdx().setVal(r - 1);
                        dlbl.addNewDelete().setVal(true);
                    }
                }
            }
            else {
                CTStrRef strRef = cat.addNewStrRef();
                strRef.setF(graph.getSheetName() + "!$A$2:$A$" + (serie.getCategories().size() + 1));
                CTStrData data = strRef.addNewStrCache();
                CTUnsignedInt cnt = data.addNewPtCount();
                cnt.setVal(serie.getCategories().size());
                int r = 0;
                for (String v : serie.getCategories()) {
                    CTStrVal pt = data.addNewPt();
                    pt.setIdx(r++);
                    pt.setV(v);
                    if (delete) {
                        CTDLbl dlbl = ser.getDLbls().addNewDLbl();
                        dlbl.addNewIdx().setVal(r - 1);
                        dlbl.addNewDelete().setVal(true);
                    }
                }
            }
            // Values
            CTNumDataSource val = ser.getVal();
            val.unsetNumRef();
            CTNumRef numRef = val.addNewNumRef();
            char letter = (char) ('B' + s);
            numRef.setF(graph.getSheetName() + "!$" + letter + "$2:$" + letter + "$" + (serie.getValues().size() + 1));
            CTNumData data = numRef.addNewNumCache();
            data.setFormatCode("General");
            CTUnsignedInt cnt = data.addNewPtCount();
            cnt.setVal(serie.getValues().size());
            int r = 0;
            for (String v : serie.getValues()) {
                CTNumVal pt = data.addNewPt();
                pt.setIdx(r++);
                pt.setV(StringUtils.isBlank(v) ? "0" : v);
            }
            c.addNewSer().set(ser);
        }
        for (int s = 0; s < removeSeries; s++) {
            c.removeSer(0);
        }
    }