在 Poi Word 中插入图表,可以使用以下步骤:
1. 创建一个空白文档并打开它。
2. 创建一个 XWPFDocument 对象,用于在文档中插入图表。
```java
XWPFDocument document = new XWPFDocument();
```
3. 创建一个 XWPFChart 对象,并设置图表的类型、数据源和标题。
```java
XWPFChart chart = document.createChart(ChartTypes.LINE, new XDDFChartAxisPosition(), new XDDFChartAxisPosition(), 0, 0, 600, 400);
XDDFDataSource<String> xs = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, data[0].length - 1));
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, data[0].length - 1));
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, data[0].length - 1));
chart.setTitleText("Line Chart");
chart.setTitleOverlay(false);
XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) data.addSeries(xs, ys1);
XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) data.addSeries(xs, ys2);
series1.setTitle("Series 1", null);
series2.setTitle("Series 2", null);
chart.plot(data);
```
4. 将图表插入到文档中指定的位置。
```java
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
String blipId = document.addPictureData(new FileInputStream(chartFile), Document.PICTURE_TYPE_PNG);
CTInline inline = run.getCTR().addNewDrawing().addNewInline();
CTGraphicalObject graphicalObject = inline.addNewGraphic();
CTGraphicData graphicData = graphicalObject.addNewGraphicData();
graphicData.setUri(GraphicData.URI_PICTURES + blipId);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
```
其中,chartFile 是保存图表的文件路径。
完整的代码示例:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xddf.usermodel.chart.XDDFChartAxisPosition;
import org.apache.poi.xwpf.usermodel.*;
public class InsertChartExample {
public static void main(String[] args) throws Exception {
// 创建一个空白文档并打开它
XWPFDocument document = new XWPFDocument();
// 创建一个表格,并在其中填充数据
XWPFTable table = document.createTable();
String[][] data = new String[][]{{"Month", "Sales 1", "Sales 2"}, {"Jan", "10.0", "20.0"}, {"Feb", "20.0", "30.0"}, {"Mar", "30.0", "40.0"}};
for (int i = 0; i < data.length; i++) {
XWPFTableRow row = table.getRow(i);
for (int j = 0; j < data[i].length; j++) {
XWPFTableCell cell = row.getCell(j);
if (cell == null) {
cell = row.createCell();
}
cell.setText(data[i][j]);
}
}
// 在表格下面插入一个段落,用于插入图表
XWPFParagraph paragraph = document.createParagraph();
// 创建一个图表,并设置图表的类型、数据源和标题
XWPFChart chart = document.createChart(ChartTypes.LINE, new XDDFChartAxisPosition(), new XDDFChartAxisPosition(), 0, 0, 600, 400);
XSSFChart xssfChart = (XSSFChart) chart.getPackagePart().getPackage().createRelationship(XSSFRelation.CHART, XSSFRelation.NS_SPREADSHEETML, generateChartName(document)).getDocumentPart();
XSSFSheet sheet = xssfChart.getWorkbook().createSheet("Sheet1");
for (int i = 0; i < data.length; i++) {
XSSFRow row = sheet.createRow(i);
for (int j = 0; j < data[i].length; j++) {
XSSFCell cell = row.createCell(j);
if (i == 0) {
cell.setCellValue(data[i][j]);
} else {
cell.setCellValue(Double.parseDouble(data[i][j]));
}
}
}
XDDFDataSource<String> xs = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, data[0].length - 1));
XDDFNumericalDataSource<Double> ys1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, data[0].length - 1));
XDDFNumericalDataSource<Double> ys2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, data[0].length - 1));
chart.setTitleText("Line Chart");
chart.setTitleOverlay(false);
XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
bottomAxis.setTitle("Month");
XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
leftAxis.setTitle("Sales");
XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);
XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) data.addSeries(xs, ys1);
XDDFLineChartData.Series series2 = (XDDFLineChartData.Series) data.addSeries(xs, ys2);
series1.setTitle("Series 1", null);
series2.setTitle("Series 2", null);
chart.plot(data);
// 将图表插入到文档中指定的位置
XWPFRun run = paragraph.createRun();
String blipId = document.addPictureData(new FileInputStream("chart.png"), Document.PICTURE_TYPE_PNG);
CTInline inline = run.getCTR().addNewDrawing().addNewInline();
CTGraphicalObject graphicalObject = inline.addNewGraphic();
CTGraphicData graphicData = graphicalObject.addNewGraphicData();
graphicData.setUri(GraphicData.URI_PICTURES + blipId);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
// 将文档保存到文件中
FileOutputStream out = new FileOutputStream("document.docx");
document.write(out);
out.close();
document.close();
}
private static String generateChartName(XWPFDocument document) {
int i = 1;
while (document.getPackagePart().getRelationshipsByType(XSSFRelation.CHART, XSSFRelation.NS_SPREADSHEETML).size() > 0) {
String name = "Chart" + i;
if (document.getPackagePart().getRelationshipsByType(XSSFRelation.CHART, XSSFRelation.NS_SPREADSHEETML).stream().anyMatch(r -> r.getTargetURI().toString().endsWith(name + ".xml"))) {
i++;
} else {
return name;
}
}
return "Chart1";
}
}
```
其中,chart.png 是保存图表的文件,需要先将图表保存为图片。