如何使用Apache POI在Word文档中并排放置两个图表?
如何用Apache POI在Word中让两个图表并排显示?
可以实现,核心是通过表格布局控制图表位置——创建1行2列的表格,将饼图和柱状图分别放入两个单元格,即可实现并排效果。直接调用doc.createChart()会把图表作为独立段落插入,默认上下排列,表格是最稳妥的布局控制方式。
以下是修改后的完整代码:
import java.io.FileOutputStream; import org.apache.poi.util.Units; import org.apache.poi.xddf.usermodel.chart.*; import org.apache.poi.xwpf.usermodel.*; public class ChartSideBySide { public static void main(String[] args) throws Exception { // 创建Word文档 XWPFDocument doc = new XWPFDocument(); // 创建1行2列的表格,用于放置两个图表 XWPFTable table = doc.createTable(1, 2); // 设置表格总宽度为20厘米 table.setWidth(20 * Units.EMU_PER_CENTIMETER); // 设置两个单元格等宽,各占10厘米 XWPFTableCell cell1 = table.getRow(0).getCell(0); XWPFTableCell cell2 = table.getRow(0).getCell(1); cell1.setWidth(String.valueOf(10 * Units.EMU_PER_CENTIMETER)); cell2.setWidth(String.valueOf(10 * Units.EMU_PER_CENTIMETER)); // --- 在第一个单元格中创建饼图 --- XWPFParagraph para1 = cell1.getParagraphs().get(0); if (para1 == null) { para1 = cell1.createParagraph(); } XWPFChart severityChart = para1.createChart(10 * Units.EMU_PER_CENTIMETER, 5 * Units.EMU_PER_CENTIMETER); // 饼图数据配置(保留原逻辑) String[] categories = new String[]{"Critical", "High", "Medium","Low","Best Practice"}; Double[] values = new Double[]{1.0, 2.0, 3.0, 4.0, 5.0}; XDDFDataSource<String> categoryDataSource = XDDFDataSourcesFactory.fromArray(categories); XDDFNumericalDataSource<Double> valueDataSource = XDDFDataSourcesFactory.fromArray(values); XDDFPieChartData data = (XDDFPieChartData) severityChart.createData(ChartTypes.PIE, null, null); severityChart.setTitleText("# of Vulnerabilites by Severity"); severityChart.setTitleOverlay(false); XDDFChartData.Series series = data.addSeries(categoryDataSource, valueDataSource); severityChart.plot(data); severityChart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls().addNewShowPercent().setVal(false); severityChart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().addNewShowSerName().setVal(false); severityChart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).getDLbls().setSeparator(" - "); // --- 在第二个单元格中创建柱状图 --- XWPFParagraph para2 = cell2.getParagraphs().get(0); if (para2 == null) { para2 = cell2.createParagraph(); } XWPFChart categoryChart = para2.createChart(10 * Units.EMU_PER_CENTIMETER, 5 * Units.EMU_PER_CENTIMETER); // 柱状图数据配置(保留原逻辑) String[] categories1 = new String[]{"Critical", "High", "Medium","Low","Best Practice"}; Double[] values1 = new Double[]{1.0, 2.0, 3.0, 4.0, 5.0}; XDDFDataSource<String> categoryDataSource1 = XDDFDataSourcesFactory.fromArray(categories1); XDDFNumericalDataSource<Double> valueDataSource1 = XDDFDataSourcesFactory.fromArray(values1); XDDFCategoryAxis categoryAxis = categoryChart.createCategoryAxis(AxisPosition.BOTTOM); XDDFValueAxis valueAxis = categoryChart.createValueAxis(AxisPosition.LEFT); XDDFChartData data1 = categoryChart.createData(ChartTypes.BAR, categoryAxis, valueAxis); XDDFChartData.Series series1 = data1.addSeries(categoryDataSource1, valueDataSource1); series1.setTitle(null); // 标题为必填项,此处设为null categoryChart.plot(data1); // 保存文档 try (FileOutputStream out = new FileOutputStream("chart_side_by_side.docx")) { doc.write(out); } doc.close(); System.out.println("图表已成功并排生成!"); } }
关键修改说明:
- 创建1行2列的表格,通过设置单元格宽度控制两个图表的占比
- 将图表插入到单元格的段落中,而非直接插入文档根节点,让图表被表格约束在同一行的两个单元格内
- 保留原图表的尺寸和数据逻辑,仅调整图表的插入位置
内容的提问来源于stack exchange,提问作者Bharath Naidu Yenumula
相关产品推荐
相关产品推荐

