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

1 篇文章 0 订阅

前言

这个项目是公司有新的需求,需要用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<>();

        // 创建一些轴
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        bottomAxis.setTitle(barChartForm.getBottomTitle());
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.setTitle(barChartForm.getBottomTitle());
        leftAxis.setCrosses(AxisCrosses.AUTO_ZERO);
        leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
        // 创建柱状图的类型
        XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);
        // 为图表添加数据
        for (int i = 0; i < tableData.size(); i++) {
            XDDFChartData.Series series = data.addSeries(categoriesData, XDDFDataSourcesFactory.fromArray(
                    tableData.get(i), chart.formatRange(new CellRangeAddress(1, numOfPoints, i, i))));
            seriesList.add(series);
        }
        for (int i = 0; i < seriesList.size(); i++) {
            seriesList.get(i).setTitle(colorTitles.get(i), setTitleInDataSheet(chart, colorTitles.get(i), 1));
        }
        // 指定为簇状柱状图
        if (tableData.size() > 1) {
            ((XDDFBarChartData) data).setBarGrouping(barChartForm.getGrouping());
            chart.getCTChart().getPlotArea().getBarChartArray(0).addNewOverlap().setVal(barChartForm.getNewOverlap());
        }

        // 指定系列颜色
        for (BarChartForm.ColorCheck colorCheck : barChartForm.getList()) {
            XDDFSolidFillProperties fillMarker = new XDDFSolidFillProperties(colorCheck.getXddfColor());
            XDDFShapeProperties propertiesMarker = new XDDFShapeProperties();
            // 给对象填充颜色属性
            propertiesMarker.setFillProperties(fillMarker);
            chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(colorCheck.getNum()).addNewSpPr().set(propertiesMarker.getXmlObject());
        }

        ((XDDFBarChartData) data).setBarDirection(BarDirection.COL);
        // 设置多个柱子之间的间隔
        // 绘制图形数据
        chart.plot(data);
        // create legend
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.LEFT);
        legend.setOverlay(false);


    }


    /**
     * 创建折线图
     *
     * @param chart         图表对象
     * @param lineChartForm 数据对象
     */
    public void createLineChart(XWPFChart chart, LineChartForm lineChartForm) {
        // 标题
        chart.setTitleText(lineChartForm.getTitle());
        //标题覆盖
        chart.setTitleOverlay(false);
        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);
        //分类轴标(X轴),标题位置
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        bottomAxis.setTitle(lineChartForm.getBottomTitle());
        //值(Y轴)轴,标题位置
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.setTitle(lineChartForm.getLeftTitle());
        // 处理数据
        XDDFCategoryDataSource bottomDataSource = XDDFDataSourcesFactory.fromArray(lineChartForm.getBottomData());
        XDDFNumericalDataSource<Integer> leftDataSource = XDDFDataSourcesFactory.fromArray(lineChartForm.getLeftData());

        // 生成数据
        XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);

        // 不自动生成颜色
        data.setVaryColors(lineChartForm.getVaryColors());

        //图表加载数据,折线1
        XDDFLineChartData.Series series = (XDDFLineChartData.Series) data.addSeries(bottomDataSource, leftDataSource);

        //是否弯曲
        series.setSmooth(lineChartForm.getSmooth());

        //设置标记样式
        series.setMarkerStyle(lineChartForm.getStyle());

        //绘制
        chart.plot(data);
    }

    /**
     * 创建散点图
     *
     * @param chart            图表对象
     * @param scatterChartForm 数据对象
     */
    public void createScatterChart(XWPFChart chart, ScatterChartForm scatterChartForm) {
        // 标题
        chart.setTitleText(scatterChartForm.getTitle());
        //标题覆盖
        chart.setTitleOverlay(false);
        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);
        //分类轴标(X轴),标题位置
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        bottomAxis.setTitle(scatterChartForm.getBottomTitle());
        //值(Y轴)轴,标题位置
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
        leftAxis.setTitle(scatterChartForm.getLeftTitle());
        XDDFScatterChartData data = null;
        for (int i = 0; i < scatterChartForm.getLists().size(); i++) {
            // 处理数据
            XDDFNumericalDataSource bottomDataSource = XDDFDataSourcesFactory.fromArray(scatterChartForm.getLists().get(i).getBottomData());
            XDDFNumericalDataSource<Integer> leftDataSource = XDDFDataSourcesFactory.fromArray(scatterChartForm.getLists().get(i).getLeftData());
            // 生成数据
            if (data == null) {
                data = (XDDFScatterChartData) chart.createData(ChartTypes.SCATTER, bottomAxis, leftAxis);
                // 是否自动生成颜色
                data.setVaryColors(false);
            }

            //图表加载数据,折线1
            XDDFScatterChartData.Series series = (XDDFScatterChartData.Series) data.addSeries(bottomDataSource, leftDataSource);
            //设置标记样式
            series.setMarkerStyle(scatterChartForm.getStyle());
            series.setMarkerSize(scatterChartForm.getMarkerSize());
            // 设置系列标题
            series.setTitle(scatterChartForm.getLists().get(i).getTitle(), null);
            // 去除连接线
            chart.getCTChart().getPlotArea().getScatterChartArray(0).getSerArray(i).addNewSpPr().addNewLn().addNewNoFill();
            if (scatterChartForm.getLists().get(i).getXddfColor() != null) {
                // 创建一个设置对象
                XDDFSolidFillProperties fillMarker = new XDDFSolidFillProperties(scatterChartForm.getLists().get(i).getXddfColor());
                XDDFShapeProperties propertiesMarker = new XDDFShapeProperties();
                // 给对象填充颜色属性
                propertiesMarker.setFillProperties(fillMarker);
                // 修改系列颜色
                chart.getCTChart().getPlotArea().getScatterChartArray(0).getSerArray(i).getMarker()
                        .addNewSpPr().set(propertiesMarker.getXmlObject());
            }
        }

        //绘制
        chart.plot(data);


    }

    /**
     * 创建饼状图
     *
     * @param chart        图表对象
     * @param pieChartForm 数据对象
     */
    public void createPieChart(XWPFChart chart, PieChartForm pieChartForm) {
        // 标题
        chart.setTitleText(pieChartForm.getTitle());
        //标题覆盖
        chart.setTitleOverlay(false);
        //图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);
        // 处理数据
        XDDFCategoryDataSource bottomDataSource = XDDFDataSourcesFactory.fromArray(pieChartForm.getBottomData());
        XDDFNumericalDataSource<Integer> leftDataSource = XDDFDataSourcesFactory.fromArray(pieChartForm.getLeftData());

        // 生成数据
        XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
        // 自动生成颜色
        data.setVaryColors(false);

        //图表加载数据
        XDDFChartData.Series series = data.addSeries(bottomDataSource, leftDataSource);

        //绘制
        chart.plot(data);
    }

    /**
     * 添加word中的标记数据 标记方式为 ${text}
     *
     * @param document word对象
     * @param textMap  需要替换的信息集合
     */
    public void changeParagraphText(XWPFDocument document, Map<String, String> textMap) {
        //获取段落集合
        List<XWPFParagraph> paragraphs = document.getParagraphs();
        for (XWPFParagraph paragraph : paragraphs) {
            //判断此段落时候需要进行替换
            String text = paragraph.getText();
            if (checkText(text)) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    //替换模板原来位置
                    run.setText(changeValue(run.toString(), textMap), 0);
                }
            }
        }
    }

    /**
     * 替换表格中标记的数据 标记方式为 ${text}
     * 这里有个奇怪的问题 输入${}符号的时候需要把输入法切换到中文
     * ${}中间不能用数字,不能有下划线
     *
     * @param document word对象
     * @param textMap  需要替换的信息集合
     */
    public void changeTableText(XWPFDocument document, List<Map<String, String>> tableTextList) {
        //获取表格对象集合
        List<XWPFTable> tables = document.getTables();
        for (int i = 0; i < tables.size(); i++) {
            Map<String, String> textMap = tableTextList.get(i);
            //只处理行数大于等于2的表格
            XWPFTable table = tables.get(i);
            if (table.getRows().size() > 1) {
                //判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
                if (checkText(table.getText())) {
                    List<XWPFTableRow> rows = table.getRows();
                    //遍历表格,并替换模板
                    eachTable(rows, textMap);
                }
            }
        }
    }

    /**
     * 复制表头,插入行数据,这里的样式和表头一样
     *
     * @param document word对象
     * @param list     集合个数和word中的表格个数必须相同
     */
    public void copyHeaderInsertText(XWPFDocument document, List<TableForm> list) {
        //获取表格对象集合
        List<XWPFTable> tables = document.getTables();
        // 循环word中的所有表格
        for (int k = 0; k < tables.size(); k++) {
            // 获取单个表格
            XWPFTable table = tables.get(k);
            // 获取要替换的数据
            TableForm tableForm = list.get(k);
            Integer headerIndex = tableForm.getStartLine();
            List<String[]> tableList = tableForm.getData();
            if (null == tableList) {
                return;
            }
            XWPFTableRow copyRow = table.getRow(headerIndex);
            List<XWPFTableCell> cellList = copyRow.getTableCells();
            if (null == cellList) {
                break;
            }
            //遍历要添加的数据的list
            for (int i = 0; i < tableList.size(); i++) {
                //插入一行
                XWPFTableRow targetRow = table.insertNewTableRow(headerIndex + 1 + i);
                //复制行属性
                targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr());

                String[] strings = tableList.get(i);
                for (int j = 0; j < strings.length; j++) {
                    XWPFTableCell sourceCell = cellList.get(j);
                    //插入一个单元格
                    XWPFTableCell targetCell = targetRow.addNewTableCell();
                    //复制列属性
                    targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
                    targetCell.setText(strings[j]);
                }
            }
        }
    }

    public static void main(String[] args) {
//        try (XWPFDocument document = new XWPFDocument(new FileInputStream("D:\\FreeMarker.docx"))) {
//            WordUtils wordUtils = new WordUtils();
//            Map<String, String> paragraphMap = new HashMap<>();
//            paragraphMap.put("number", "10000");
//            paragraphMap.put("date", "2020-03-25");
//            wordUtils.changeParagraphText(document, paragraphMap);
//
//            List<Map<String, String>> tableTextList = new ArrayList<>();
//            Map<String, String> tableMap = new HashMap<>();
//            tableMap.put("name", "赵云");
//            tableMap.put("sexual", "男");
//            tableMap.put("birthday", "2020-01-01");
//            tableMap.put("identify", "123456789");
//            tableMap.put("phone", "18377776666");
//            tableMap.put("address", "王者荣耀");
//            tableMap.put("domicile", "中国-腾讯");
//            tableMap.put("QQ", "是");
//            tableMap.put("chat", "是");
//            tableMap.put("blog", "是");
//            tableTextList.add(tableMap);
//            Map<String, String> tableMap2 = new HashMap<>();
//            tableMap2.put("spring", "sony的名称");
//            tableTextList.add(tableMap2);
//            wordUtils.changeTableText(document, tableTextList);
//
//            List<TableForm> list = new ArrayList<>();
//            TableForm tableForm = new TableForm();
//            tableForm.setStartLine(7);
//            tableForm.getData().add(new String[]{"露娜", "女", "野友", "666", "6660"});
//            tableForm.getData().add(new String[]{"鲁班", "男", "射友", "222", "2220"});
//            tableForm.getData().add(new String[]{"程咬金", "男", "肉友", "999", "9990"});
//            tableForm.getData().add(new String[]{"太乙真人", "男", "辅友", "111", "1110"});
//            tableForm.getData().add(new String[]{"貂蝉", "女", "法友", "888", "8880"});
//            list.add(tableForm);
//            TableForm tableForm2 = new TableForm();
//            tableForm2.setStartLine(1);
//            tableForm2.getData().add(new String[]{"18581588710", "蜘蛛侠", "100"});
//            tableForm2.getData().add(new String[]{"18581588710", "战神", "200"});
//            list.add(tableForm2);
//            wordUtils.copyHeaderInsertText(document,list);
//            try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
//                document.write(fileOut);
//            }
//        } catch (Exception e) {
//
//        }


//        try (XWPFDocument document = new XWPFDocument()) {
//            WordUtils wordUtils = new WordUtils();
//            XWPFChart chart = wordUtils.getChart(document, null, null);
//            PieChartForm pieChartForm = new PieChartForm();
//            pieChartForm.setTitle("标题");
//            pieChartForm.setBottomData(new String[]{"俄罗斯", "加拿大", "美国", "中国", "巴西", "澳大利亚", "印度"});
//            pieChartForm.setLeftData(new Integer[]{17098242, 9984670, 9826675, 9596961, 8514877, 7741220, 3287263});
//            wordUtils.createPieChart(chart, pieChartForm);
//            try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
//                document.write(fileOut);
//            }
//        } catch (Exception e) {
//
//        }

//
//        try (XWPFDocument document = new XWPFDocument()) {
//            WordUtils wordUtils = new WordUtils();
//            XWPFChart chart = wordUtils.getChart(document, null, null);
//            ScatterChartForm scatterChartForm = new ScatterChartForm();
//            scatterChartForm.setTitle("测试");
//            scatterChartForm.setBottomTitle("X轴");
//            scatterChartForm.setLeftTitle("Y轴");
//            scatterChartForm.setStyle(MarkerStyle.CIRCLE);
//            scatterChartForm.setMarkerSize((short) 10);
//            scatterChartForm.setVaryColors(false);
//
//            ScatterChartForm.AreaData areaData = new ScatterChartForm.AreaData();
//            areaData.setBottomData(new Integer[]{1, 2, 3, 4, 5, 8, 7});
//            areaData.setLeftData(new Integer[]{5, 5, 5, 4, 5, 6, 7});
//            areaData.setTitle("测试1");
//            scatterChartForm.getLists().add(areaData);
//
//            ScatterChartForm.AreaData areaData2 = new ScatterChartForm.AreaData();
//            areaData2.setBottomData(new Integer[]{6,9});
//            areaData2.setLeftData(new Integer[]{1,9});
//            areaData2.setXddfColor(XDDFColor.from(new byte[]{(byte)0xFF, (byte)0xE1, (byte)0xFF}));
//            areaData2.setTitle("测试2");
//            scatterChartForm.getLists().add(areaData2);
//            wordUtils.createScatterChart(chart, scatterChartForm);
//
//            try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
//                document.write(fileOut);
//            }
//        } catch (Exception e) {
//
//        }

//        try (XWPFDocument document = new XWPFDocument()) {
//            WordUtils wordUtils = new WordUtils();
//            XWPFChart chart = wordUtils.getChart(document, null, null);
//            LineChartForm lineChartForm = new LineChartForm();
//            lineChartForm.setTitle("测试");
//            lineChartForm.setBottomTitle("X轴");
//            lineChartForm.setLeftTitle("Y轴");
//            lineChartForm.setStyle(MarkerStyle.STAR);
//            lineChartForm.setMarkerSize((short) 6);
//            lineChartForm.setSmooth(false);
//            lineChartForm.setVaryColors(false);
//            lineChartForm.setBottomData(new String[] {"俄罗斯","加拿大","美国","中国","巴西","澳大利亚","印度"});
//            lineChartForm.setLeftData(new Integer[] {17098242,9984670,9826675,9596961,8514877,7741220,3287263});
//            wordUtils.createLineChart(chart, lineChartForm);
//            try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
//                document.write(fileOut);
//            }
//        } catch (Exception e) {
//
//        }


        try (XWPFDocument document = new XWPFDocument()) {
            WordUtils wordUtils = new WordUtils();
            XWPFChart chart = wordUtils.getChart(document, null, null);
            String[] categories = new String[]{"Lang 1", "Lang 2", "Lang 3"};
            Double[] valuesA = new Double[]{10d, 20d, 30d};
            Double[] valuesB = new Double[]{15d, 25d, 35d};
            Double[] valuesC = new Double[]{10d, 8d, 20d};
            List<Double[]> list = new ArrayList<>();
            list.add(valuesA);
            list.add(valuesB);
            list.add(valuesC);
            BarChartForm barChartForm = new BarChartForm();
            barChartForm.setTitle("测试");
            barChartForm.setCategories(categories);
            barChartForm.setTableData(list);
            barChartForm.setColorTitles(Arrays.asList("a", "b", "c"));
            barChartForm.setGrouping(BarGrouping.STACKED);
            barChartForm.setNewOverlap((byte) 100);

            BarChartForm.ColorCheck colorCheck = new BarChartForm.ColorCheck();
            colorCheck.setXddfColor(XDDFColor.from(new byte[]{(byte) 0xFF, (byte) 0x33, (byte) 0x00}));
            colorCheck.setNum(0);
            barChartForm.getList().add(colorCheck);

            BarChartForm.ColorCheck colorCheck2 = new BarChartForm.ColorCheck();
            colorCheck2.setXddfColor(XDDFColor.from(new byte[]{(byte) 0x91, (byte) 0x2C, (byte) 0xEE}));
            colorCheck2.setNum(1);
            barChartForm.getList().add(colorCheck2);

            BarChartForm.ColorCheck colorCheck3 = new BarChartForm.ColorCheck();
            colorCheck3.setXddfColor(XDDFColor.from(new byte[]{(byte) 0x00, (byte) 0x00, (byte) 0x80}));
            colorCheck3.setNum(2);
            barChartForm.getList().add(colorCheck3);


            wordUtils.createBarChart(chart, barChartForm);
            try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
                document.write(fileOut);
            }
        } catch (Exception e) {

        }
    }

    /**
     * 判断文本中时候包含$
     *
     * @param text 文本
     * @return 包含返回true, 不包含返回false
     */
    public static boolean checkText(String text) {
        boolean check = false;
        if (text.indexOf("$") != -1) {
            check = true;
        }
        return check;
    }

    /**
     * 匹配传入信息集合与模板
     *
     * @param value   模板需要替换的区域
     * @param textMap 传入信息集合
     * @return 模板需要替换区域信息集合对应值
     */
    public static String changeValue(String value, Map<String, String> textMap) {
        Set<Map.Entry<String, String>> textSets = textMap.entrySet();
        for (Map.Entry<String, String> textSet : textSets) {
            //匹配模板与替换值 格式${key}
            String key = "${" + textSet.getKey() + "}";
            if (value.indexOf(key) != -1) {
                value = textSet.getValue();
            }
        }
        //模板未匹配到区域替换为空
        if (checkText(value)) {
            value = "";
        }
        return value;
    }

    /**
     * 遍历表格,并替换模板
     *
     * @param rows    表格行对象
     * @param textMap 需要替换的信息集合
     */
    public static void eachTable(List<XWPFTableRow> rows, Map<String, String> textMap) {
        for (XWPFTableRow row : rows) {
            List<XWPFTableCell> cells = row.getTableCells();
            for (XWPFTableCell cell : cells) {
                //判断单元格是否需要替换
                if (checkText(cell.getText())) {
                    List<XWPFParagraph> paragraphs = cell.getParagraphs();
                    for (XWPFParagraph paragraph : paragraphs) {
                        List<XWPFRun> runs = paragraph.getRuns();
                        for (XWPFRun run : runs) {
                            run.setText(changeValue(run.toString(), textMap), 0);
                        }
                    }
                }
            }
        }
    }

    static CellReference setTitleInDataSheet(XWPFChart chart, String title, int column) throws Exception {
        XSSFWorkbook workbook = chart.getWorkbook();
        XSSFSheet sheet = workbook.getSheetAt(0);
        XSSFRow row = sheet.getRow(0);
        if (row == null)
            row = sheet.createRow(0);
        XSSFCell cell = row.getCell(column);
        if (cell == null)
            cell = row.createCell(column);
        cell.setCellValue(title);
        return new CellReference(sheet.getSheetName(), 0, column, true, true);
    }
}

其中里面的一些Form类我没有在博客中贴出来,需要可自行在下面的github中下载

gitHub地址

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值