java导出带图形的word

devtools/2024/10/21 17:30:52/

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

第一步需要准备模版:

新建一个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.ppmy.cn/devtools/127622.html

相关文章

vscode 远程linux服务器 连接git

vscode 远程linux服务器 连接git 1. git 下载2. git 配置1&#xff09;github 设置2&#xff09;与github建立连接linux端&#xff1a;创建密钥github端&#xff1a;创建ssh key 3. 使用1&#xff09;初始化repository2&#xff09;commit 输入本次提交信息&#xff0c;提交到本…

Ubuntu18上,解决AndroidStudio中Device Explorer无法使用,Logcat无法使用的问题

具体原因时&#xff0c;Ubuntu中&#xff0c;默认adb版本使用过低&#xff0c;sudo apt-get adb版本过低 错误原因是因为之前用 sudo apt-get install adb 安装过 adb 通过 update-alternatives 使用 android studio 里面 Tools -> sdk manager -> SDK Tools -> And…

0.36秒即可完成一次高分辨率全球海洋预报!国防科技大学推出「羲和」大模型,性能超越主流数值预报系统,预报时长可达30天

在近日举行的第 20 届 CCF HPC China 2024 大会上&#xff0c;第六届海洋数值预报与高性能计算论坛圆满落幕。在该论坛中&#xff0c;国防科技大学气象海洋学院汪祥课题组助理研究员韩毅以「羲和&#xff1a;数据驱动的全球涡可分辨海洋环境预报大模型」为主题带来了深度分享。…

常用Python数据分析开源库:Numpy、Pandas、Matplotlib、Seaborn、Sklearn介绍

文章目录 1. 常用Python数据分析开源库介绍1.1 Numpy1.2 Pandas1.3 Matplotlib1.4 Seaborn1.5 Sklearn 1. 常用Python数据分析开源库介绍 1.1 Numpy Numpy(Numerical Python)是Python数据分析必不可少的第三方库&#xff0c;Numpy的出现一定程度上解决了Python运算性能不佳的…

Linux LCD 驱动实验

LCD 是很常用的一个外设&#xff0c;在裸机篇中我们讲解了如何编写 LCD 裸机驱动&#xff0c;在 Linux 下LCD 的使用更加广泛&#xff0c;再搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Framebuffer 设备 先来…

Gorm操作数据库,有和没有WithContext的区别

问题的提出 本人是Go服务器的新中新中新手&#xff0c;在使用数据库操作时&#xff0c;看到代码中有些查询语句会先调用WithContext再查询&#xff0c;如&#xff1a; //有WithContext dao.WinUser.WithContext(l.ctx).Where(...)//没有WithContext dao.WinUser.Where(...) …

第六章 元素应用CSS

6.1 使用CSS设置字体样式 6.1.1.字体类型 CSS 提供 font-family属性来控制文本的字体类型。 格式如下&#xff1a; font-family:字体名称; 参数&#xff1a;字体名称按优先顺序排列&#xff0c;以逗号隔开。如果字体名称包含空格&#xff0c;则应用引号括起。 说明&#xff…

电机学习-Park变换

一、Park变换 坐标关系&#xff1a; I d I α ∗ c o s θ e I β ∗ s i n θ e I_d I_\alpha*cos\theta_e I_\beta*sin\theta_e Id​Iα​∗cosθe​Iβ​∗sinθe​ I q − I α ∗ s i n θ e I β ∗ c o s θ e I_q -I_\alpha*sin\theta_e I_\beta*cos\theta_…