当前位置 : 主页 > 编程语言 > java >

Java实现Word画折线图(非图片)

来源:互联网 收集:自由互联 发布时间:2022-07-14
引言 最近需要实现Java在Word中画折线图功能,不能简单的生成折线图再导入。实现方法就是利用Apache poi 工具。实现的效果如下,把鼠标放上去可以显示值。 比较简单,有一些坑,发出


引言

最近需要实现Java在Word中画折线图功能,不能简单的生成折线图再导入。实现方法就是利用Apache poi 工具。实现的效果如下,把鼠标放上去可以显示值。

Java实现Word画折线图(非图片)_折线图

比较简单,有一些坑,发出来记录一下。

模板

要实现上述效果需要一个Word模板,直接新建一个Word文件,插入Word内置的折线图图表即可。

Java实现Word画折线图(非图片)_java_02

插入完成就是这样子:

Java实现Word画折线图(非图片)_数据_03


把这个模板保存为​​line-chart-template.docx​​。

引入POI工具

<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>

完整代码

注意poi版本的问题,最好不低于4.1.0。4.0.1的版本有个坑,不能修改系列的标题。
这就是折线图的完整代码了:

public class GraphTest3 {
public static void main(String[] args) throws Exception {
String templatePath = "D:\\word\\line-chart-template.docx";

InputStream is = new FileInputStream(new File(templatePath));
XWPFDocument doc = new XWPFDocument(is);

//模拟统计图数据
//系列
String[] seriesTitles = {"日处理能力(kg)", "湿垃圾(kg)", "干垃圾(kg)"};
//x轴
String[] categories = {"2020-02-20", "2020-02-21", "2020-02-22", "2020-02-23", "2020-02-24", "2020-02-25", "2020-02-26"};
List<Number[]> values = new ArrayList<>();
//日处理能力
Number[] value1 = {1000, 1000, 1000, 1000, 1000, 1000, 1000};
//湿垃圾
Number[] value2 = {450.2, 622.1, 514, 384.7, 486.5, 688.9, 711.1};
//干垃圾
Number[] value3 = {200.2, 321.4, 266, 156.5, 232.2, 325.5, 319.5};

values.add(value1);
values.add(value2);
values.add(value3);

XWPFChart xChart = doc.getCharts().get(0);//获取第1个图表
generateChart(xChart, seriesTitles, categories, values);

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

}

public static void generateChart(XWPFChart chart, String[] series, String[] categories, List<Number[]> values) {
String chartTitle = "收运量统计图";
final List<XDDFChartData> data = chart.getChartSeries();//不知道这个ChartSeries代表什么意思
final XDDFLineChartData line = (XDDFLineChartData) data.get(0);//这里一般获取第一个,我们这里是折线图就是XDDFLineChartData

final int numOfPoints = categories.length;

final String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));

final XDDFDataSource<?> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
for (int i = 0; i < values.size(); i++) {
final String valuesDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, i + 1, i + 1));
Number[] value = values.get(i);
final XDDFNumericalDataSource<? extends Number> valuesData = XDDFDataSourcesFactory.fromArray(value, valuesDataRange, i + 1);
XDDFChartData.Series ser;//图表中的系列
ser = line.getSeries().get(i);
ser.replaceData(categoriesData, valuesData);
CellReference cellReference = chart.setSheetTitle(series[i], 1);//修改系列标题
ser.setTitle(series[i], cellReference);
}

chart.plot(line);
chart.setTitleText(chartTitle);//折线图标题
chart.setTitleOverlay(false);
}
}

​​XWPFChart xChart = doc.getCharts().get(0);//获取第1个图表​​这段代码是获取图表的意思。

为了体现效果,我又加了个折线图,然后DEBUG可以看到​​charts​​里面是这样的。可以支持多图表的,虽然我这里只展示了一个图表。

Java实现Word画折线图(非图片)_折线图_04

效果

Java实现Word画折线图(非图片)_java_05

最终的效果如图,和在word中画折线图的效果一样,可以随意编辑模板折线图的样式。不需要代码处理,这里比如我把第一个系列“日处理能力”的线条样式改成虚线。

修改模板中的效果如下:

Java实现Word画折线图(非图片)_折线图_06

此时代码不需要任何修改,重新跑一遍。

Java实现Word画折线图(非图片)_数据_07


效果如上,是不是很方便。有问题欢迎留言。


网友评论