You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:27:18