POI_4.1.0 word模板导出 柱状图、折线图、饼图等等图表

1. 这几个概念一定要搞清楚

  本文主要介绍通过POI_4.1.0导出柱状图、折线图、饼图等等图表,根据word模板导出word文件。
  在开始前,你一定要知道,word中的图表,其实是通过一个内置excel来提供数据的。并且一定要搞清楚以下几个概念:系列分类。下面以一个折线图来举例说明。
在这里插入图片描述
  通过这个折线图可以很清楚的处分出系列分类。图中有三条线,每条线都表示一个系列;横坐标对应的就是类别;每个类别都有相应的数据,而这个数据也就是。如果还是不太清楚,下面通过图表对应的内置excel来分析这个三个概念。
  选中word中的图表,右键菜单中有一个选项编辑数据,点击就会自动弹出内置的excel,具体格式请看下图:

在这里插入图片描述
  通过这张图片,估计就不需要我再多说什么废话了,三个概念也就跃然纸上。搞清楚内置excel的结构和系列分类这个三个概念,那你离成功只剩一步之遥。

2.准备pom.xml

    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>

        <!--谷歌guava工具类-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>11.0.2</version>
        </dependency>
    </dependencies>

3.编写PoiUtil工具类


/**
 * @author : LCheng
 * @date : 2020-12-10 10:03
 * description : poi工具
 */
public class PoiUtil {

    /**
     * 根据word模板导出 针对图表(柱状图,折线图,饼图等)的处理
     *
     * @param docChart    图表对象
     * @param title       图表标题
     * @param seriesNames 系列名称数组
     * @param cats        分类信息数组
     * @param values      值信息集合 与系列数组一一对应
     * @return {@link XWPFChart}
     * @author LCheng
     * @date 2020/12/10 11:08
     */
    public static XWPFChart wordExportChar(XWPFChart docChart, String title, String[] seriesNames, String[] cats, List<Number[]> values) {
        //获取图表数据对象
        XDDFChartData chartData = docChart.getChartSeries().get(0);

        //word图表均对应一个内置的excel,用于保存图表对应的数据
        //excel中 第一列第二行开始的数据为分类信息
        //CellRangeAddress(1, categories.size(), 0, 0) 四个参数依次为 起始行 截止行 起始列 截止列。
        //excel中分类信息的范围
        String catDataRange = docChart.formatRange(new CellRangeAddress(1, cats.length, 0, 0));
        //根据分类信息的范围创建分类信息的数据源
        XDDFDataSource<?> catDataSource = XDDFDataSourcesFactory.fromArray(cats, catDataRange, 0);
        //更新数据
        for (int i = 0; i < seriesNames.length; i++) {
            //excel中各系列对应的数据的范围
            String valDataRange = docChart.formatRange(new CellRangeAddress(1, cats.length, i + 1, i + 1));
            //根据数据的范围创建值的数据源
            Number[] val = values.get(i);
            XDDFNumericalDataSource<Number> valDataSource = XDDFDataSourcesFactory.fromArray(val, valDataRange, i + 1);
            //获取图表系列的数据对象
            XDDFChartData.Series series = chartData.getSeries().get(i);
            //替换系列数据对象中的分类和值
            series.replaceData(catDataSource, valDataSource);
            //修改系列数据对象中的标题
            CellReference cellReference = docChart.setSheetTitle(seriesNames[i], 1);
            series.setTitle(seriesNames[i], cellReference);
        }
        //更新图表数据对象
        docChart.plot(chartData);
        //图表整体的标题 传空值则不替换标题
        if (!Strings.isNullOrEmpty(title)) {
            docChart.setTitleText(title);
            docChart.setTitleOverlay(false);
        }
        return docChart;
    }
}

  这是一个通用的方法,无论图表是柱状图、折线图还是饼图,都可以使用这个方法来进行word模板导出。代码的每一行代表的著述都已标注清楚,非常好理解,其实就是去修改图表对应的内置excel中的数据,将系列分类的信息全部替换成我们想要的。

4.最最后一步,实践检验真理的最后一步

  • 首先你需要一个word模板,具体模板请根据自己的需求太制定,测试我选用的模板如下:
    在这里插入图片描述
  • 接下来就是需要一个测试类,来修改模板中的图表,变成我们想要的样子。
/**
 * @author : LCheng
 * @date : 2020-12-10 13:21
 * description : 测试类
 */
public class Test {
    public static void main(String[] args) throws Exception {
        //获取word模板
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("wordChartTemplate.docx");
        XWPFDocument doc = new XWPFDocument(is);

        //获取word中所有图表对象
        List<XWPFChart> charts = doc.getCharts();

        //获取第一个单系列柱状图
        XWPFChart singleBarChar = charts.get(0);
        //系列信息
        String[] singleBarSeriesNames = {"运动情况"};
        //分类信息
        String[] singleBarCats = {"走路", "跑步", "游泳", "跳高", "闪现"};
        //值信息
        List<Number[]> singleBarValues = new ArrayList<>();
        singleBarValues.add(new Number[]{100, 150, 50, 30, 200});
        PoiUtil.wordExportChar(singleBarChar, "运动情况", singleBarSeriesNames, singleBarCats, singleBarValues);

        //获取第二个多系列折线图对象
        XWPFChart multiLineChar = charts.get(1);
        //系列信息
        String[] multiLineSeriesNames = {"吕布", "夏侯惇", "凯"};
        //分类信息
        String[] multiLineCats = {"走路", "跑步", "游泳", "跳高", "闪现"};
        //值信息
        List<Number[]> multiLineValues = new ArrayList<>();
        multiLineValues.add(new Number[]{100, 150, 50, 30, 200});
        multiLineValues.add(new Number[]{50, 100, 20, 150, 50});
        multiLineValues.add(new Number[]{200, 130, 80, 50, 100});
        PoiUtil.wordExportChar(multiLineChar, "多对象运动情况", multiLineSeriesNames, multiLineCats, multiLineValues);

        try (FileOutputStream fos = new FileOutputStream("D:\\test.docx")) {
            doc.write(fos);
        }
    }
}

需要说明一点,本文将导出后的文件保存到了d盘下,请确认自己的电脑要有d盘哦。

  • 接下来就是见证奇迹的时刻,看一下导出后的word长什么样吧
    在这里插入图片描述
    至此所有内容已完成,代码实现很简单,难的时候要先理解图表对应内置excel的表结构,和系列分类这个三个概念,理解这些之后,一切就变得如此简单了
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
以下是使用POI导出Word柱状图的步骤: 1. 导入POI库和相关依赖: ```java import org.apache.poi.xwpf.usermodel.*; import org.apache.poi.xddf.usermodel.chart.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; ``` 2. 创建一个新的Word文档: ```java XWPFDocument document = new XWPFDocument(); ``` 3. 创建一个柱状图数据集: ```java XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet("Data"); Row row = sheet.createRow(0); row.createCell(0).setCellValue("Category"); row.createCell(1).setCellValue("Value1"); row.createCell(2).setCellValue("Value2"); row = sheet.createRow(1); row.createCell(0).setCellValue("Category 1"); row.createCell(1).setCellValue(10); row.createCell(2).setCellValue(20); row = sheet.createRow(2); row.createCell(0).setCellValue("Category 2"); row.createCell(1).setCellValue(30); row.createCell(2).setCellValue(40); row = sheet.createRow(3); row.createCell(0).setCellValue("Category 3"); row.createCell(1).setCellValue(50); row.createCell(2).setCellValue(60); XDDFDataSource<String> categories = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1, 3, 0, 0)); XDDFNumericalDataSource<Double> values1 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 3, 1, 1)); XDDFNumericalDataSource<Double> values2 = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 3, 2, 2)); ``` 4. 创建一个柱状图: ```java XWPFChart chart = document.createChart(15, 15, 600, 400); chart.setTitleText("Bar Chart"); chart.setTitleOverlay(false); XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); XDDFCategoryAxis categoryAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); XDDFValueAxis valueAxis = chart.createValueAxis(AxisPosition.LEFT); valueAxis.setCrosses(AxisCrosses.AUTO_ZERO); XDDFChartData data = chart.createData(ChartTypes.BAR, categoryAxis, valueAxis); data.setVaryColors(true); XDDFChartData.Series series1 = data.addSeries(categories, values1); series1.setTitle("Value1", null); XDDFChartData.Series series2 = data.addSeries(categories, values2); series2.setTitle("Value2", null); chart.plot(data); ``` 5. 将图表插入到Word文档中: ```java XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText("Bar Chart:"); run.addBreak(); XDDFPicture picture = chart.getPreferredSize(); String id = document.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG); document.createPicture(id, document.getNextPicNameNumber(Document.PICTURE_TYPE_PNG), picture.getWidth(), picture.getHeight()); ``` 6. 保存Word文档: ```java FileOutputStream out = new FileOutputStream("chart.docx"); document.write(out); out.close(); document.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值