精华内容
下载资源
问答
  • POI_4.1.0 word模板导出 柱状图、折线图、饼图等等图表1. 这几个概念一定要搞清楚2.准备pom.xml3.编写PoiUtil工具类4.最最后一步,实践检验真理的最后一步 1. 这几个概念一定要搞清楚   本文主要介绍通过POI_4.1.0...

    1. 这几个概念一定要搞清楚

      本文主要介绍通过POI_4.1.0导出柱状图、折线图、饼图等等图表,根据word模板导出word文件。
      在开始前,你一定要知道,word中的图表,其实是通过一个内置excel来提供数据的。并且一定要搞清楚以下几个概念:系列分类。下面以一个折线图来举例说明。
    在这里插入图片描述
      通过这个折线图可以很清楚的处分出系列分类。图中有三条线,每条线都表示一个系列;横坐标对应的就是类别;每个类别都有相应的数据,而这个数据也就是。如果还是不太清楚,下面通过图表对应的内置excel来分析这个三个概念。
      选中word中的图表,右键菜单中有一个选项编辑数据,点击就会自动弹出内置的excel,具体格式请看下图:

    在这里插入图片描述
      通过这张图片,估计就不需要我再多说什么废话了,三个概念也就跃然纸上。搞清楚内置excel的结构和系列分类这个三个概念,那你离成功只剩一步之遥。

    2.准备pom.xml

        <dependencies>
            <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>
    
            <!--谷歌guava工具类-->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>11.0.2</version>
            </dependency>
        </dependencies>
    

    3.编写PoiUtil工具类

    
    /**
     * @author : LCheng
     * @date : 2020-12-10 10:03
     * description : poi工具
     */
    public class PoiUtil {
    
        /**
         * 根据word模板导出 针对图表(柱状图,折线图,饼图等)的处理
         *
         * @param docChart    图表对象
         * @param title       图表标题
         * @param seriesNames 系列名称数组
         * @param cats        分类信息数组
         * @param values      值信息集合 与系列数组一一对应
         * @return {@link XWPFChart}
         * @author LCheng
         * @date 2020/12/10 11:08
         */
        public static XWPFChart wordExportChar(XWPFChart docChart, String title, String[] seriesNames, String[] cats, List<Number[]> values) {
            //获取图表数据对象
            XDDFChartData chartData = docChart.getChartSeries().get(0);
    
            //word图表均对应一个内置的excel,用于保存图表对应的数据
            //excel中 第一列第二行开始的数据为分类信息
            //CellRangeAddress(1, categories.size(), 0, 0) 四个参数依次为 起始行 截止行 起始列 截止列。
            //excel中分类信息的范围
            String catDataRange = docChart.formatRange(new CellRangeAddress(1, cats.length, 0, 0));
            //根据分类信息的范围创建分类信息的数据源
            XDDFDataSource<?> catDataSource = XDDFDataSourcesFactory.fromArray(cats, catDataRange, 0);
            //更新数据
            for (int i = 0; i < seriesNames.length; i++) {
                //excel中各系列对应的数据的范围
                String valDataRange = docChart.formatRange(new CellRangeAddress(1, cats.length, i + 1, i + 1));
                //根据数据的范围创建值的数据源
                Number[] val = values.get(i);
                XDDFNumericalDataSource<Number> valDataSource = XDDFDataSourcesFactory.fromArray(val, valDataRange, i + 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;
        }
    }
    

      这是一个通用的方法,无论图表是柱状图、折线图还是饼图,都可以使用这个方法来进行word模板导出。代码的每一行代表的著述都已标注清楚,非常好理解,其实就是去修改图表对应的内置excel中的数据,将系列分类的信息全部替换成我们想要的。

    4.最最后一步,实践检验真理的最后一步

    • 首先你需要一个word模板,具体模板请根据自己的需求太制定,测试我选用的模板如下:
      在这里插入图片描述
    • 接下来就是需要一个测试类,来修改模板中的图表,变成我们想要的样子。
    /**
     * @author : LCheng
     * @date : 2020-12-10 13:21
     * description : 测试类
     */
    public class Test {
        public static void main(String[] args) throws Exception {
            //获取word模板
            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("wordChartTemplate.docx");
            XWPFDocument doc = new XWPFDocument(is);
    
            //获取word中所有图表对象
            List<XWPFChart> charts = doc.getCharts();
    
            //获取第一个单系列柱状图
            XWPFChart singleBarChar = charts.get(0);
            //系列信息
            String[] singleBarSeriesNames = {"运动情况"};
            //分类信息
            String[] singleBarCats = {"走路", "跑步", "游泳", "跳高", "闪现"};
            //值信息
            List<Number[]> singleBarValues = new ArrayList<>();
            singleBarValues.add(new Number[]{100, 150, 50, 30, 200});
            PoiUtil.wordExportChar(singleBarChar, "运动情况", singleBarSeriesNames, singleBarCats, singleBarValues);
    
            //获取第二个多系列折线图对象
            XWPFChart multiLineChar = charts.get(1);
            //系列信息
            String[] multiLineSeriesNames = {"吕布", "夏侯惇", "凯"};
            //分类信息
            String[] multiLineCats = {"走路", "跑步", "游泳", "跳高", "闪现"};
            //值信息
            List<Number[]> multiLineValues = new ArrayList<>();
            multiLineValues.add(new Number[]{100, 150, 50, 30, 200});
            multiLineValues.add(new Number[]{50, 100, 20, 150, 50});
            multiLineValues.add(new Number[]{200, 130, 80, 50, 100});
            PoiUtil.wordExportChar(multiLineChar, "多对象运动情况", multiLineSeriesNames, multiLineCats, multiLineValues);
    
            try (FileOutputStream fos = new FileOutputStream("D:\\test.docx")) {
                doc.write(fos);
            }
        }
    }
    

    需要说明一点,本文将导出后的文件保存到了d盘下,请确认自己的电脑要有d盘哦。

    • 接下来就是见证奇迹的时刻,看一下导出后的word长什么样吧
      在这里插入图片描述
      至此所有内容已完成,代码实现很简单,难的时候要先理解图表对应内置excel的表结构,和系列分类这个三个概念,理解这些之后,一切就变得如此简单了
    展开全文
  • 1 依赖引入 <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId>...2 新建word模板 ...Word模板中所有变量以{{开头,以}}结尾,不同内容变量声明...

    1 依赖引入

          <dependency>
              <groupId>com.deepoove</groupId>
              <artifactId>poi-tl</artifactId>
              <version>1.8.2</version>
        </dependency>

    2 新建word模板

    Word模板中所有变量以{{开头,以}}结尾,不同内容变量声明如下

    1){{template}}    普通文本,渲染数据为:String或者TextRenderData

    2){{#template}}   表格,渲染数据为:TableRenderData

    3)当生成图表时,新建图表—>右键编辑替换文字—>{{barLineCharts}} 图表变量,如下图(可能不同版本编辑替换文字位置不同。)

    3 java获取数据,生成word

    1)声明模板的位置:

    XWPFTemplate template = XWPFTemplate.compile("./src/main/resources/templates/template.docx");

    2)导出word路径,名称

    FileOutputStream out = new FileOutputStream("./src/main/resources/templates/output_"+String.valueOf(Math.random())+".docx");

     3)填充数据

    //声明map存放模板中的内容
    HashMap<String, Object> data = new HashMap<String, Object>();
    data.put("title","hello world");
    //Logger.info("hello");
    /*测试文本插入------------------------------*/
    //先定义文本对象
    TextRenderData textRenderData = new TextRenderData();
    //设置文本内容
    textRenderData.setText("张三");
    //设置文本格式
    Style style = new Style();
    style.setBold(true);
    style.setColor("000F00");
    style.setFontSize(20);
    textRenderData.setStyle(style);
    //将文本数据和模板中变量对应
    data.put("name", textRenderData);
    /* 测试表格插入---------------------------------------*/
    		//定义表格的头
    		//方式一
    		//RowRenderData headerData = RowRenderData.build("电灯名称","使用率");
    		//设置样式
    		TableStyle tStyle = new TableStyle();
    		tStyle.setBackgroundColor("87CEEB");
    		//表头方式二
    		/*RowRenderData headerData = RowRenderData.build(
    				new TextRenderData("FFFFFF","仪器名称"),new TextRenderData("FFFFFF","使用率"));*/
    		//表头方式三
    		
    		List<CellRenderData> listCellRenderDatas =new ArrayList<CellRenderData>();
    		CellRenderData cellRenderData1 = new CellRenderData();
    		cellRenderData1.setCellText(new TextRenderData("000000","电灯名称"));
    		listCellRenderDatas.add(cellRenderData1);
    		CellRenderData cellRenderData2 = new CellRenderData();
    		cellRenderData2.setCellText(new TextRenderData("000000","使用率"));
    		listCellRenderDatas.add(cellRenderData2);
    		CellRenderData cellRenderData3 = new CellRenderData();
    		cellRenderData3.setCellText(new TextRenderData("000000","使用年限"));
    		listCellRenderDatas.add(cellRenderData3);
    		RowRenderData headerData = new RowRenderData(listCellRenderDatas);
    		headerData.setRowStyle(tStyle);		
    		headerData.setCells(listCellRenderDatas);
    		
    		List<RowRenderData> listRowList = new ArrayList<RowRenderData>();
    		
    		//将数据存储为了后边生成图样式
    		List<String> devname = new ArrayList<String>();
    		List<Double> useRate = new ArrayList<Double>();
    		List<Integer> useYear = new ArrayList<Integer>();
    		
    		for(int i = 0; i < 5; i++){
    			
    			//生成一行数据
    			listRowList.add(RowRenderData.build("电灯_"+i,String.valueOf(Math.random()*100)+"%",String.valueOf(i+1)));
    			
    			//存入list,为了生成图表
    			devname.add("电灯_"+i);
    			useRate.add(Math.random()*100);
    			useYear.add(i+1);
    		}
    		data.put("table",new MiniTableRenderData(headerData,listRowList));
    		
    		/* 测试图表的插入-------------------------------------*/
    		//柱状图生成
    		ChartMultiSeriesRenderData bar = new ChartMultiSeriesRenderData();
    		bar.setChartTitle("barCharts");
    		//参数为数组
    		bar.setCategories(devname.toArray(new String[devname.size()]));
    		List<SeriesRenderData> seriesRenderDatas = new ArrayList<SeriesRenderData>();
    		seriesRenderDatas.add(new SeriesRenderData("使用率",useRate.toArray(new Double[useRate.size()])));
    		seriesRenderDatas.add(new SeriesRenderData("使用年限",useYear.toArray(new Integer[useYear.size()])));
    		bar.setSeriesDatas(seriesRenderDatas);
    		data.put("barCharts",bar);
    		
    		//折线图生成
    		ChartMultiSeriesRenderData line = new ChartMultiSeriesRenderData();
    		line.setChartTitle("lineCharts");
    		//参数为数组
    		line.setCategories(devname.toArray(new String[devname.size()]));
    		List<SeriesRenderData> seriesRenderDatas1 = new ArrayList<SeriesRenderData>();
    		seriesRenderDatas1.add(new SeriesRenderData("使用率",useRate.toArray(new Double[useRate.size()])));
    		seriesRenderDatas1.add(new SeriesRenderData("使用年限",useYear.toArray(new Integer[useYear.size()])));
    		line.setSeriesDatas(seriesRenderDatas1);
    		data.put("lineCharts",line);
    		
    		//柱状图、折线图共存
    		ChartMultiSeriesRenderData barLine = new ChartMultiSeriesRenderData();
    		barLine.setChartTitle("barLineCharts");
    		barLine.setCategories(devname.toArray(new String[devname.size()]));
    		
    		List<SeriesRenderData> seriesRenderDatas2 = new ArrayList<SeriesRenderData>();
    		SeriesRenderData seriesRenderData1 = new SeriesRenderData();
    		seriesRenderData1.setName("使用率bar");
    		seriesRenderData1.setValues(useRate.toArray(new Double[useRate.size()]));
    		seriesRenderData1.setComboType(SeriesRenderData.ComboType.BAR);
    		seriesRenderDatas2.add(seriesRenderData1);
    		
    		SeriesRenderData seriesRenderData2 = new SeriesRenderData();
    		seriesRenderData2.setName("使用年限line");
    		seriesRenderData2.setValues(useYear.toArray(new Integer[useYear.size()]));
    		seriesRenderData2.setComboType(SeriesRenderData.ComboType.LINE);
    		seriesRenderDatas2.add(seriesRenderData2);
    		
    		SeriesRenderData seriesRenderData3 = new SeriesRenderData();
    		seriesRenderData3.setName("使用率line");
    		seriesRenderData3.setValues(useRate.toArray(new Double[useRate.size()]));
    		seriesRenderData3.setComboType(SeriesRenderData.ComboType.LINE);
    		seriesRenderDatas2.add(seriesRenderData3);
    		
    		SeriesRenderData seriesRenderData4 = new SeriesRenderData();
    		seriesRenderData4.setName("使用年限bar");
    		seriesRenderData4.setValues(useYear.toArray(new Integer[useYear.size()]));
    		seriesRenderData4.setComboType(SeriesRenderData.ComboType.BAR);
    		seriesRenderDatas2.add(seriesRenderData4);
    		
    		barLine.setSeriesDatas(seriesRenderDatas2);
    		data.put("barLineCharts",barLine);
    		
    		//饼状图
    		ChartSingleSeriesRenderData pie = new ChartSingleSeriesRenderData();
    		pie.setChartTitle("饼状图");
    		pie.setCategories(devname.toArray(new String[devname.size()]));
    		pie.setSeriesData(new SeriesRenderData("电灯数量",new Integer[]{120,25,89,65,49}));
    		data.put("pie", pie);

    4)写入数据导出

    		/*将输入写入模板中------------------------------------------*/
    		try {
    			//将map数据放入模板
    			template.render(data);
    			//模板数据写入
    			template.write(out);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		out.flush();
    		out.close();
    		template.close();

     

    只写了用到的变量,还可以导入图片,可以参考官方文档。参考链接:http://deepoove.com/poi-tl/

    展开全文
  • 写了一个月 4月20-5月20,终于完成 …一个日报 大多es查的数据,有一点mysql查的数据 先占个坑,回头有空记录一下

    写了一个月 4月20-5月20,终于完成 …一个日报
    大多es查的数据,有一点mysql查的数据
    先占个坑,回头有空记录一下

    展开全文
  • 在参考文章的基础上,增加了模板样例 模板样例地址 百度网盘 链接:https://pan.baidu.com/s/16qDvE2-V-tpX_bY8NNnepw 提取码:yhbd 这个必须引入poi4i.0以上版本,以验证过 完整pom.xml内容: <?xml...

    本文参考地址:https://blog.csdn.net/u014427811/article/details/100771314
    在参考文章的基础上,增加了模板样例
    模板样例地址 百度网盘
    链接:https://pan.baidu.com/s/16qDvE2-V-tpX_bY8NNnepw
    提取码:yhbd
    这个必须引入poi4.0以上版本,以验证过
    完整pom.xml内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.turing</groupId>
        <artifactId>report</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>report</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.0</version>
            </dependency>
    
    
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    数据这块完全拷贝大哥的

    package com.turing.report.controller;
    
    import org.apache.poi.ooxml.POIXMLDocumentPart;
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.util.Units;
    import org.apache.poi.xwpf.usermodel.*;
    import org.apache.xmlbeans.XmlCursor;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author :MaWT
     * @date :Created in 2020/2/21 11:40
     * @description:
     * @modified By:
     * @version: $
     */
    @RestController
    public class ReportController {
    
    
    
        @GetMapping("export")
        public static void export() throws Exception {
    
            final String returnurl = "C:\\Users\\wangcan\\Desktop\\data\\reportTemplate-word.docx";  // 结果文件
    
            final String templateurl = "C:\\Users\\wangcan\\Desktop\\templates\\reportTemplate-word.docx";  // 模板文件
    
            InputStream is = new FileInputStream(new File(templateurl));
            XWPFDocument doc = new XWPFDocument(is);
    
            // 替换word模板数据
            replaceAll(doc);
    
            // 保存结果文件
            try {
                File file = new File(returnurl);
                if (file.exists()) {
                    file.delete();
                }
                FileOutputStream fos = new FileOutputStream(returnurl);
                doc.write(fos);
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * @Description: 替换段落和表格中
         */
        public static void replaceAll(XWPFDocument doc) throws InvalidFormatException, IOException {
            doParagraphs(doc); // 处理段落文字数据,包括文字和表格、图片
            doCharts(doc);  // 处理图表数据,柱状图、折线图、饼图啊之类的
        }
    
    
        /**
         * 处理段落文字
         *
         * @param doc
         * @throws InvalidFormatException
         * @throws FileNotFoundException
         * @throws IOException
         */
        public static void doParagraphs(XWPFDocument doc) throws InvalidFormatException, IOException {
    
            // 文本数据
            Map<String, String> textMap = new HashMap<String, String>();
            textMap.put("var", "我是被替换的文本内容");
    
            // 图片数据
            Map<String, String> imgMap = new HashMap<String, String>();
            imgMap.put("img", "E:\\idea\\timg.jpg");
    
    
            /**----------------------------处理段落------------------------------------**/
            List<XWPFParagraph> paragraphList = doc.getParagraphs();
            if (paragraphList != null && paragraphList.size() > 0) {
                for (XWPFParagraph paragraph : paragraphList) {
                    List<XWPFRun> runs = paragraph.getRuns();
                    for (XWPFRun run : runs) {
                        String text = run.getText(0);
                        if (text != null) {
    
                            // 替换文本信息
                            String tempText = text;
                         //   String key = tempText.replaceAll("\\{\\{", "").replaceAll("}}", "");
                            if (!StringUtils.isEmpty(textMap.get(text))) {
                                run.setText(textMap.get(text), 0);
                            }
    
                            // 替换图片内容 参考:https://blog.csdn.net/a909301740/article/details/84984445
                            String tempImgText = text;
                         //   String imgkey = tempImgText.replaceAll("\\{\\{@", "").replaceAll("}}", "");
                            if (!StringUtils.isEmpty(imgMap.get(text))) {
                                String imgPath = imgMap.get(text);
                                try {
                                    run.setText("", 0);
                                    run.addPicture(new FileInputStream(imgPath), Document.PICTURE_TYPE_PNG, "img.png", Units.toEMU(200), Units.toEMU(200));
    
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
    
                            // 动态表格
                            if (text.contains("table")) {
                                run.setText("", 0);
                                XmlCursor cursor = paragraph.getCTP().newCursor();
                                XWPFTable tableOne = doc.insertNewTbl(cursor);// ---这个是关键
    
                                // 设置表格宽度,第一行宽度就可以了,这个值的单位,目前我也还不清楚,还没来得及研究
                                tableOne.setWidth(8500);
    
                                // 表格第一行,对于每个列,必须使用createCell(),而不是getCell(),因为第一行嘛,肯定是属于创建的,没有create哪里来的get呢
                                XWPFTableRow tableOneRowOne = tableOne.getRow(0);//行
                                PoiWordTools.setWordCellSelfStyle(tableOneRowOne.getCell(0), "微软雅黑", "9", 0, "left", "top", "#000000", "#B4C6E7", "10%", "序号");
                                PoiWordTools.setWordCellSelfStyle(tableOneRowOne.createCell(), "微软雅黑", "9", 0, "left", "top", "#000000", "#B4C6E7", "45%", "公司名称(英文)");
                                PoiWordTools.setWordCellSelfStyle(tableOneRowOne.createCell(), "微软雅黑", "9", 0, "left", "top", "#000000", "#B4C6E7", "45%", "公司名称(中文)");
    
                                // 表格第二行
                                XWPFTableRow tableOneRowTwo = tableOne.createRow();//行
                                PoiWordTools.setWordCellSelfStyle(tableOneRowTwo.getCell(0), "微软雅黑", "9", 0, "left", "top", "#000000", "#B4C6E7", "10%", "一行一列");
                                PoiWordTools.setWordCellSelfStyle(tableOneRowTwo.getCell(1), "微软雅黑", "9", 0, "left", "top", "#000000", "#B4C6E7", "45%", "一行一列");
                                PoiWordTools.setWordCellSelfStyle(tableOneRowTwo.getCell(2), "微软雅黑", "9", 0, "left", "top", "#000000", "#B4C6E7", "45%", "一行一列");
    
    
                                // ....... 可动态添加表格
                            }
                        }
                    }
                }
            }
        }
    
    
        /**
         * 处理图表
         *
         * @param doc
         * @throws FileNotFoundException
         */
        public static void doCharts(XWPFDocument doc) throws FileNotFoundException {
            /**----------------------------处理图表------------------------------------**/
    
            // 数据准备
            List<String> titleArr = new ArrayList<String>();// 标题
            titleArr.add("title");
            titleArr.add("金额");
    
            List<String> fldNameArr = new ArrayList<String>();// 字段名
            fldNameArr.add("item1");
            fldNameArr.add("item2");
    
            // 数据集合
            List<Map<String, String>> listItemsByType = new ArrayList<Map<String, String>>();
    
            // 第一行数据
            Map<String, String> base1 = new HashMap<String, String>();
            base1.put("item1", "材料费用");
            base1.put("item2", "500");
    
            // 第二行数据
            Map<String, String> base2 = new HashMap<String, String>();
            base2.put("item1", "出差费用");
            base2.put("item2", "300");
    
            // 第三行数据
            Map<String, String> base3 = new HashMap<String, String>();
            base3.put("item1", "住宿费用");
            base3.put("item2", "300");
    
            listItemsByType.add(base1);
            listItemsByType.add(base2);
            listItemsByType.add(base3);
    
    
            // 获取word模板中的所有图表元素,用map存放
            // 为什么不用list保存:查看doc.getRelations()的源码可知,源码中使用了hashMap读取文档图表元素,
            // 对relations变量进行打印后发现,图表顺序和文档中的顺序不一致,也就是说relations的图表顺序不是文档中从上到下的顺序
            Map<String, POIXMLDocumentPart> chartsMap = new HashMap<String, POIXMLDocumentPart>();
            //动态刷新图表
            List<POIXMLDocumentPart> relations = doc.getRelations();
            for (POIXMLDocumentPart poixmlDocumentPart : relations) {
                if (poixmlDocumentPart instanceof XWPFChart) {  // 如果是图表元素
                    String str = poixmlDocumentPart.toString();
                    System.out.println("str:" + str);
                    String key = str.replaceAll("Name: ", "")
                        .replaceAll(" - Content Type: application/vnd\\.openxmlformats-officedocument\\.drawingml\\.chart\\+xml", "").trim();
                    System.out.println("key:" + key);
    
                    chartsMap.put(key, poixmlDocumentPart);
                }
            }
    
            System.out.println("\n图表数量:" + chartsMap.size() + "\n");
    
    
            // 第一个图表-条形图
            POIXMLDocumentPart poixmlDocumentPart0 = chartsMap.get("/word/charts/chart1.xml");
            PoiWordTools.replaceBarCharts(poixmlDocumentPart0, titleArr, fldNameArr, listItemsByType);
    
            // 第二个-柱状图
            POIXMLDocumentPart poixmlDocumentPart1 = chartsMap.get("/word/charts/chart2.xml");
            PoiWordTools.replaceBarCharts(poixmlDocumentPart1, titleArr, fldNameArr, listItemsByType);
    
            // 第三个图表-多列柱状图
            doCharts3(chartsMap);
    
            // 第四个图表-折线图
            doCharts4(chartsMap);
    
            // 第五个图表-饼图
            POIXMLDocumentPart poixmlDocumentPart4 = chartsMap.get("/word/charts/chart5.xml");
            PoiWordTools.replacePieCharts(poixmlDocumentPart4, titleArr, fldNameArr, listItemsByType);
    
    
            doCharts6(chartsMap);
        }
    
    
        public static void doCharts3(Map<String, POIXMLDocumentPart> chartsMap) {
            // 数据准备
            List<String> titleArr = new ArrayList<String>();// 标题
            titleArr.add("姓名");
            titleArr.add("欠款");
            titleArr.add("存款");
    
            List<String> fldNameArr = new ArrayList<String>();// 字段名
            fldNameArr.add("item1");
            fldNameArr.add("item2");
            fldNameArr.add("item3");
    
            // 数据集合
            List<Map<String, String>> listItemsByType = new ArrayList<Map<String, String>>();
    
            // 第一行数据
            Map<String, String> base1 = new HashMap<String, String>();
            base1.put("item1", "老张");
            base1.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base1.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第二行数据
            Map<String, String> base2 = new HashMap<String, String>();
            base2.put("item1", "老李");
            base2.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base2.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第三行数据
            Map<String, String> base3 = new HashMap<String, String>();
            base3.put("item1", "老刘");
            base3.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base3.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
    
            listItemsByType.add(base1);
            listItemsByType.add(base2);
            listItemsByType.add(base3);
    
            POIXMLDocumentPart poixmlDocumentPart2 = chartsMap.get("/word/charts/chart3.xml");
            PoiWordTools.replaceBarCharts(poixmlDocumentPart2, titleArr, fldNameArr, listItemsByType);
        }
    
    
    
        public static void doCharts4(Map<String, POIXMLDocumentPart> chartsMap) {
            // 数据准备
            List<String> titleArr = new ArrayList<String>();// 标题
            titleArr.add("title");
            titleArr.add("占基金资产净值比例22222(%)");
            titleArr.add("额外的(%)");
            titleArr.add("额外的(%)");
    
            List<String> fldNameArr = new ArrayList<String>();// 字段名
            fldNameArr.add("item1");
            fldNameArr.add("item2");
            fldNameArr.add("item3");
            fldNameArr.add("item4");
    
            // 数据集合
            List<Map<String, String>> listItemsByType = new ArrayList<Map<String, String>>();
    
            // 第一行数据
            Map<String, String> base1 = new HashMap<String, String>();
            base1.put("item1", "材料费用");
            base1.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base1.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base1.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第二行数据
            Map<String, String> base2 = new HashMap<String, String>();
            base2.put("item1", "出差费用");
            base2.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base2.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base2.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第三行数据
            Map<String, String> base3 = new HashMap<String, String>();
            base3.put("item1", "住宿费用");
            base3.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base3.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base3.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
    
            listItemsByType.add(base1);
            listItemsByType.add(base2);
            listItemsByType.add(base3);
    
            POIXMLDocumentPart poixmlDocumentPart2 = chartsMap.get("/word/charts/chart4.xml");
            PoiWordTools.replaceLineCharts(poixmlDocumentPart2, titleArr, fldNameArr, listItemsByType);
        }
    
    
        /**
         * 对应文档中的第6个图表(预处理—分公司情况)
         */
        public static void doCharts6(Map<String, POIXMLDocumentPart> chartsMap) {
            // 数据准备
            List<String> titleArr = new ArrayList<String>();// 标题
            titleArr.add("title");
            titleArr.add("投诉受理量(次)");
            titleArr.add("预处理拦截工单量(次)");
            titleArr.add("拦截率");
    
            List<String> fldNameArr = new ArrayList<String>();// 字段名
            fldNameArr.add("item1");
            fldNameArr.add("item2");
            fldNameArr.add("item3");
            fldNameArr.add("item4");
    
            // 数据集合
            List<Map<String, String>> listItemsByType = new ArrayList<Map<String, String>>();
    
            // 第一行数据
            Map<String, String> base1 = new HashMap<String, String>();
            base1.put("item1", "通辽");
            base1.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base1.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base1.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第二行数据
            Map<String, String> base2 = new HashMap<String, String>();
            base2.put("item1", "呼和浩特");
            base2.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base2.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base2.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第三行数据
            Map<String, String> base3 = new HashMap<String, String>();
            base3.put("item1", "锡林郭勒");
            base3.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base3.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base3.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第四行数据
            Map<String, String> base4 = new HashMap<String, String>();
            base4.put("item1", "阿拉善");
            base4.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base4.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base4.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第五行数据
            Map<String, String> base5 = new HashMap<String, String>();
            base5.put("item1", "巴彦淖尔");
            base5.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base5.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base5.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第六行数据
            Map<String, String> base6 = new HashMap<String, String>();
            base6.put("item1", "兴安");
            base6.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base6.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base6.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第七行数据
            Map<String, String> base7 = new HashMap<String, String>();
            base7.put("item1", "乌兰察布");
            base7.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base7.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base7.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第八行数据
            Map<String, String> base8 = new HashMap<String, String>();
            base8.put("item1", "乌海");
            base8.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base8.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base8.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第九行数据
            Map<String, String> base9 = new HashMap<String, String>();
            base9.put("item1", "赤峰");
            base9.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base9.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base9.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第十行数据
            Map<String, String> base10 = new HashMap<String, String>();
            base10.put("item1", "包头");
            base10.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base10.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base10.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第十一行数据
            Map<String, String> base11 = new HashMap<String, String>();
            base11.put("item1", "呼伦贝尔");
            base11.put("item2", (int)(int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base11.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base11.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            // 第十二行数据
            Map<String, String> base12 = new HashMap<String, String>();
            base12.put("item1", "鄂尔多斯");
            base12.put("item2", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base12.put("item3", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
            base12.put("item4", (int)(1 + Math.random() * (100 - 1 + 1)) + "");
    
            listItemsByType.add(base1);
            listItemsByType.add(base2);
            listItemsByType.add(base3);
            listItemsByType.add(base4);
            listItemsByType.add(base5);
            listItemsByType.add(base6);
            listItemsByType.add(base7);
            listItemsByType.add(base8);
            listItemsByType.add(base9);
            listItemsByType.add(base10);
            listItemsByType.add(base11);
            listItemsByType.add(base12);
    
            // 下标0的图表-折线图
            POIXMLDocumentPart poixmlDocumentPart5 = chartsMap.get("/word/charts/chart6.xml");
            PoiWordTools.replaceCombinationCharts(poixmlDocumentPart5, titleArr, fldNameArr, listItemsByType);
        }
    
    
    }
    
    

    工具类也是参考的加上游客的意见

    package com.turing.report.controller;
    
    import org.apache.poi.ooxml.POIXMLDocumentPart;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.xwpf.usermodel.XWPFChart;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.openxmlformats.schemas.drawingml.x2006.chart.*;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.util.List;
    import java.util.Map;
    
    
    
    /**
     * poi生成word的工具类
     */
    @Component
    public class PoiWordTools {
     
        private static final BigDecimal bd2 = new BigDecimal("2");
     
     
        /**
         * 调用替换柱状图数据
         */
        public static void replaceBarCharts(POIXMLDocumentPart poixmlDocumentPart,
                                            List<String> titleArr, List<String> fldNameArr, List<Map<String, String>> listItemsByType) {
            XWPFChart chart = (XWPFChart) poixmlDocumentPart;
            chart.getCTChart();
     
            //根据属性第一列名称切换数据类型
            CTChart ctChart = chart.getCTChart();
            CTPlotArea plotArea = ctChart.getPlotArea();
     
            CTBarChart barChart = plotArea.getBarChartArray(0);
            List<CTBarSer> BarSerList = barChart.getSerList();  // 获取柱状图单位
     
            //刷新内置excel数据
           refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
            //刷新页面显示数据
            refreshBarStrGraphContent(barChart, BarSerList, listItemsByType, fldNameArr, 1);
     
        }
     
     
        /**
         * 调用替换折线图数据
         */
        public static void replaceLineCharts(POIXMLDocumentPart poixmlDocumentPart,
                                             List<String> titleArr, List<String> fldNameArr, List<Map<String, String>> listItemsByType) {
            XWPFChart chart = (XWPFChart) poixmlDocumentPart;
            chart.getCTChart();
     
            //根据属性第一列名称切换数据类型
            CTChart ctChart = chart.getCTChart();
            CTPlotArea plotArea = ctChart.getPlotArea();
     
            CTLineChart lineChart = plotArea.getLineChartArray(0);
            List<CTLineSer> lineSerList = lineChart.getSerList();   // 获取折线图单位
     
            //刷新内置excel数据
            refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
            //刷新页面显示数据
            refreshLineStrGraphContent(lineChart, lineSerList, listItemsByType, fldNameArr, 1);
     
        }
     
     
        /**
         * 调用替换饼图数据
         */
        public static void replacePieCharts(POIXMLDocumentPart poixmlDocumentPart,
                                            List<String> titleArr, List<String> fldNameArr, List<Map<String, String>> listItemsByType) {
            XWPFChart chart = (XWPFChart) poixmlDocumentPart;
            chart.getCTChart();
     
            //根据属性第一列名称切换数据类型
            CTChart ctChart = chart.getCTChart();
            CTPlotArea plotArea = ctChart.getPlotArea();
     
            CTPieChart pieChart = plotArea.getPieChartArray(0);
            List<CTPieSer> pieSerList = pieChart.getSerList();  // 获取饼图单位
     
            //刷新内置excel数据
            refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
            //刷新页面显示数据
            refreshPieStrGraphContent(pieChart, pieSerList, listItemsByType, fldNameArr, 1);
     
        }
     
     
        /**
         * 调用替换柱状图、折线图组合数据
         */
        public static void replaceCombinationCharts(POIXMLDocumentPart poixmlDocumentPart,
                                                    List<String> titleArr, List<String> fldNameArr, List<Map<String, String>> listItemsByType) {
            XWPFChart chart = (XWPFChart) poixmlDocumentPart;
            chart.getCTChart();
     
            //根据属性第一列名称切换数据类型
            CTChart ctChart = chart.getCTChart();
            CTPlotArea plotArea = ctChart.getPlotArea();
     
            CTBarChart barChart = plotArea.getBarChartArray(0);
            List<CTBarSer> barSerList = barChart.getSerList();  // 获取柱状图单位
            //刷新内置excel数据
            refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
            //刷新页面显示数据
            refreshBarStrGraphContent(barChart, barSerList, listItemsByType, fldNameArr, 1);
     
     
            CTBarChart barChart2 = plotArea.getBarChartArray(0);
            List<CTBarSer> barSerList2 = barChart2.getSerList();  // 获取柱状图单位
            //刷新内置excel数据
            refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
            //刷新页面显示数据
            refreshBarStrGraphContent(barChart2, barSerList2, listItemsByType, fldNameArr, 1);
     
     
            CTLineChart lineChart = plotArea.getLineChartArray(0);
            List<CTLineSer> lineSerList = lineChart.getSerList();   // 获取折线图单位
            //刷新内置excel数据
            refreshExcel(chart, listItemsByType, fldNameArr, titleArr);
            //刷新页面显示数据
            refreshLineStrGraphContent(lineChart, lineSerList, listItemsByType, fldNameArr, 1);
     
        }
     
     
        /**
         * 刷新折线图数据方法
         *
         * @param typeChart
         * @param serList
         * @param dataList
         * @param fldNameArr
         * @param position
         * @return
         */
        public static boolean refreshLineStrGraphContent(Object typeChart,
                                                         List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, int position) {
     
            boolean result = true;
            //更新数据区域
            for (int i = 0; i < serList.size(); i++) {
                //CTSerTx tx=null;
                CTAxDataSource cat = null;
                CTNumDataSource val = null;
                CTLineSer ser = ((CTLineChart) typeChart).getSerArray(i);
                //tx= ser.getTx();
                // Category Axis Data
                cat = ser.getCat();
                // 获取图表的值
                val = ser.getVal();
                // strData.set
                CTStrData strData = cat.getStrRef().getStrCache();
                CTNumData numData = val.getNumRef().getNumCache();
                strData.setPtArray((CTStrVal[]) null); // unset old axis text
                numData.setPtArray((CTNumVal[]) null); // unset old values
     
                // set model
                long idx = 0;
                for (int j = 0; j < dataList.size(); j++) {
                    //判断获取的值是否为空
                    String value = "0";
                    if (new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))) != null) {
                        value = new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))).toString();
                    }
                    if (!"0".equals(value)) {
                        CTNumVal numVal = numData.addNewPt();//序列值
                        numVal.setIdx(idx);
                        numVal.setV(value);
                    }
                    CTStrVal sVal = strData.addNewPt();//序列名称
                    sVal.setIdx(idx);
                    sVal.setV(dataList.get(j).get(fldNameArr.get(0)));
                    idx++;
                }
                numData.getPtCount().setVal(idx);
                strData.getPtCount().setVal(idx);
     
     
                //赋值横坐标数据区域
                String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0)
                        .formatAsString("Sheet1", false);
                cat.getStrRef().setF(axisDataRange);
     
                //数据区域
                String numDataRange = new CellRangeAddress(1, dataList.size(), i + position, i + position)
                        .formatAsString("Sheet1", false);
                val.getNumRef().setF(numDataRange);
     
                // 设置系列生成方向
     
     
            }
            return result;
        }
     
     
        /**
         * 刷新柱状图数据方法
         *
         * @param typeChart
         * @param serList
         * @param dataList
         * @param fldNameArr
         * @param position
         * @return
         */
        public  static boolean refreshBarStrGraphContent(Object typeChart,
                                                        List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, int position) {
            boolean result = true;
            //更新数据区域
            for (int i = 0; i < serList.size(); i++) {
                //CTSerTx tx=null;
                CTAxDataSource cat = null;
                CTNumDataSource val = null;
                CTBarSer ser = ((CTBarChart) typeChart).getSerArray(i);
                //tx= ser.getTx();
                // Category Axis Data
                cat = ser.getCat();
                // 获取图表的值
                val = ser.getVal();
                // strData.set
                CTStrData strData = cat.getStrRef().getStrCache();
                CTNumData numData = val.getNumRef().getNumCache();
                strData.setPtArray((CTStrVal[]) null); // unset old axis text
                numData.setPtArray((CTNumVal[]) null); // unset old values
     
                // set model
                long idx = 0;
                for (int j = 0; j < dataList.size(); j++) {
                    //判断获取的值是否为空
                    String value = "0";
    
                    if (new BigDecimal(dataList.get(j).get(fldNameArr.get(i+position))) != null) {
                        value = new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))).toString();
                    }
                    if (!"0".equals(value)) {
                        CTNumVal numVal = numData.addNewPt();//序列值
                        numVal.setIdx(idx);
                        numVal.setV(value);
                    }
                    CTStrVal sVal = strData.addNewPt();//序列名称
                    sVal.setIdx(idx);
                    sVal.setV(dataList.get(j).get(fldNameArr.get(0)));
                    idx++;
                }
                numData.getPtCount().setVal(idx);
                strData.getPtCount().setVal(idx);
     
     
                //赋值横坐标数据区域
                String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0)
                        .formatAsString("Sheet1", true);
                cat.getStrRef().setF(axisDataRange);
     
                //数据区域
                String numDataRange = new CellRangeAddress(1, dataList.size(), i + position, i + position)
                        .formatAsString("Sheet1", true);
                val.getNumRef().setF(numDataRange);
     
            }
            return result;
        }
     
     
     
        /**
         * 刷新饼图数据方法
         *
         * @param typeChart
         * @param serList
         * @param dataList
         * @param fldNameArr
         * @param position
         * @return
         */
        public static boolean refreshPieStrGraphContent(Object typeChart,
                                                        List<?> serList, List<Map<String, String>> dataList, List<String> fldNameArr, int position) {
     
            boolean result = true;
            //更新数据区域
            for (int i = 0; i < serList.size(); i++) {
                //CTSerTx tx=null;
                CTAxDataSource cat = null;
                CTNumDataSource val = null;
                CTPieSer ser = ((CTPieChart) typeChart).getSerArray(i);
     
                //tx= ser.getTx();
                // Category Axis Data
                cat = ser.getCat();
                // 获取图表的值
                val = ser.getVal();
                // strData.set
                CTStrData strData = cat.getStrRef().getStrCache();
                CTNumData numData = val.getNumRef().getNumCache();
                strData.setPtArray((CTStrVal[]) null); // unset old axis text
                numData.setPtArray((CTNumVal[]) null); // unset old values
     
                // set model
                long idx = 0;
                for (int j = 0; j < dataList.size(); j++) {
                    //判断获取的值是否为空
                    String value = "0";
                    if (new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))) != null) {
                        value = new BigDecimal(dataList.get(j).get(fldNameArr.get(i + position))).toString();
                    }
                    if (!"0".equals(value)) {
                        CTNumVal numVal = numData.addNewPt();//序列值
                        numVal.setIdx(idx);
                        numVal.setV(value);
                    }
                    CTStrVal sVal = strData.addNewPt();//序列名称
                    sVal.setIdx(idx);
                    sVal.setV(dataList.get(j).get(fldNameArr.get(0)));
                    idx++;
                }
                numData.getPtCount().setVal(idx);
                strData.getPtCount().setVal(idx);
     
     
                //赋值横坐标数据区域
                String axisDataRange = new CellRangeAddress(1, dataList.size(), 0, 0)
                        .formatAsString("Sheet1", true);
                cat.getStrRef().setF(axisDataRange);
     
                //数据区域
                String numDataRange = new CellRangeAddress(1, dataList.size(), i + position, i + position)
                        .formatAsString("Sheet1", true);
                val.getNumRef().setF(numDataRange);
            }
            return result;
        }
     
     
        /**
         * 刷新内置excel数据
         *
         * @param chart
         * @param dataList
         * @param fldNameArr
         * @param titleArr
         * @return
         */
        public static boolean refreshExcel(XWPFChart chart,
                                           List<Map<String, String>> dataList, List<String> fldNameArr, List<String> titleArr) {
            boolean result = true;
            Workbook wb = new XSSFWorkbook();
            Sheet sheet = wb.createSheet("Sheet1");
            //根据数据创建excel第一行标题行
            for (int i = 0; i < titleArr.size(); i++) {
                if (sheet.getRow(0) == null) {
                    sheet.createRow(0).createCell(i).setCellValue(titleArr.get(i) == null ? "" : titleArr.get(i));
                } else {
                    sheet.getRow(0).createCell(i).setCellValue(titleArr.get(i) == null ? "" : titleArr.get(i));
                }
            }
     
            //遍历数据行
            for (int i = 0; i < dataList.size(); i++) {
                Map<String, String> baseFormMap = dataList.get(i);//数据行
                //fldNameArr字段属性
                for (int j = 0; j < fldNameArr.size(); j++) {
                    if (sheet.getRow(i + 1) == null) {
                        if (j == 0) {
                            try {
                                sheet.createRow(i + 1).createCell(j).setCellValue(baseFormMap.get(fldNameArr.get(j)) == null ? "" : baseFormMap.get(fldNameArr.get(j)));
                            } catch (Exception e) {
                                if (baseFormMap.get(fldNameArr.get(j)) == null) {
                                    sheet.createRow(i + 1).createCell(j).setCellValue("");
                                } else {
                                    sheet.createRow(i + 1).createCell(j).setCellValue(baseFormMap.get(fldNameArr.get(j)));
                                }
                            }
                        }
                    } else {
                        BigDecimal b = new BigDecimal(baseFormMap.get(fldNameArr.get(j)));
                        double value = 0d;
                        if (b != null) {
                            value = b.doubleValue();
                        }
                        if (value == 0) {
                            sheet.getRow(i + 1).createCell(j);
                        } else {
                            sheet.getRow(i + 1).createCell(j).setCellValue(b.doubleValue());
                        }
                    }
                }
     
            }
            // 更新嵌入的workbook
    
            List<POIXMLDocumentPart> pxdList = chart.getRelations();
            if(pxdList!=null&&pxdList.size()>0){
                for(int i = 0;i<pxdList.size();i++){
                    if(pxdList.get(i).toString().contains("sheet")){//判断为sheet再去进行更新表格数据
                        POIXMLDocumentPart xlsPart =  pxdList.get(i);
                        OutputStream xlsOut = xlsPart.getPackagePart().getOutputStream();
    
                        try {
                            wb.write(xlsOut);
                            xlsOut.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                            result = false;
                        } finally {
                            if (wb != null) {
                                try {
                                    wb.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    result = false;
                                }
                            }
                        }
                        break;
                    }
                }
            }
            return result;
        }
     
     
        /**
         * 设置表格样式
         *
         * @param cell
         * @param fontName
         * @param fontSize
         * @param fontBlod
         * @param alignment
         * @param vertical
         * @param fontColor
         * @param bgColor
         * @param cellWidth
         * @param content
         */
        public static void setWordCellSelfStyle(XWPFTableCell cell, String fontName, String fontSize, int fontBlod,
                                                String alignment, String vertical, String fontColor,
                                                String bgColor, String cellWidth, String content) {
     
            //poi对字体大小设置特殊,不支持小数,但对原word字体大小做了乘2处理
            BigInteger bFontSize = new BigInteger("24");
            if (fontSize != null && !fontSize.equals("")) {
                //poi对字体大小设置特殊,不支持小数,但对原word字体大小做了乘2处理
                BigDecimal fontSizeBD = new BigDecimal(fontSize);
                fontSizeBD = bd2.multiply(fontSizeBD);
                fontSizeBD = fontSizeBD.setScale(0, BigDecimal.ROUND_HALF_UP);//这里取整
                bFontSize = new BigInteger(fontSizeBD.toString());// 字体大小
            }
     
            // 设置单元格宽度
            cell.setWidth(cellWidth);
     
            //=====获取单元格
            CTTc tc = cell.getCTTc();
            //====tcPr开始====》》》》
            CTTcPr tcPr = tc.getTcPr();//获取单元格里的<w:tcPr>
            if (tcPr == null) {//没有<w:tcPr>,创建
                tcPr = tc.addNewTcPr();
            }
     
            //  --vjc开始-->>
            CTVerticalJc vjc = tcPr.getVAlign();//获取<w:tcPr>  的<w:vAlign w:val="center"/>
            if (vjc == null) {//没有<w:w:vAlign/>,创建
                vjc = tcPr.addNewVAlign();
            }
            //设置单元格对齐方式
            vjc.setVal(vertical.equals("top") ? STVerticalJc.TOP : vertical.equals("bottom") ? STVerticalJc.BOTTOM : STVerticalJc.CENTER); //垂直对齐
     
            CTShd shd = tcPr.getShd();//获取<w:tcPr>里的<w:shd w:val="clear" w:color="auto" w:fill="C00000"/>
            if (shd == null) {//没有<w:shd>,创建
                shd = tcPr.addNewShd();
            }
            // 设置背景颜色
            shd.setFill(bgColor.substring(1));
            //《《《《====tcPr结束====
     
            //====p开始====》》》》
            CTP p = tc.getPList().get(0);//获取单元格里的<w:p w:rsidR="00C36068" w:rsidRPr="00B705A0" w:rsidRDefault="00C36068" w:rsidP="00C36068">
     
            //---ppr开始--->>>
            CTPPr ppr = p.getPPr();//获取<w:p>里的<w:pPr>
            if (ppr == null) {//没有<w:pPr>,创建
                ppr = p.addNewPPr();
            }
            //  --jc开始-->>
            CTJc jc = ppr.getJc();//获取<w:pPr>里的<w:jc w:val="left"/>
            if (jc == null) {//没有<w:jc/>,创建
                jc = ppr.addNewJc();
            }
            //设置单元格对齐方式
            jc.setVal(alignment.equals("left") ? STJc.LEFT : alignment.equals("right") ? STJc.RIGHT : STJc.CENTER); //水平对齐
            //  <<--jc结束--
            //  --pRpr开始-->>
            CTParaRPr pRpr = ppr.getRPr(); //获取<w:pPr>里的<w:rPr>
            if (pRpr == null) {//没有<w:rPr>,创建
                pRpr = ppr.addNewRPr();
            }
            CTFonts pfont = pRpr.getRFonts();//获取<w:rPr>里的<w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体"/>
            if (pfont == null) {//没有<w:rPr>,创建
                pfont = pRpr.addNewRFonts();
            }
            //设置字体
            pfont.setAscii(fontName);
            pfont.setEastAsia(fontName);
            pfont.setHAnsi(fontName);
     
            CTOnOff pb = pRpr.getB();//获取<w:rPr>里的<w:b/>
            if (pb == null) {//没有<w:b/>,创建
                pb = pRpr.addNewB();
            }
            //设置字体是否加粗
            pb.setVal(fontBlod == 1 ? STOnOff.ON : STOnOff.OFF);
     
            CTHpsMeasure psz = pRpr.getSz();//获取<w:rPr>里的<w:sz w:val="32"/>
            if (psz == null) {//没有<w:sz w:val="32"/>,创建
                psz = pRpr.addNewSz();
            }
            // 设置单元格字体大小
            psz.setVal(bFontSize);
            CTHpsMeasure pszCs = pRpr.getSzCs();//获取<w:rPr>里的<w:szCs w:val="32"/>
            if (pszCs == null) {//没有<w:szCs w:val="32"/>,创建
                pszCs = pRpr.addNewSzCs();
            }
            // 设置单元格字体大小
            pszCs.setVal(bFontSize);
            //  <<--pRpr结束--
            //<<<---ppr结束---
     
            //---r开始--->>>
            List<CTR> rlist = p.getRList(); //获取<w:p>里的<w:r w:rsidRPr="00B705A0">
            CTR r = null;
            if (rlist != null && rlist.size() > 0) {//获取第一个<w:r>
                r = rlist.get(0);
            } else {//没有<w:r>,创建
                r = p.addNewR();
            }
            //--rpr开始-->>
            CTRPr rpr = r.getRPr();//获取<w:r w:rsidRPr="00B705A0">里的<w:rPr>
            if (rpr == null) {//没有<w:rPr>,创建
                rpr = r.addNewRPr();
            }
            //->-
            CTFonts font = rpr.getRFonts();//获取<w:rPr>里的<w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体" w:hint="eastAsia"/>
            if (font == null) {//没有<w:rFonts>,创建
                font = rpr.addNewRFonts();
            }
            //设置字体
            font.setAscii(fontName);
            font.setEastAsia(fontName);
            font.setHAnsi(fontName);
     
            CTOnOff b = rpr.getB();//获取<w:rPr>里的<w:b/>
            if (b == null) {//没有<w:b/>,创建
                b = rpr.addNewB();
            }
            //设置字体是否加粗
            b.setVal(fontBlod == 1 ? STOnOff.ON : STOnOff.OFF);
            CTColor color = rpr.getColor();//获取<w:rPr>里的<w:color w:val="FFFFFF" w:themeColor="background1"/>
            if (color == null) {//没有<w:color>,创建
                color = rpr.addNewColor();
            }
            // 设置字体颜色
            if (content.contains("↓")) {
                color.setVal("43CD80");
            } else if (content.contains("↑")) {
                color.setVal("943634");
            } else {
                color.setVal(fontColor.substring(1));
            }
            CTHpsMeasure sz = rpr.getSz();
            if (sz == null) {
                sz = rpr.addNewSz();
            }
            sz.setVal(bFontSize);
            CTHpsMeasure szCs = rpr.getSzCs();
            if (szCs == null) {
                szCs = rpr.addNewSz();
            }
            szCs.setVal(bFontSize);
            //-<-
            //<<--rpr结束--
            List<CTText> tlist = r.getTList();
            CTText t = null;
            if (tlist != null && tlist.size() > 0) {//获取第一个<w:r>
                t = tlist.get(0);
            } else {//没有<w:r>,创建
                t = r.addNewT();
            }
            t.setStringValue(content);
            //<<<---r结束---
        }
     
    }
    
    

    模板需要按照楼主的模板来做

    展开全文
  • 1.用到以下jar包 2.准备好含有图片的word文档,另存问xml文件,改为freemark模板文件(ftl),用编译器找到 ...传入相应的数据,保存成jpg图片,转成Base64存入相应的模板变量里...至此,Java写出含柱状图word
  • 上个博客生成了一个静态的柱状图 也就是将柱状图的图片放到word里,这个博客说说 ftl文件里给他设置数据动态 1创建.docx文档模板: 类似于这样的模板 2.生成xml在线解析格式然后转ftl: 类似于这样 它...
  • word文档内容动态编辑这篇文章做进一步扩展 新增图表依赖: <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10<...
  • 通过freemarker,实现word模板中占位符的赋值以及赋值后的word文档生成。通过jfreechart生成柱状图和饼图,并在word文档中显示。
  • java使用poi在word中生成柱状图、折线图、饼图、柱状图+折线图组合图、动态表格、文本替换、图片替换、更新内置Excel数据、更新插入的文本框内容、合并表格单元格; 博客内容是,写好模板后,如何向内填写数据。...
  • 柱状图3D 太阳磁场线 余弦波3D PyQtGraph 鼠标获取X轴坐标 禁止右键点击功能、鼠标滚轮,添加滚动条等功能 工具类 滚动区相关 Animation 窗口淡入淡出 右键菜单动画 点阵特效 页面切换/图片轮播动画 窗口...
  • 求问用C#制作的数据库怎么实现对datagridview中数据的处理功能,例如出一些柱状图折线图?并且最终把这些图添加到一个word模板中并生成word文件????现在数据库已经绑定到了数据源并且可以实现添加、修改,删除等...
  • 8.低代码能力:Online在线图表(无需编码,通过在线配置方式,实现曲线图,柱状图,数据报表等,支持自定义排版布局,实现人人皆可编码) 9.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础...
  • 柱状图显示近年(多年)收支情况,以方便用户进行比较 6、用户可以根据自己的喜好来选择图形的显示效果 7、用户退出系统时,会删除用来显示图形的临时数据,以确保用户的信息安全 日程安排 部分 1、可以用来...
  • NET-DEVELOP新闻系统 v2.0

    2005-06-30 23:59:34
    集成在线调查(投票)功能,可以添加无限多的在线调查主题,每一调查主题可设定任意数量的调查选项,可以设定任意一条投调查项目于首页显示,调查结果以柱状图方式直观显示于页面,一目了然。 15.新闻搜索功能,新闻...
  • │ └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单) │ └─在线code编辑器 │ └─上传文件组件 │ └─验证码组件 │ └─树列表组件 │ └─表单禁用组件 │ └─等等 │─更多页面...
  • × 读取文件属性——完成时间,作为月度统计依据,或提供选择,以上传时间为统计口径,生成某个目录下月度成果报表,与上个月对比柱状图; × 项目目录编辑完善:ztree目录拖动; × 多关键字检索; × 项目合并和...
  • NET-DEVELOP新闻系统2.0

    2003-08-23 00:00:00
    集成在线调查(投票)功能,可以添加无限多的在线调查主题,每一调查主题可设定任意数量的调查选项,可以设定任意一条投调查项目于首页显示,调查结果以柱状图方式直观显示于页面,一目了然。 15.新闻搜索功能,...
  • LeetCode解题总结

    2018-10-09 16:02:19
    4.3 柱状图中的最大矩形面积 4.4 计算逆波兰式的值 5. 树 5.1 二叉树的遍历 5.1.1 二叉树的前、中、后序遍历 5.1.2 二叉树的层序遍历 5.1.3 恢复二叉树[hard] 5.1.4 判断两棵树是否相等 5.1.5 判断二叉树是否为AVL树...
  • 技术点十七:在线配置报表(无需编码,通过在线配置方式,实现曲线图,柱状图,数据等报表) 技术点十八:简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能 技术点十九:移动OA...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 ...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

word柱状图模板