+-
当我尝试apache poi4.0的项目示例时,遇到创建条形图的问题,运行代码后,我打开xlsx文件,错误为msg
Excel在“ xxx.xlsx”中发现了不可读的内容.您要恢复此工作簿的内容吗?如果您信任工作簿的来源,请单击“是”.
单击是,然后获取另一个消息
Excel能够通过修复或删除不可读的内容来打开文件.
删除的零件:/xl/drawings/drawing1.xml零件(绘图形状).
单击关闭,然后在Excel中未添加图表,但数据很好.
然后,我尝试使用lineChart和scatterChart示例,遇到同样的问题.
此错误的最可能原因是什么?如何解决此问题?
提前致谢. 🙂
Excel在“ xxx.xlsx”中发现了不可读的内容.您要恢复此工作簿的内容吗?如果您信任工作簿的来源,请单击“是”.
单击是,然后获取另一个消息
Excel能够通过修复或删除不可读的内容来打开文件.
删除的零件:/xl/drawings/drawing1.xml零件(绘图形状).
单击关闭,然后在Excel中未添加图表,但数据很好.
然后,我尝试使用lineChart和scatterChart示例,遇到同样的问题.
此错误的最可能原因是什么?如何解决此问题?
提前致谢. 🙂
package org.apache.poi.xssf.usermodel.examples;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.PresetColor;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.AxisCrosses;
import org.apache.poi.xddf.usermodel.chart.AxisPosition;
import org.apache.poi.xddf.usermodel.chart.ChartTypes;
import org.apache.poi.xddf.usermodel.chart.LegendPosition;
import org.apache.poi.xddf.usermodel.chart.XDDFCategoryAxis;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFValueAxis;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class BarChart {
public static void main(String[] args) throws IOException {
try (XSSFWorkbook wb = new XSSFWorkbook()) {
XSSFSheet sheet = wb.createSheet("barchart");
final int NUM_OF_ROWS = 3;
final int NUM_OF_COLUMNS = 10;
// Create a row and put some cells in it. Rows are 0 based.
Row row;
Cell cell;
for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++) {
row = sheet.createRow((short) rowIndex);
for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
cell = row.createCell((short) colIndex);
cell.setCellValue(colIndex * (rowIndex + 1));
}
}
XSSFDrawing drawing = sheet.createDrawingPatriarch();
XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
XSSFChart chart = drawing.createChart(anchor);
XDDFChartLegend legend = chart.getOrAddLegend();
legend.setPosition(LegendPosition.TOP_RIGHT);
// Use a category axis for the bottom axis.
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
XDDFDataSource<Double> xs = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet,
new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
data.addSeries(xs, ys1);
data.addSeries(xs, ys2);
chart.plot(data);
XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.CHARTREUSE));
XDDFChartData.Series firstSeries = data.getSeries().get(0);
XDDFShapeProperties properties = firstSeries.getShapeProperties();
if (properties == null) {
properties = new XDDFShapeProperties();
}
properties.setFillProperties(fill);
firstSeries.setShapeProperties(properties);
// Write the output to a file
try (FileOutputStream fileOut = new FileOutputStream("ooxml-bar-chart.xlsx")) {
wb.write(fileOut);
}
}
}
}
最佳答案
新的XDDF代码缺少在barChart中设置axIds的方法,以及缺少条形方向barDir的设置,条形图的方向可以是COL,条形图可以是BAR.
在/xl/charts/chart1.xml中,如下所示:
<c:barChart>
<c:barDir val="bar"/>
...
<c:axId val="0"/>
<c:axId val="1"/>
</c:barChart>
对于条形图
和
<c:barChart>
<c:barDir val="col"/>
...
<c:axId val="0"/>
<c:axId val="1"/>
</c:barChart>
柱形图.
做添加:
...
chart.plot(data);
chart.getCTChart().getPlotArea().getBarChartArray(0).addNewBarDir().setVal(
//org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir.COL);
org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir.BAR);
chart.getCTChart().getPlotArea().getBarChartArray(0).addNewAxId().setVal(bottomAxis.getId());
chart.getCTChart().getPlotArea().getBarChartArray(0).addNewAxId().setVal(leftAxis.getId());
...
而且至少会起作用.
轴设置也存在其他问题.这就是为什么我说条形图创建(仅使用高级类的Apache Poi)尚未准备好的原因.
点击查看更多相关文章
转载注明原文:Java POI 4.0条形图示例不起作用 - 乐贴网