简单使用POI对word进行基本导出(段落、表格)

使用场景

最近遇到帮同事做一个多选运动员选择几个运动员就导出几个运动员生成表格,同时还要输出固定文字的word的这样一个功能。我公司一般导出功能都是导出Excel,导出word功能也一般差不多都是使用特定字符串进行替换,没有类似这次这样的需求,在开始百度了一两天后,搜索到的基本上都是已经写好,而且不一定用的了一些代码,而且大部分都没注释,新手看起来及其痛苦,在痛苦了一天半后,我决定重头开始学习POI所以也有了这篇文章。

效果展示

使用步骤

一、插入依赖

     <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency>

二、编写代码
第一步是先创建word文档对象,它是POI对word进行操作的必经之路。

        //创建word文档对象XWPFDocument document = new XWPFDocument();

创建好word文档对象才能开始接下来的步骤
第二步使用文档对象进行创建标题等操作

        //这行代码是创建标题XWPFParagraph title = document.createParagraph();

设置段落

        //设置段落居中title.setAlignment(ParagraphAlignment.valueOf(STJc.INT_CENTER));
//        //设置段落左对齐
//        title.setAlignment(ParagraphAlignment.valueOf(STJc.INT_LEFT));
//        //设置段落右对齐
//        title.setAlignment(ParagraphAlignment.valueOf(STJc.INT_RIGHT));

开始编写内容

        XWPFRun titleRun = title.createRun();
//        titleRun.setColor("00000");titleRun.setFontSize(20);titleRun.setFontFamily("宋体");titleRun.setBold(true);titleRun.setText("浙江省体育局关于拟授予灵运等42人宝藏男孩称号进行公示的通知");titleRun.addBreak(); //换行

这样差不多就完成了最简单的word导出了。如果还需要新增段落就反复添加以上代码如下。

        XWPFRun titleRun = title.createRun();
//        titleRun.setColor("00000");titleRun.setFontSize(20);titleRun.setFontFamily("宋体");titleRun.setBold(true);titleRun.setText("某某省体育局关于拟授予灵运等42人宝藏男孩称号进行公示的通知");titleRun.addBreak(); //换行//添加第一个段落XWPFParagraph paragraph1 = document.createParagraph();//设置之段落左对齐paragraph1.setAlignment(ParagraphAlignment.valueOf(STJc.INT_LEFT));// ---------以上是设置整段的,以下为设置内容XWPFRun firstRun = paragraph1.createRun();firstRun.setFontSize(13);firstRun.setFontFamily("黑体");firstRun.addTab();firstRun.setText("各市体育局、各有关训练单位:" +"根据《运动员技术等级管理办法》的规定,现对拟授予灵运等42人宝藏男孩称号(具体名单见附件)进行公示。公示期为2021年12月28日-2022年1月6日(七个工作日)。");firstRun.addBreak(); //换行firstRun.addTab();firstRun.setText("公示期内,如对上述名单有异议,任何单位和个人均可以电话、书面或其他形式向省体育局机关纪委和体育竞赛处反映问题的,需加盖单位公章;以个人名义反映问题的,需署名或当面反映。");firstRun.addBreak(); //换行//添加第二个段落XWPFParagraph paragraph2 = document.createParagraph();paragraph2.setAlignment(ParagraphAlignment.valueOf(STJc.INT_CENTER));// ---------以上是设置整段的,以下为设置内容XWPFRun firstRun1 = paragraph2.createRun();firstRun1.setFontSize(17);firstRun1.setFontFamily("黑体");firstRun1.addTab();firstRun1.setText("拟授予宝藏男孩称号人员名单");

以上就是word对段落进行导出的简单操作,以下内容就是POI对表格的基本操作。

POI导出表格其实就是创建表格,设置好表头然后再循坏添加数据,实际项目中根据要导出的对象的集合来循坏即可

一、创建表格

        //创建表格的第一步//9为列数,自行调整XWPFTable table = document.createTable(1,9);CTTbl tTbl = table.getCTTbl();CTTblPr tTblPr = tTbl.getTblPr() == null ? tTbl.addNewTblPr() : tTbl.getTblPr();CTTblWidth tTblWidth = tTblPr.isSetTblW() ? tTblPr.getTblW() : tTblPr.getTblW();

设置表格宽度

        //这个宽度是整个大表格的,不是局部或具体的单独大小,注意tTblWidth.setW(new BigInteger("10000"));tTblWidth.setType(STTblWidth.DXA);

设置表头

        //设置表头table.getRow(0).setHeight(500);setCellText(table.getRow(0).getCell(0),"序号",null,1000);setCellText(table.getRow(0).getCell(1),"技术等级",null,2000);setCellText(table.getRow(0).getCell(2),"姓名",null,2000);setCellText(table.getRow(0).getCell(3),"性别",null,1000);setCellText(table.getRow(0).getCell(4),"代表单位",null,2000);setCellText(table.getRow(0).getCell(5),"所在单位",null,2000);setCellText(table.getRow(0).getCell(6),"项目",null,2000);setCellText(table.getRow(0).getCell(7),"比赛名称",null,5000);setCellText(table.getRow(0).getCell(8),"创造成绩",null,2000);

设置表头参数

    // 设置表头 参数private static void  setCellText(XWPFTableCell cell, String text, String bgcolor, Integer width){CTTc ctTc = cell.getCTTc();CTTcPr ctTcPr = ctTc.addNewTcPr();ctTcPr.addNewTcW().setW(BigInteger.valueOf(width));
//        cell.setColor(bgcolor);cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);CTTcPr ctPr = ctTc.addNewTcPr();ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);cell.setText(text);}

接下来就是循坏生成表格以及导出对象字段信息,由于代码过于简单、重复,我就不多说,各位哥哥姐姐,把代码看完就懂了,没看明白的话把demo跑起来玩玩也就差不多。

        Integer j = 0;/*** maxCount不能写0*/for (LevelAthleteApplyBean athleteApply : list) {//这个是在表格的添加,添加到第几行XWPFTableRow row = table.insertNewTableRow(j+1);//设置单元格高row.setHeight(1000);for (int i = 0; i < 9; i++ ) {XWPFTableCell cell = row.createCell();CTTc ctTc = cell.getCTTc();CTTcPr ctTcPr = ctTc.addNewTcPr();if(i == 0){ctTcPr.addNewTcW().setW(BigInteger.valueOf(1000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);cell.setText(i+1+"");}if(i == 1){  //  技术等级ctTcPr.addNewTcW().setW(BigInteger.valueOf(2000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if(StringUtils.isNotBlank(athleteApply.getLevelName())){cell.setText(athleteApply.getLevelName());}else{cell.setText(null);}}if(i == 2){  // 姓名ctTcPr.addNewTcW().setW(BigInteger.valueOf(2000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getTeenName())) {cell.setText(athleteApply.getTeenName());}else{cell.setText(null);}}if(i == 3){  //性别ctTcPr.addNewTcW().setW(BigInteger.valueOf(1000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getTeenSex())) {cell.setText(athleteApply.getTeenSex());}else{cell.setText(null);}}if(i == 4){  // 代表单位ctTcPr.addNewTcW().setW(BigInteger.valueOf(2000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getRepresentUnit())) {cell.setText(athleteApply.getRepresentUnit());}else{cell.setText(null);}}if(i == 5){  //所在单位ctTcPr.addNewTcW().setW(BigInteger.valueOf(2000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getWorkUnit())) {cell.setText(athleteApply.getWorkUnit());}else{cell.setText(null);}}if(i == 6){  // 项目ctTcPr.addNewTcW().setW(BigInteger.valueOf(2000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getItemFen())) {cell.setText(athleteApply.getItemFen());}else{cell.setText(null);}}if(i == 7){  // 比赛名称ctTcPr.addNewTcW().setW(BigInteger.valueOf(5000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getActName())) {cell.setText(athleteApply.getActName());}else{cell.setText(null);}}if(i == 8){  //创造成绩ctTcPr.addNewTcW().setW(BigInteger.valueOf(2000));cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);if (StringUtils.isNotBlank(athleteApply.getGrade())) {cell.setText(athleteApply.getGrade());}else{cell.setText(null);}}}}

到这POI的代码就差不多了,但还没用IO溜进行输出,以下的代码为word生成与浏览器下载

        // 没有路径 就创造路径File savefile = new File(path);if (!savefile.exists()) {savefile.mkdirs();}athleteName = path + "一级运动员称号公示" + currentMill + ".docx";FileOutputStream fos = new FileOutputStream(athleteName);document.write(fos);fos.close();FileUtil.downloadFile(response, athleteName);

注:FileUtil为浏览器下载工具类,代码也丢在下方。

package com.sport.grade_athlete;import javax.servlet.http.HttpServletResponse;
import java.io.*;/**** 灵运* 2021/9/2**/
public class FileUtil {public static String downloadFile(HttpServletResponse response, String filePath) {String[] strArray=filePath.split("/");String filename=strArray[strArray.length-1];response.setHeader("Access-Control-Expose-Headers","Content-Disposition");response.setCharacterEncoding("UTF-8");response.setHeader("content-type", "application/octet-stream");response.setContentType("application/octet-stream");try {response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));} catch (UnsupportedEncodingException e2) {e2.printStackTrace();}byte[] buff = new byte[1024];BufferedInputStream bis = null;OutputStream os = null;try {os = response.getOutputStream();bis = new BufferedInputStream(new FileInputStream(new File(filePath)));int i = bis.read(buff);while (i != -1) {os.write(buff, 0, buff.length);os.flush();i = bis.read(buff);}} catch (FileNotFoundException e1) {//e1.getMessage()+"系统找不到指定的文件";return "系统找不到指定的文件";} catch (IOException e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}}return "success";}
}

文章写到这就结束了,但在多说两句,现在在对word与excel进行导入导出功能时其实使用对POI进行封装的工具可以更简单实现导入导出,这样的工具比如有 esayPOI、esayExcel、或者是hutool。(都有易读的官方使用文档)但也有小伙伴可能跟我一样,因为项目以前大量使用了原生POI来写了很多导入导出功能,导致再使用esayPOI这样的封装框架可能会出现依赖冲突等问题的情况在,所以就写下来这篇文章,时间也不早了,溜了溜了。

POI对word进行基本导出(段落、表格)相关推荐

  1. Java使用poi根据word模板进行导出(有效可行)

    最近一直在做与导出这部分相关的事情,有一个就是需要将数据库中查询到的信息写入到word模板中再进行导出.下面的代码直接复制使用即可,没啥毛病,无论是段落中的,还是表格中的,都是有效的.使用过程中遇到的 ...

  2. POI 写word,添加标题,表格,图片,自动生成目录,合并单元格

    工程地址:https://github.com/zheng-chang-wei/word package com.example.demo1.poi;import org.apache.poi.xwp ...

  3. 使用poi,word转pdf后,表格文字靠下

    修改word的xml文件 https://github.com/opensagres/xdocreport/issues/457

  4. Poi 设置word文档中的表格边框

    https://blog.csdn.net/qq_31189355/article/details/80438506 下面代码分别设置XWPFTable上下左右实线黑色边框,放到头部定义就好.定义完成 ...

  5. POI操作word在标签位置插入表格

    XmlCursor cursor = p.getCTP().newCursor(); XWPFParagraph par = p.getDocument().insertNewParagraph(cu ...

  6. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  7. poi导出word:包括**普通的段落以及表格**。常用的**api**已经以注释的方式写了进去。

    poi导出word:包括普通的段落以及表格.常用的api已经以注释的方式写了进去. 代码如下: /* * @(#)WordExport.java * Copyright (c) * All right ...

  8. POI生成word文档,包括标题,段落,表格,统计图(非图片格式)

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.POI为"P ...

  9. 【word导出】JAVA使用POI实现word导出表格并简单设置样式

    参考资料 Java POI导出word文件及生成表格 POI官方文档网站 如何让表格中的文字居中 XWPFTableRow rowBt = table.createRow(); XWPFTableCe ...

最新文章

  1. SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考
  2. 【Linux】Makefile文件
  3. mysql 优化方法有哪些?
  4. UCMA(OCS) 开发系列之一
  5. 我的记事本(VB6)
  6. 中国省份名称的映射字典
  7. ps矩形框的宽高值如何显示像素单位
  8. 智算时代里,浪潮存储的使命与担当
  9. git 删除历史commit
  10. CSCD(2015-2016年)来源期刊目录中国科学引文数据库
  11. 服务器显示断开网络驱动器,断开网络驱动器 快速映射盘符
  12. 重装战姬服务器维护,重装战姬2020年10月1日更新维护公告_重装战姬2020年10月1日更新了什么_玩游戏网...
  13. 浅层砂过滤器的原理是什么,滤料是什么,需要不需要定期?
  14. 对首次认定为虹口区四新示范企业给予20万元奖励
  15. Unity Shader - 板砖日志 - 简单的树、草 等植物的 随风飘扬 动画
  16. VS2017_扩大程序运行内存
  17. OJ每日一练——空气质量指数
  18. 开源 免费 java CMS - FreeCMS1.4-统计分析
  19. php整么新建站点,PHP动态创建Web站点的方法
  20. 嵌入式与UML建模 mbus通断阀

热门文章

  1. 2022年全球市场光耦合器总体规模、主要生产商、主要地区、产品和应用细分研究报告
  2. 微软官方确认新浏览器Edge不再支持Silverlight
  3. 必看!必看!必看!解决登录阿里云官网显示:您的登录IP不在管理员配置的登录掩码范围内相关问题
  4. STM32驱动K210人脸识别模块经验汇总
  5. android 百度人脸识别,百度人脸识别模块使用分享
  6. 打开xlsx文件时自动打开personal.xlsb表格文件
  7. 近期大规模 4.3,2.3.1 问题小结
  8. matlab普通图像转化为索引图像,图像类型的转换
  9. 功能农业育种 国稻种芯-何登骥:广西稻作文化园农业大健康
  10. 研究生学位论文质量快速下滑,写作水平非常低劣,学生任性急躁,工匠精神缺失,论文看不出热爱和用心...