前言
这个项目是公司有新的需求,需要用java来绘制一些图表,但是自己又完全没有搞过这一块,在实现功能的过程中,发现poi这块的针对word的官方文档并不是很详细,所有才有了这个博客的由来
其中参考了很多国内外大佬的博文,里面也有一些代码是直接粘贴复制过来,稍加改动实现的,如果有侵权请联系我删除
功能
这里包含了使用java绘制word里面的
普通柱状图,堆叠柱状图,簇状柱状图,饼状图,散点图,折线图
其中柱状图和散点图加入了自定义颜色的功能
项目是jdk8+maven+lombok构建
代码本体
依赖部分
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
WordUtil本体
import com.lh.word.form.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFShapeProperties;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
/**
* Copyright (C), 2006-2010, ChengDu ybya info. Co., Ltd.
* FileName: WordUtils.java
*
* @author lh
* @version 1.0.0
* @Date 2021/02/02 16:04
*/
public class WordUtils {
/**
* 获取图表对象
*
* @param document word对象
* @param width 默认15
* @param height 默认10
* @return
*/
public XWPFChart getChart(XWPFDocument document, Integer width, Integer height) throws IOException, InvalidFormatException {
if (width == null) {
width = 15;
}
if (height == null) {
height = 10;
}
return document.createChart(width * Units.EMU_PER_CENTIMETER, height * Units.EMU_PER_CENTIMETER);
}
/**
* 创建普通柱状图-簇状柱状图-堆叠柱状图
*
* @param chart 图表对象
* @param barChartForm 数据对象
*/
public void createBarChart(XWPFChart chart, BarChartForm barChartForm) throws Exception {
String[] categories = barChartForm.getCategories();
List<Double[]> tableData = barChartForm.getTableData();
List<String> colorTitles = barChartForm.getColorTitles();
String title = barChartForm.getTitle();
if (colorTitles.size() != tableData.size()) {
throw new Exception("颜色标题个数,必须和数组个数相同");
}
for (Double[] tableDatum : tableData) {
if (tableDatum.length != categories.length) {
throw new Exception("每个数组的元素个数,必须和");
}
}
// 设置标题
chart.setTitleText(title);
//标题覆盖
chart.setTitleOverlay(false);
// 处理对应的数据
int numOfPoints = categories.length;
String categoryDataRange = chart.formatRange(new CellRangeAddress(1, numOfPoints, 0, 0));
XDDFDataSource<String> categoriesData = XDDFDataSourcesFactory.fromArray(categories, categoryDataRange, 0);
List<XDDFChartData.Series> seriesList = new ArrayList<