Java操作Word图表

一、POM

        <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>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.0</version>
        </dependency>

二、Word模板

Java操作Word图表_第1张图片

三、工具类


import com.google.common.base.Strings;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSource;
import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xwpf.usermodel.XWPFChart;

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

    /**
     * 根据word模板导出 针对图表(柱状图,折线图,饼图等)的处理
     *
     * @param docChart    图表对象
     * @param title       图表标题
     * @param seriesNames 系列名称数组
     * @return {@link XWPFChart}
     * @author LCheng
     * @date 2020/12/10 11:08
     */
    public static XWPFChart wordExportChar(XWPFChart docChart, String title, String[] seriesNames, XSSFSheet sheet) {
        //获取图表数据对象
        XDDFChartData chartData = docChart.getChartSeries().get(0);

        //word图表均对应一个内置的excel,用于保存图表对应的数据
        //excel中 第一列第二行开始的数据为分类信息
        //CellRangeAddress(1, categories.size(), 0, 0) 四个参数依次为 起始行 截止行 起始列 截止列。
        //根据分类信息的范围创建分类信息的数据源
        XDDFDataSource catDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1,4,0,0));
        //更新数据
        for (int i = 0; i < seriesNames.length; i++) {
            //excel中各系列对应的数据的范围
            //根据数据的范围创建值的数据源
            XDDFNumericalDataSource<Double> valDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet,  new CellRangeAddress(1,4,1,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;
    }
}

四、测试类

public class TestWord3 {
    public static void main(String[] args) throws Exception {
        //获取word模板
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("111.docx");
        assert is != null;
        XWPFDocument doc = new XWPFDocument(is);

        //获取word中所有图表对象
        List<XWPFChart> charts = doc.getCharts();
        XWPFChart chart = charts.get(0);
        XSSFWorkbook workbook = chart.getWorkbook();
        XSSFSheet sheet = workbook.getSheetAt(0);

//        //获取第一个单系列柱状图
        XWPFChart singleBarChar = charts.get(0);
        //系列信息
        String[] singleBarSeriesNames = {"运动情况"};
        //分类信息
        refreshExcel(sheet);
        PoiUtil.wordExportChar(singleBarChar, "运动情况", singleBarSeriesNames,sheet );
        try (FileOutputStream fos = new FileOutputStream("D:\\test8.docx")) {
                doc.write(fos);
        }
        is.close();
        doc.close();
    }
    public static void refreshExcel(XSSFSheet sheet) {

        sheet.getRow(1).getCell(0).setCellValue("走路");
        sheet.getRow(2).getCell(0).setCellValue("跑步");
        sheet.getRow(3).getCell(0).setCellValue("游泳");
        sheet.getRow(4).getCell(0).setCellValue("跳高");
        sheet.getRow(1).getCell(1).setCellValue(100);
        sheet.getRow(2).getCell(1).setCellValue(150);
        sheet.getRow(3).getCell(1).setCellValue(50);
        sheet.getRow(4).getCell(1).setCellValue(200);
    }
}

五、运行结果

Java操作Word图表_第2张图片

你可能感兴趣的:(word图表,java,word,开发语言,Java操作word图表)