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我没测试过。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(42)MATLAB中使用fftshift绘制以零为中心的功率谱

文章目录 前言一、MATLAB代码二、仿真结果画图 前言 在分析信号的频率分量时&#xff0c;将零频分量平移到频谱中心会很有帮助。本例给出绘制以零为中心的功率谱的方法。 一、MATLAB代码 代码如下&#xff1a; f 1; % 余弦波的振荡频率&#xf…

400行程序写一个实时操作系统(十):用面向对象思想构建抢占式内核

前言 通过前几章的学习&#xff0c;我们学会了如何为RTOS设计一个合理的内存管理算法。现在&#xff0c;是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多&#xff0c;但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几&#xff0c;要么是要先怎么样再怎么…

大数据linux操作系统

第一关&#xff1a;Linux的初体验 答案&#xff1a; cd / ls -a / &#xff08;里面有空格要注意&#xff09; 第二关&#xff1a;Linux的常用命令 答案&#xff1a; touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关&#xff1a;Linux查询命令帮助语句…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件&#xff1a;PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型&#xff0c;满怀期待的检测成果时发现一点长进都…

根据语音生成视频33搜帧

33搜帧&#xff0c;是一个能根据语音生成视频的网站&#xff0c;33搜帧 - 视频帧画面搜索引擎 33搜帧是一个使用AI技术构建的视频帧画面搜索引擎&#xff0c;和一般素材平台通过视频标签来搜索视频不同&#xff0c;33搜帧能搜索到视频素材中的每一帧画面&#xff0c;这个功能可…

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

软考(网工)——网络操作系统与应用服务器

文章目录 网络操作系统与应用服务器&#x1f550;本地用户与组1️⃣Windows server 2008R2 本地用户与组2️⃣常见用户组与权限 &#x1f551;活动目录1️⃣活动目录2️⃣活动目录&#xff08;Active Directory&#xff0c;AD)3️⃣活动目录工作组分类 &#x1f552;远程桌面与…

uniapp学习(005-1 详解Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第36p-第p40的内容 文章目录 响应式尺寸单位 rpx各种工具修改ui给的图片的宽度ps操作步骤即时设计操作步骤&…

高级算法设计与分析 学习笔记13 线性规划

注意是线性规划不是动态规划哦 好家伙&#xff0c;这不是凸优化吗&#xff1f; 凸优化标准形式&#xff1a; 先改成统一最大化&#xff08;凸优化那边怎么是统一最小化&#xff1f;&#xff09; 原来的x2正负无所谓&#xff0c;但我希望每个x都是有限制的&#xff0c;所以把它改…

高德开放平台API调用实战指南

本文 一、地图展示1.1 地图初始化与展示1.2 自定义标记 二、路线规划2.1 驾车路线规划2.2 步行路线规划 三、定位服务3.1 使用JavaScript API进行定位3.2 IP定位 四、实时交通信息查询4.1 获取实时交通路况 五、智能调度引擎总结 一、地图展示 地图展示是开发基于地理信息系统…

【MySQL】设置二进制日志文件自动过期,从根源上解决占满磁盘的问题:通过修改 binlog_expire_logs_seconds 配置项

引言 MySQL的二进制日志&#xff08;binlog&#xff09;文件记录了数据库中所有更改的详细信息&#xff0c;包括但不限于对数据的插入、删除、更新&#xff0c;对表和数据库的创建、更改、删除等操作。每一次这样的操作都会在二进制日志中生成一个新的日志事件&#xff0c;并被…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容&#xff0c;默认值为前10行。 指令参数&#xff1a; -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

实现双向链表的增删改查

头文件 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; } LTNode; //v…

matlab输入汉字时,输入法在左上角显示解决办法

解决方法&#xff1a; 输入汉字时输入法在左上角显示&#xff08;如图1&#xff09;&#xff0c;将鼠标放在竖着的小点处拖动到工作区合适位置&#xff08;如图2&#xff09;&#xff0c;下次输入汉字时输入法便在图2处显示。 图1 图2

如何测试IP速度?

了解代理的连接速度是否快速是确保网络使用效率和体验的关键因素之一。本文来为大家如何有效地评估和测试代理IP的连接速度&#xff0c;以及一些实用的方法和工具&#xff0c;帮助用户做出明智的选择和决策。 一、如何评估代理IP的连接速度 1. 使用在线速度测试工具 为了快速…

OpenCV高级图形用户界面(6)获取指定窗口中图像的矩形区域函数getWindowImageRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 提供窗口中图像的矩形区域。 该函数 getWindowImageRect 返回图像渲染区域的客户端屏幕坐标、宽度和高度。 函数原型 Rect cv::getWindowImage…

Vue详细入门(语法【一】)

今天滴学习目标&#xff01;&#xff01;&#xff01; Vue1. 什么是Vue.js2. Vue是怎么使用的嘞3. MVVM是什么嘞&#xff1f;4. Vue有哪些指令1. v-bind2.v-model3.v-if 和 v-else4. v-for5. v-show6. v-on 咱们先了解一下什么是Vue&#xff0c;Vue是怎么使用的嘞&#xff0c;V…

甘特图基线-用起来了吗~

管理项目无疑是一项充满挑战的任务&#xff01;每个项目都伴随着严格的截止日期&#xff0c;因此&#xff0c;确保项目按时完成&#xff0c;并在推进过程中一一达成所有关键的里程碑&#xff0c;显得尤为重要。 为了更精准地掌握项目进展&#xff0c;利用甘特图的基线功能来捕捉…

【华为HCIP实战课程十三】OSPF网络中3类LSA及区域间负载均衡,网络工程师

一、ABR SW1查看OSPF ABR为R4而非R3,因为R4连接骨干区域0,R3没有连接到区域0 R6查看OSPF路由: 二、查看3类LSA,由于R6不是ABR因此自身不会产生3类LSA 但是有区域间路由就可以看到3类LSA

SpringMVC之 文件上传和下载

1. 文件上传 1.1 前端注意事项 文件上传操作&#xff0c;前端的表单项需要如下三项设置&#xff1a; &#xff08;1&#xff09;input标签的type属性应设置为file&#xff0c;并且注意不要在input标签中设置value属性&#xff0c;因为这可能导致文件上传不成功&#xff1b; …