1.maven导入依赖

<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>

2.工具类

package com.maxplus.analysis.utils;import org.apache.commons.lang.StringUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbls;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;import java.io.*;
import java.math.BigInteger;
import java.net.URL;
import java.util.List;/*** @author: haotengli* @date: 2022/5/26**/
public class WordUtils {/*** 添加标题** @param titleParagraph     标题* @param paragraphAlignment 标题位置 靠右 居中 靠左* @param text               标题内容* @param color              标题颜色* @param size               标题大小*/public void setXWPFParagraph(XWPFParagraph titleParagraph, ParagraphAlignment paragraphAlignment, String text,String color, int size) {//设置段落居中 ParagraphAlignment.CENTERtitleParagraph.setAlignment(paragraphAlignment);//标题添加内容XWPFRun titleParagraphRun = titleParagraph.createRun();titleParagraphRun.setText(text);titleParagraphRun.setColor(color);titleParagraphRun.setFontSize(size);}/*** word添加文本** @param paragraph 段落* @param text      段落文本* @param color     段落颜色* @param size      文本大小* @param line      行间距*/public void setXWPFParagraph(XWPFParagraph paragraph, String text, String color, int size, int line) {//行XWPFRun run = paragraph.createRun();//paragraph1.setAlignment(ParagraphAlignment.CENTER); 居中//设置行间距paragraph.setSpacingAfter(line);paragraph.setSpacingBefore(line);//内容run.setText(text);//字体颜色run.setColor(color);//字体大小run.setFontSize(size);}/*** 设置word表格自动宽高** @param infoTable 表格对象*/public void setCTTblWidth(XWPFTable infoTable) {//列宽自动分割CTTblWidth infoTableWidth = infoTable.getCTTbl().addNewTblPr().addNewTblW();infoTableWidth.setType(STTblWidth.DXA);infoTableWidth.setW(BigInteger.valueOf(9072));}/*** 操作表格某一行** @param tableName 表格某一行* @param cell      列* @param text      文本* @param color     表格颜色* @param center    文本内容是否居中*/public void setXWPFTableCell(List<XWPFTableCell> tableName, int cell, String text, String color, boolean center) {tableName.get(cell).setText(text); //为第0行第0列设置内容if (StringUtils.isNotBlank(color)) {tableName.get(cell).setColor(color);//设置颜色\}if (center) {centerTable(tableName.get(cell));//设置居中}}/*** word表格居中显示** @param cell*/public void centerTable(XWPFTableCell cell) {CTTc cttc = cell.getCTTc();CTP ctp = cttc.getPList().get(0);CTPPr ctppr = ctp.getPPr();if (ctppr == null) {ctppr = ctp.addNewPPr();}CTJc ctjc = ctppr.getJc();if (ctjc == null) {ctjc = ctppr.addNewJc();}ctjc.setVal(STJc.CENTER); //水平居中}/*** 合并列** @param table   创建的表格* @param col     合并列索引* @param fromRow 开始索引* @param toRow   终止索引*/public void mergeVertically(XWPFTable table, int col, int fromRow, int toRow) {for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {XWPFTableCell cell = table.getRow(rowIndex).getCell(col);if (rowIndex == fromRow) {cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);} else {cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);}}//合并后垂直居中table.getRow(fromRow).getCell(col).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);}/*** 合并行** @param table    创建的表格* @param row      合并行索引* @param fromCell 开始索引* @param toCell   终止索引*/public void mergeHorizontal(XWPFTable table, int row, int fromCell, int toCell) {for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {XWPFTableCell cell = table.getRow(row).getCell(cellIndex);if (cellIndex == fromCell) {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);continue;} else {cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);}}}/*** word添加图片** @param paragraph 段落对象* @param path      图片路径* @param imgName   图片名字* @param wide      宽度* @param high      高度* @throws IOException*/public void setPicture(XWPFParagraph paragraph, String path, String imgName, int wide, int high) throws IOException {//创建一个run。run具体是什么,我也不知道。但是run是这里面的最小单元了。XWPFRun run = paragraph.createRun();//使用url替代获取然后转换成流即可URL url = new URL(path);InputStream inputStream = url.openStream();//插入图片try {run.addPicture(inputStream,XWPFDocument.PICTURE_TYPE_PNG,imgName,Units.toEMU(wide),Units.toEMU(high));} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//关流inputStream.close();}/*** word生成饼图** @param document word对象* @param width    饼图宽* @param height   饼图高* @param title    饼图标题* @param member   饼图成员* @param dataNum  成员数据*/public void setPieChart(XWPFDocument document, int width, int height, String title, String[] member, Integer[] dataNum) {XWPFChart chart = null;try {chart = document.createChart(width * Units.EMU_PER_CENTIMETER, height * Units.EMU_PER_CENTIMETER);} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 标题chart.setTitleText(title);// 标题是否覆盖图表chart.setTitleOverlay(false);// 图例位置XDDFChartLegend legend = chart.getOrAddLegend();//legend.setPosition(LegendPosition.TOP_RIGHT);// CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)// 分类轴标数据,// XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(member);// 数据1,// XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));XDDFNumericalDataSource<Integer> values = XDDFDataSourcesFactory.fromArray(dataNum);// XDDFChartData data = chart.createData(ChartTypes.PIE3D, null, null);XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);// 设置为可变颜色data.setVaryColors(true);// 图表加载数据data.addSeries(countries, values);//图表上显示数据CTDLbls dLbls = chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();dLbls.addNewShowVal().setVal(false);dLbls.addNewShowLegendKey().setVal(false);dLbls.addNewShowCatName().setVal(true);//类别名称dLbls.addNewShowSerName().setVal(false);dLbls.addNewShowPercent().setVal(true);//百分比dLbls.addNewShowLeaderLines().setVal(true);//引导线dLbls.setSeparator("\n");//分隔符为分行符dLbls.addNewDLblPos().setVal(org.openxmlformats.schemas.drawingml.x2006.chart.STDLblPos.Enum.forString("inEnd"));//数据标签内// 绘制chart.plot(data);}/*** word 柱状图** @param document word对象* @param width    宽度* @param height   高度* @param title    图表名字* @param xTitle   x轴名字* @param yTitle   y轴名字* @param xMamber  x轴成员* @param yDataNum 成员数量* @param xtitle   成员名字*/public void setHistogram(XWPFDocument document, int width, int height, String title, String xTitle, String yTitle,String[] xMamber, Integer[] yDataNum, String xtitle) {// 2、创建chart图表对象,抛出异常XWPFChart chart = null;try {chart = document.createChart(width * Units.EMU_PER_CENTIMETER, height * Units.EMU_PER_CENTIMETER);} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 3、图表相关设置chart.setTitleText(title); // 图表标题chart.setTitleOverlay(false); // 图例是否覆盖标题// 4、图例设置XDDFChartLegend legend = chart.getOrAddLegend();legend.setPosition(LegendPosition.TOP); // 图例位置:上下左右// 5、X轴(分类轴)相关设置XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); // 创建X轴,并且指定位置xAxis.setTitle(xTitle); // x轴标题XDDFCategoryDataSource xAxisSource = XDDFDataSourcesFactory.fromArray(xMamber); // 设置X轴数据// 6、Y轴(值轴)相关设置XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT); // 创建Y轴,指定位置yAxis.setTitle(yTitle); // Y轴标题yAxis.setCrossBetween(AxisCrossBetween.BETWEEN); // 设置图柱的位置:BETWEEN居中XDDFNumericalDataSource<Integer> yAxisSource = XDDFDataSourcesFactory.fromArray(yDataNum); // 设置Y轴数据// 7、创建柱状图对象XDDFBarChartData barChart = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);barChart.setBarDirection(BarDirection.COL); // 设置柱状图的方向:BAR横向,COL竖向,默认是BAR// 8、加载柱状图数据集XDDFBarChartData.Series barSeries = (XDDFBarChartData.Series) barChart.addSeries(xAxisSource, yAxisSource);barSeries.setTitle(xtitle, null); // 图例标题// 9、绘制柱状图chart.plot(barChart);// 10柱状图上显示数值CTPlotArea plotArea = chart.getCTChart().getPlotArea();plotArea.getValAxArray(0).addNewMajorGridlines();// 网格线plotArea.getBarChartArray(0).getSerArray(0).addNewDLbls();plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowVal().setVal(true);plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowLegendKey().setVal(false);plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowCatName().setVal(false);plotArea.getBarChartArray(0).getSerArray(0).getDLbls().addNewShowSerName().setVal(false);}/*** word生成折线图* @param document word对象* @param width 图表宽* @param height 图表高* @param title 折线图标题* @param xTitle x轴名字* @param yTitle y轴名字* @param member x轴数据* @param dataNum y轴数据* @param name 折线名字*/public void setLineChart(XWPFDocument document, int width, int height, String title, String xTitle, String yTitle, String[] member, Integer[] dataNum, String name) {// create the chartXWPFChart chart = null;try {chart = document.createChart(width * Units.EMU_PER_CENTIMETER, height * Units.EMU_PER_CENTIMETER);} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 标题chart.setTitleText(title);// 标题覆盖chart.setTitleOverlay(false);// 图例位置XDDFChartLegend legend = chart.getOrAddLegend();legend.setPosition(LegendPosition.TOP);// 分类轴标(X轴),标题位置XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);bottomAxis.setTitle(xTitle);// 值(Y轴)轴,标题位置XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);leftAxis.setTitle(yTitle);// CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)// 分类轴标(X轴)数据,单元格范围位置[0, 0]到[0, 6]// XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(member);// 数据1,单元格范围位置[1, 0]到[1, 6]// XDDFNumericalDataSource<Double> area = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));XDDFNumericalDataSource<Integer> area = XDDFDataSourcesFactory.fromArray(dataNum);// 数据1,单元格范围位置[2, 0]到[2, 6]// XDDFNumericalDataSource<Double> population = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, 6));// LINE:折线图,XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);// 图表加载数据,折线1XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) data.addSeries(countries, area);// 折线图例标题series1.setTitle(name, null);// 直线series1.setSmooth(false);// 设置标记大小series1.setMarkerSize((short) 6);// 设置标记样式,星星series1.setMarkerStyle(MarkerStyle.STAR);// 绘制chart.plot(data);}
}

使用word工具类

​public void addWord() {WordUtils wordUtils = new WordUtils();XWPFDocument document = new XWPFDocument();//Write the Document in file systemFileOutputStream out = null;try {out = new FileOutputStream(new File("D:\\成绩分析.docx"));} catch (FileNotFoundException e) {e.printStackTrace();}//添加标题XWPFParagraph titleParagraph = document.createParagraph();wordUtils.setXWPFParagraph(titleParagraph, ParagraphAlignment.CENTER, "成绩分析", "000000", 30);population(document, wordUtils, new PopulationVo());//关流try {document.write(out);out.close();} catch (IOException e) {e.printStackTrace();}}​

java-poi实现生成word相关推荐

  1. Java使用poi-tl生成word文档

    Java使用poi-tl生成word文档,可以对模板文件进行文本替换,图片.表格.超链接添加.图表处理等.大概的说明都在代码注释里,只有一个地方需要注意,就是图表的替换,占位符{{barChart}} ...

  2. java读取word文档的复杂表格_poi读取word表格 java POI 如何读取word的表格中的表格...

    poi 操作word 2007 (如何删除word中的某一个表格)小编忘了哪年哪月的哪日小编在哪面墙上刻下张脸张微笑着忧伤着凝望小编的脸. public static void changeTable ...

  3. Java使用freemarker生成word文档并转pdf文档

    Java使用freemarker生成word文档后转pdf 先来看看效果图 进入正题 项目需求: 为订单后生成对应的pdf文档,文档内包含图片. 方案一:使用freemarker和itext把html ...

  4. Java 用 Freemarker 生成 Word 时内容换行

    一.原因 试过各种换行符 '\r' '\n' '\r\n' '(char)11' 全部都不行!!! 原因是:Java 用 Freemarker 生成 Word 时的换行符被自动解析忽略掉 二.解决方法 ...

  5. Java使用iText生成word文件的完美解决方案(亲测可行)

    JAVA生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...

  6. java poi 动态导出word表格带合并效果

    1.引入word导出所需依赖包 工作常用的excel,word导出,需要引入下面的6个主要包,和主要包依赖的其他包 ,可以看下面的表格进行依赖下载引入 这下面的两张图是主要包对应涉及到功能,可以按需要 ...

  7. Java实现freemarker生成word模板

    博主在做的是将word源文件中的内容读取出来,然后按照固定的格式输出,当然,源文件有大量,所以编写了程序来批量自动生成目标文件. 本文要介绍的就是如何生成模板,并将从源文件截取的内容填充到模板文件(即 ...

  8. Java使用iText生成word文件的完美解决方案

    Java生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...

  9. java调用PageOffice生成word

    一.在开发OA办公或与文档相关的Web系统中,难免会遇到动态生成word文档的需求,为了解决工作中遇到导出word文档的需求,前一段时间上网找了一些资料,在word导出这方面有很多工具可以使用,jac ...

  10. Java使用iText生成word文件的解决方案

    JAVA生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...

最新文章

  1. 右键命令行在这里-cmd here
  2. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
  3. html表单php比较三个值大小,PHP比较三个数大小实现办法
  4. mysql周报内容范文_Mysql各种表格查询含实例,日报,周报,月报,时间差自动计算...
  5. 一位湖北大学的学生作品,看后久久不能平静
  6. 知乎:全球发售2600万股销售股份 每股发售价51.8港元
  7. vivo正式公布全新子品牌iQOO手机:冲击5千元+旗舰手机档
  8. PyCharm: Simplify chained comparison
  9. LeetCode 144. 树的前序遍历迭代写法
  10. linux的文件解压命令,linux解压命令(linux解压文件命令)
  11. Android入门笔记04
  12. 我的网址收藏-更新日期(2014-09-04)
  13. 优质前端掘金小册推荐及优惠购买链接
  14. svn -- 客户端+服务端的下载安装及配置
  15. 计算机cpu天体图,认识一下电脑的CPU,附2019最新CPU天梯图
  16. 连续出现的字符(已通过测试)
  17. 拿下 ACM 金牌!
  18. win11怎么看电脑显卡信息
  19. 微软出手,干翻 IDEA?网友:先干翻 Eclipse 吧
  20. 阿里云吴翰清:从技术人转型做产品经理是一种什么样的体验

热门文章

  1. [paper] Meta-Learner LSTM
  2. 实验记录 | 为什么mtDNA的fastq数据会比对到常染色体上?
  3. 安装shipyard
  4. 能测试手机信号不好的软件,买手机别只看性能!教你测试手机信号好坏
  5. 3d渲染性能测试软件,3D渲染性能测试
  6. 沧小海基于xilinx srio核的学习笔记之第三章 xilinx srio核介绍(一)结构介绍
  7. python量化策略——改进的美林时钟轮动策略(一)
  8. win10怎么把两个盘合成一个,win10怎么把分区合并
  9. 论文笔记--Inductive Graph Neural Networks for Spatiotemporal Kriging
  10. 武汉大学研究生慕课《学术道德与学术规范》