Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApachePOI只支持散点图和折线图为什么?_Java_Excel_Charts_Apache Poi - Fatal编程技术网

Java ApachePOI只支持散点图和折线图为什么?

Java ApachePOI只支持散点图和折线图为什么?,java,excel,charts,apache-poi,Java,Excel,Charts,Apache Poi,我发现默认情况下,apachepoi只支持LineChart和scatterchart 问题: 如何在电子表格中添加其他图表类型 在这方面有什么想法或帮助吗?或者apache只支持这两种类型的图表有什么原因。ApachePOI也提供了POIooXML模式。这是基于XML的office文档的底层对象。因此,只要不在更高级别提供这些对象,就可以尝试直接使用这些对象来解决他的需求。问题是这些对象的文档。据我所知没有。但是有 因此,根据现有图表示例中的XSSFChart,我们可以得到CTChart,然后

我发现默认情况下,
apachepoi
只支持
LineChart
scatterchart

问题: 如何在电子表格中添加其他图表类型


在这方面有什么想法或帮助吗?或者apache只支持这两种类型的图表有什么原因。

ApachePOI也提供了
POIooXML模式。这是基于
XML
的office文档的底层对象。因此,只要不在更高级别提供这些对象,就可以尝试直接使用这些对象来解决他的需求。问题是这些对象的文档。据我所知没有。但是有

因此,根据现有图表示例中的
XSSFChart
,我们可以得到
CTChart
,然后在对象之间使用shimmy up

首先直接使用
Excel
创建一个简单的
*.xlsx
文件,并查看其
XML
内容是很有帮助的。在那里我们可以得到所需对象的提示。为此,我们可以使用
ZIP
软件简单地解压
*.xlsx

在本例中,在
Excel
中创建一个包含一张工作表和最简单饼图的工作簿。解压缩
*.xlsx
并查看
/xl/charts/chart1.xml

饼图示例:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFChart;

import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;


public class PieChart {

    public static void main(String[] args) throws Exception {
        Workbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("Sheet1");

        Row row;
        Cell cell;
        for (int r = 0; r < 3; r++) {
            row = sheet.createRow(r);
            cell = row.createCell(0);
            cell.setCellValue("S" + r);
            cell = row.createCell(1);
            cell.setCellValue(r+1);
        }

        Drawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 5, 20);

        Chart chart = drawing.createChart(anchor);

        CTChart ctChart = ((XSSFChart)chart).getCTChart();
        CTPlotArea ctPlotArea = ctChart.getPlotArea();
        CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
        CTBoolean ctBoolean = ctPieChart.addNewVaryColors();
        ctBoolean.setVal(true);
        CTPieSer ctPieSer = ctPieChart.addNewSer();

        ctPieSer.addNewIdx().setVal(0);     

        CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
        CTStrRef ctStrRef = cttAxDataSource.addNewStrRef();
        ctStrRef.setF("Sheet1!$A$1:$A$3"); 
        CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
        CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
        ctNumRef.setF("Sheet1!$B$1:$B$3"); 

System.out.println(ctChart);

        FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
        wb.write(fileOut);
        fileOut.close();
    }
}

然后它需要所有模式的完整jar
ooxml-schemas-1.4.jar

apachepoi还提供了
poiooxml模式
。这是基于
XML
的office文档的底层对象。因此,只要不在更高级别提供这些对象,就可以尝试直接使用这些对象来解决他的需求。问题是这些对象的文档。据我所知没有。但是有

因此,根据现有图表示例中的
XSSFChart
,我们可以得到
CTChart
,然后在对象之间使用shimmy up

首先直接使用
Excel
创建一个简单的
*.xlsx
文件,并查看其
XML
内容是很有帮助的。在那里我们可以得到所需对象的提示。为此,我们可以使用
ZIP
软件简单地解压
*.xlsx

在本例中,在
Excel
中创建一个包含一张工作表和最简单饼图的工作簿。解压缩
*.xlsx
并查看
/xl/charts/chart1.xml

饼图示例:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFChart;

import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef;


public class PieChart {

    public static void main(String[] args) throws Exception {
        Workbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet("Sheet1");

        Row row;
        Cell cell;
        for (int r = 0; r < 3; r++) {
            row = sheet.createRow(r);
            cell = row.createCell(0);
            cell.setCellValue("S" + r);
            cell = row.createCell(1);
            cell.setCellValue(r+1);
        }

        Drawing drawing = sheet.createDrawingPatriarch();
        ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 5, 20);

        Chart chart = drawing.createChart(anchor);

        CTChart ctChart = ((XSSFChart)chart).getCTChart();
        CTPlotArea ctPlotArea = ctChart.getPlotArea();
        CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
        CTBoolean ctBoolean = ctPieChart.addNewVaryColors();
        ctBoolean.setVal(true);
        CTPieSer ctPieSer = ctPieChart.addNewSer();

        ctPieSer.addNewIdx().setVal(0);     

        CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
        CTStrRef ctStrRef = cttAxDataSource.addNewStrRef();
        ctStrRef.setF("Sheet1!$A$1:$A$3"); 
        CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
        CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
        ctNumRef.setF("Sheet1!$B$1:$B$3"); 

System.out.println(ctChart);

        FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
        wb.write(fileOut);
        fileOut.close();
    }
}
然后它需要所有模式的完整jar
ooxml-schemas-1.4.jar

接下来我得到了这个结果,它给出了在librecalc中显示的饼图的原始结果

public static void pieChart(SXSSFSheet sheet) {
    Row row;
    Cell cell;
    for (int r = 0; r < 3; r++) {
       row = sheet.createRow(r);
       cell = row.createCell(0);
       cell.setCellValue("S" + r);
       cell = row.createCell(1);
       cell.setCellValue(r+1);
   }

   Drawing drawing = sheet.createDrawingPatriarch();
   ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 5, 20);

   Chart chart = drawing.createChart(anchor);

   CTChart ctChart = ((XSSFChart)chart).getCTChart();
   CTPlotArea ctPlotArea = ctChart.getPlotArea();
   CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
   CTBoolean ctBoolean = ctPieChart.addNewVaryColors();   
   ctBoolean.setVal(true);


   for (int r = 1; r < 4; r++) {
       CTPieSer ctPieSer = ctPieChart.addNewSer();
       CTSerTx ctSerTx = ctPieSer.addNewTx();
       CTStrRef ctStrRef = ctSerTx.addNewStrRef();
       ctStrRef.setF("Sheet1!$A$" + r);
       ctPieSer.addNewIdx().setVal(r-2);
       CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
       ctStrRef = cttAxDataSource.addNewStrRef();
       ctStrRef.setF("Sheet1!$A$1:$A$3");
       CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
       CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
       ctNumRef.setF("Sheet1!$B$1:$B$3");

    //at least the border lines in Libreoffice Calc ;-)

 ctPieSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});
    }
}
公共静态空隙率图表(SXSSF表){
行行;
细胞;
对于(int r=0;r<3;r++){
行=表。创建行(r);
cell=row.createCell(0);
cell.setCellValue(“S”+r);
cell=row.createCell(1);
cell.setCellValue(r+1);
}
Drawing=sheet.createDrawingParhical();
ClientAnchor-anchor=drawing.createAnchor(0,0,0,0,5,5,20);
图表=绘图。创建图表(锚定);
CTChart CTChart=((XSSFChart)chart).getCTChart();
CTPlotArea CTPlotArea=ctChart.getPlotArea();
CTPieChart CTPieChart=ctPlotArea.addNewPieChart();
CTBoolean CTBoolean=ctPieChart.addNewVaryColors();
ctBoolean.setVal(true);
对于(int r=1;r<4;r++){
CTPieSer=ctPieChart.addNewSer();
CTSerTx CTSerTx=ctPieSer.addNewTx();
CTStrRef CTStrRef=ctSerTx.addNewStrRef();
ctstref.setF(“Sheet1!$A$”+r);
ctPieSer.addNewIdx().setVal(r-2);
CTAxDataSource cttAxDataSource=ctPieSer.addNewCat();
ctStrRef=cttAxDataSource.addNewStrRef();
ctstref.setF(“Sheet1!$A$1:$A$3”);
CTNumDataSource CTNumDataSource=ctPieSer.addNewVal();
CTNumRef CTNumRef=ctNumDataSource.addNewNumRef();
ctNumRef.setF(“Sheet1!$B$1:$B$3”);
//至少Libreoffice Calc中的边界线;-)
ctPieSer.addnewspr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{0,0,0});
}
}
Ubuntu16.04/POI 3.17/jdk 8

更近一步,我得到了一个饼图的原始结果,饼图显示在librecalc中

public static void pieChart(SXSSFSheet sheet) {
    Row row;
    Cell cell;
    for (int r = 0; r < 3; r++) {
       row = sheet.createRow(r);
       cell = row.createCell(0);
       cell.setCellValue("S" + r);
       cell = row.createCell(1);
       cell.setCellValue(r+1);
   }

   Drawing drawing = sheet.createDrawingPatriarch();
   ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 5, 20);

   Chart chart = drawing.createChart(anchor);

   CTChart ctChart = ((XSSFChart)chart).getCTChart();
   CTPlotArea ctPlotArea = ctChart.getPlotArea();
   CTPieChart ctPieChart = ctPlotArea.addNewPieChart();
   CTBoolean ctBoolean = ctPieChart.addNewVaryColors();   
   ctBoolean.setVal(true);


   for (int r = 1; r < 4; r++) {
       CTPieSer ctPieSer = ctPieChart.addNewSer();
       CTSerTx ctSerTx = ctPieSer.addNewTx();
       CTStrRef ctStrRef = ctSerTx.addNewStrRef();
       ctStrRef.setF("Sheet1!$A$" + r);
       ctPieSer.addNewIdx().setVal(r-2);
       CTAxDataSource cttAxDataSource = ctPieSer.addNewCat();
       ctStrRef = cttAxDataSource.addNewStrRef();
       ctStrRef.setF("Sheet1!$A$1:$A$3");
       CTNumDataSource ctNumDataSource = ctPieSer.addNewVal();
       CTNumRef ctNumRef = ctNumDataSource.addNewNumRef();
       ctNumRef.setF("Sheet1!$B$1:$B$3");

    //at least the border lines in Libreoffice Calc ;-)

 ctPieSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0});
    }
}
公共静态空隙率图表(SXSSF表){
行行;
细胞;
对于(int r=0;r<3;r++){
行=表。创建行(r);
cell=row.createCell(0);
cell.setCellValue(“S”+r);
cell=row.createCell(1);
cell.setCellValue(r+1);
}
Drawing=sheet.createDrawingParhical();
ClientAnchor-anchor=drawing.createAnchor(0,0,0,0,5,5,20);
图表=绘图。创建图表(锚定);
CTChart CTChart=((XSSFChart)chart).getCTChart();
CTPlotArea CTPlotArea=ctChart.getPlotArea();
CTPieChart CTPieChart=ctPlotArea.addNewPieChart();
CTBoolean CTBoolean=ctPieChart.addNewVaryColors();
ctBoolean.setVal(true);
对于(int r=1;r<4;r++){
CTPieSer=ctPieChart.addNewSer();
CTSerTx CTSerTx=ctPieSer.addNewTx();
CTStrRef CTStrRef=ctSerTx.addNewStrRef();
ctstref.setF(“Sheet1!$A$”+r);
ctPieSer.addNewIdx().setVal(r-2);
CTAxDataSource cttAxDataSource=ctPieSer.addNewCat();
ctStrRef=cttAxDataSource.addNewStrRef();
ctstref.setF(“Sheet1!$A$1:$A$3”);
CTNumDataSource CTNumDataSource=ctPieSer.addNewVal();
CTNumRef CTNumRef=ctNumDataSource.addNewNumRef();
ctNumRef.setF(“Sheet1!$B$1:$B$3”);
//至少Libreoffice Calc中的边界线;-)
ctPieSer.addnewspr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(新字节[]{0,0,0});
}
}

ubuntu 16.04/POI 3.17/jdk 8

从ApachePOI 4.0.0开始,XSSF中的线条图和散点图已经被移动到一个新的XDDF组件中,其中XSLF中的条形图和PieChart已经被删除