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();
}
}
然后它需要所有模式的完整jarooxml-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();
}
}
然后它需要所有模式的完整jarooxml-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已经被删除