java使用Apache POI实现word绘制图表 以及表格填充功能

前言

这个项目是公司有新的需求,需要用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<
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值