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的表结构,和系列,分类,值这个三个概念,理解这些之后,一切就变得如此简单了