java导出带图形的word

先看效果图:方法都是一样的,所以数据只做了前两组

第一步需要准备模版:

新建一个word插入图表,选择想要的图表。

编辑图表:营业额表示数字,季度表示文字。其他的样式编辑可根据自己的需求更改,这里略过

代码如下:

依赖

<dependencies>
    <!--poi-->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.1.2</version>
    </dependency>

    <dependency>
        <groupId>jfree</groupId>
        <artifactId>jcommon</artifactId>
        <version>1.0.16</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/jfree/jfreechart -->
    <dependency>
        <groupId>jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.0.13</version>
    </dependency>

</dependencies>d

代码:

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
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.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xwpf.usermodel.XWPFChart;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class PieChart {
    public static void main(String[] args) throws Exception {
        // 1、创建word文档对象
        String filePath = "D:\\words\\cakeshapeword.docx";
        String outputUrl = "D:\\output\\cakeshapeword.docx";
        List<Map<String, Object>> chartsList = new ArrayList<>();
        List<String> keys = new ArrayList<>();
        keys.add("一月");
        keys.add("二月");
        keys.add("三月");
        keys.add("四月");
        keys.add("五月");

        List<Integer> values = new ArrayList<>();
        values.add(100);
        values.add(150);
        values.add(130);
        values.add(190);
        values.add(200);

        chartsList = putMsgToMap(keys,values);
        createWord(filePath,outputUrl,chartsList);

    }

    public static void createWord(String filePath, String outputUrl, List<Map<String, Object>> chartsList) throws IOException, InvalidFormatException {
        InputStream is = new FileInputStream(filePath);
        XWPFDocument doc = new XWPFDocument(is);
        List<XWPFChart> charts = doc.getCharts();
        // 获取第一个图
        XWPFChart chart0 = charts.get(0);
        Workbook wordWb = chart0.getWorkbook();
        Sheet wordSheet0 = wordWb.getSheetAt(0);
        // 循环数据 赋值
        wordSheet0 = extracted(chartsList, wordSheet0);
        chart0 = extracted(chart0, chartsList, (XSSFSheet) wordSheet0);


        // 获取第二个图,没有做封装,需要的自己处理
        XWPFChart chart1 = charts.get(1);
        Workbook wordWb1 = chart1.getWorkbook();
        Sheet wordSheet1 = wordWb1.getSheetAt(0);

        List<String> keys = new ArrayList<>();
        keys.add("云大怒");
        keys.add("吕布");
        keys.add("赵云");
        keys.add("典韦");
        keys.add("关羽");

        List<Integer> values = new ArrayList<>();
        values.add(100);
        values.add(98);
        values.add(96);
        values.add(94);
        values.add(93);

        List<Map<String, Object>> chartsList1 = putMsgToMap(keys,values);
        wordSheet1 = extracted(chartsList1, wordSheet1);
        chart1 = extracted(chart1, chartsList1, (XSSFSheet) wordSheet1);

        // 获取第N个图 此处略过

        File outputFile = new File(outputUrl);
        try (OutputStream outputStream = new FileOutputStream(outputFile)) {
            doc.write(outputStream);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 饼状图循环赋值
     * @param chartsList1  数据
     * @param wordSheet1   sheet页
     * @return
     */
    public static Sheet extracted(List<Map<String, Object>> chartsList1, Sheet wordSheet1) {
        for (int i = 0; i < chartsList1.size(); i++){
            Row row = wordSheet1.getRow(i+1);
            if(null != row){
                row = wordSheet1.createRow(i+1);
            }
            Map<String,Object> dataMap = chartsList1.get(i);
            for (int y =0;y<dataMap.size();y++){
                Cell cell;
                if(row.getCell(y) == null){
                    cell = row.createCell(y);
                }else{
                    cell = row.getCell(y);
                }
                String key = y == 0 ?"name":"value";
                if(key.equals("name")){
                    cell.setCellValue(dataMap.get(key)+"");
                }else {
                    cell.setCellValue((int)dataMap.get(key));
                }
            }
        }
        return wordSheet1;
    }

    /**
     * 刷新饼图数据
     * @param chart0
     * @param chartsList
     * @param wordSheet
     * @return
     */
    public static XWPFChart extracted(XWPFChart chart0, List<Map<String, Object>> chartsList, XSSFSheet wordSheet) {
        // 刷新图表缓存
        XDDFChartData chartData = chart0.getChartSeries().get(0);
        XDDFChartData.Series series = chartData.getSeries().get(0);
        CellRangeAddress nameRangeAddress = new CellRangeAddress(1, chartsList.size(),0,0);
        CellRangeAddress valueRangeAddress = new CellRangeAddress(1, chartsList.size(),1,1);
        XDDFDataSource lineName = XDDFDataSourcesFactory.fromStringCellRange(wordSheet,nameRangeAddress);
        XDDFNumericalDataSource lineVal = XDDFDataSourcesFactory.fromNumericCellRange(wordSheet,valueRangeAddress);
        //替换原有的数据
        series.replaceData(lineName,lineVal);
        chart0.plot(chartData);
        return chart0;
    }

    /**
     * 把数值放进 map 里
     * @param name
     * @param values
     * @return
     */
    public static List<Map<String,Object>> putMsgToMap(List<String> name,List<Integer> values ){
        List<Map<String,Object>> chartsList = new ArrayList<>();
        for (int i = 0; i < name.size(); i++) {
            Map<String,Object> map = new HashMap();
            map.put("name",name.get(i));
            map.put("value",values.get(i));
            chartsList.add(map);
        }
        return chartsList;
    }
}

注意:如果有多个图表在一起,那么排序的顺序不是你图表在word里的顺序,word有自己的排序,条形第一,面积第二。其他的自行测试看看。我用的是正版微软word。其他的word我没测试过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899757.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 Vue 2 到 Vue 3:全面升级指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-从 Vue 2 到 Vue 3&#xff1a;全面升级指南 前言 随着前端技术的不断发展&#xff0c;Vue.j…

基于大型语言模型的智能网页抓取

Google Gemini 是 Google AI 创建的大型语言模型 (LLM) 系列&#xff0c;可提供最先进的 AI 功能。Gemini 模型包括&#xff1a; Gemini Ultra — 最大、最强大的模型&#xff0c;擅长处理编码、逻辑推理和创意协作等复杂任务。可通过 Gemini Advanced&#xff08;原名 Bard&a…

FreeRTOS任务状态_改进播放控制 任务管理与调度 空闲任务及其钩子函数 两个Delay函数

任务状态_改进播放控制 FreeRTOS源码概述&#xff08;内存管理&#xff0c;入口函数&#xff0c;数据类型和编程规范&#xff09;创建任务&#xff08;声光色影&#xff0c;使用任务参数&#xff09;删除任务&#xff08;使用遥控器控制音乐&#xff09;-CSDN博客https://blog…

网络信息安全工程师证2024年如何报考?了解这几点让你轻松考证!收藏这一篇就够了

网络信息安全工程师是一种专门从事网络安全工作的职业。随着互联网的快速发展和普及&#xff0c;网络安全问题也日益突出&#xff0c;因此网络信息安全工程师的需求也越来越大。 网络信息安全工程师主要负责保护网络系统和数据的安全&#xff0c;防止黑客攻击、病毒侵入、数据泄…

2.3 塑性力学—等效应力

个人专栏—塑性力学 1.1 塑性力学基本概念 塑性力学基本概念 1.2 弹塑性材料的三杆桁架分析 弹塑性材料的三杆桁架分析 1.3 加载路径对桁架的影响 加载路径对桁架的影响 2.1 塑性力学——应力分析基本概念 应力分析基本概念 2.2 塑性力学——主应力、主方向、不变量 主应力、主…

qt生成uuid,转成int。ai回答亲测可以

// 生成一个随机的UUID QUuid uuid QUuid::createUuid(); // 将UUID转换为字符串 QString uuidStr uuid.toString(QUuid::WithoutBraces);// 计算MD5哈希值 QByteArray hash QCryptographicHash::hash(uuidStr.toUtf8(), QCryptographicHash::Md5);// 提取前8个字节并转换为…

设计模式——装饰者模式(8)

一、定义 指在不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…

BigFoot BigDebuffs

BigFoot BigDebuffs 大脚插件调整目标DOT图标大小&#xff0c;其目标就是让我们自己的DOT图标大一些&#xff0c;而团队其他人小一点&#xff0c;区别开。 178新版魔兽插件站-大脚插件站-178.com BigDebuffs-v41.zip 2024.10.24下载的版本 解压文件后&#xff0c;得到一堆的…

算法魅力-双指针之滑动窗口的叛逆

#1024程序员节#征文 目录 1.滑动窗口的定义 2.算法实战 2.1 长度最小的子数组 算法思路 2.2 无重复字符的最长子串 算法思路 2.3 最大连续 1 的个数 III 算法思路 哈希表的简要补充 结束语 祝大家1024程序节快乐&#xff01;&#xff01;&#xff01; 1.滑动窗口的定…

操作系统笔记(二)进程,系统调用,I/O设备

什么是进程? 一个正在执行的程序一个包含运行一个程序所需要的所有信息的容器进程的信息保存在一个进程表中( Process Table)。进程表中的每一项对应一个进程,称为进程控制块(Process control block,PCB)。 PCB信息包括: 用户ID(UID)、进程ID(PID)…

【开源免费】基于SpringBoot+Vue.JS在线视频教育平台(JAVA毕业设计)

本文项目编号 T 027 &#xff0c;文末自助获取源码 \color{red}{T027&#xff0c;文末自助获取源码} T027&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

黑马JavaWeb-day03

文章目录 Ajax前后端分离开发前端工程化环境准备Vue项目Vue项目开发流程 Vue组件库ElementVue路由打包部署 Ajax Ajax:Asynchronous JavaScript And XML,异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器相应的数据异步交互:可以在不重新加载…

1971. 寻找图中是否存在路径

有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接&#x…

ShardingSphere 分库分表入门实战

分库分表 需求分析 如果我们的平台发展迅速&#xff0c;用户量激增&#xff0c;从数据库层面去思考&#xff0c;哪个表的数据会最大呢&#xff1f; 回顾一下我们的数据库设计&#xff1a; 1&#xff09;app 应用表 显然不会&#xff0c;成百上千的应用已经多&#xff0c;但…

Chrome DevTools:Console Performance 汇总篇

Chrome DevTools Chrome 开发者工具是一套 Web 开发者工具&#xff0c;直接内置于 Google Chrome 浏览器中。 开发者工具可以帮助您即时修改页面和快速诊断问题&#xff0c;最终帮助您更快地构建更好的网站。 一、开启 DevTools 右上角菜单 > 更多工具 > 开发者工具 页面…

2015-2022年《中国县城建设统计年鉴》面板数据附下载链接

2015-2022年《中国县城建设统计年鉴》面板数据 数据简介 《中国县城建设统计年鉴》是由住建部编辑的&#xff0c;旨在全面反映我国县城建设与发展状况的统计资料。该年鉴根据各省、自治区和直辖市建设行政主管部门上报的历年县城建设统计数据编辑而成&#xff0c;每年公布一次…

Vue-插槽slot

当我们封装一个组件时&#xff0c;不希望里面的内容写死&#xff0c;希望使用的时候能够自定义里面的内容&#xff0c;这时我们就需要使用到插槽 插槽是什么呢 插槽是子组件提供给父组件的一个占位符&#xff0c;用slot标签表示&#xff0c;父组件可以在这个标签填写任何模板代…

Python自动化测试:解锁高效测试的十大魔法秘诀!

在Python自动化测试领域&#xff0c;最佳实践能够帮助提升测试效率、确保测试质量&#xff0c;并促进团队间的协作。以下是Python自动化测试的十大最佳实践&#xff0c;使用Markdown格式进行展示&#xff1a; 1. 明确测试目标和范围 描述&#xff1a;在开始编写自动化测试之前&…

MCK主机加固与防漏扫的深度解析

在当今这个信息化飞速发展的时代&#xff0c;网络安全成为了企业不可忽视的重要议题。漏洞扫描&#xff0c;简称漏扫&#xff0c;是一种旨在发现计算机系统、网络或应用程序中潜在安全漏洞的技术手段。通过自动化工具&#xff0c;漏扫能够识别出系统中存在的已知漏洞&#xff0…