产品需求

近期产品提了一个需求,要求我们将查询出来的数据以表格的形式保存在excel和word文档中,excel的单元格有强大的适应性和扩展性,基本无难度,但是word,嗯,要兼容wps word和Microsoft Word,一言难尽。

 /*** 导出word文件*/public static XWPFDocument createXWPFDocument(List<Map<String, Object>> data,List<String> fileds) throws Exception {//创建word文档XWPFDocument doc = new XWPFDocument();//创建表头createTitleParagraph(doc);//写入数据if(CollectionUtils.isNotEmpty(data)){createCell(doc, data,fileds);}//返回文档return doc;}/*** 创建表格的样式标题** @param document*/public static void createTitleParagraph(XWPFDocument document) {//新建一个标题段落对象(就是一段文字)XWPFParagraph titleParagraph = document.createParagraph();//样式居中titleParagraph.setAlignment(ParagraphAlignment.CENTER);//创建文本对象XWPFRun titleFun = titleParagraph.createRun();//设置标题的名字titleFun.setText("报告报表word文档导出");//加粗titleFun.setBold(true);//设置颜色titleFun.setColor("000000");//字体大小titleFun.setFontSize(20);//设置字体titleFun.setFontFamily("Courier");//换行titleFun.addBreak();}/*** 创建单元格并存储数据** @param document*/public static void createCell(XWPFDocument document, List<Map<String, Object>> data,List<String> fileds) {XWPFTable infoTable = document.createTable();//设置单元格表头,这个地方是做了一个汉化表头的处理List<String> assetHeadTemp = getAssetHeadTemp(fileds);//设置单元格内字体大小,因为产品需求最多有10列,为了让字体正常显示,所以对字体大小调节int fontSize = 0;if(assetHeadTemp.size()>5){fontSize = 7;}else {fontSize = 10;}//获取每列的列宽long columnWidth  = new Double(Math.floor(8000/assetHeadTemp.size())).longValue();//遍历要添加的数据的listfor (int i = 0; i <= data.size() ; i++) {//为表格添加行XWPFTableRow newRow = infoTable.insertNewTableRow(i + 1);//遍历list中的字符串数组for (int j = 0; j < assetHeadTemp.size(); j++) {//在新增的行上面创建cell,并设置对齐方式为居中newRow.createCell().setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTH);//设置单元格样= 式XWPFTableCell cell = newRow.getCell(j);
//                //设置单元格宽度CTTcPr tcpr = cell.getCTTc().addNewTcPr();CTTblWidth cellW = tcpr.addNewTcW();cellW.setType(STTblWidth.DXA);cellW.setW(BigInteger.valueOf(columnWidth));//创建段落对象XWPFParagraph p=cell.addParagraph();//创建文本对象XWPFRun run = p.createRun();//可以换行,可以换行,可以换行,重要的事情说三遍,这个地方很重要run.addBreak();if (i == 0) {run.setText(assetHeadTemp.get(j));}else {Map<String, Object> map = data.get(i - 1);String key = fileds.get(j);if (map.get(key) == null) {//给每个cell赋值。run.setText("");} else {run.setText(key.equals(DIMENSION_PREFIX+"_cw_raw_time")?DateUtil.convertTimeToString(Long.parseLong(map.get(key).toString())):map.get(key).toString());}}run.setFontSize(fontSize);}}//删除第一空白行infoTable.removeRow(0);//写完数据后调整单元格样式//设置表格宽CTTbl table = infoTable.getCTTbl();CTTblPr pr = table.getTblPr();CTTblWidth tblW = pr.getTblW();tblW.setW(BigInteger.valueOf(8000));tblW.setType(STTblWidth.DXA);pr.setTblW(tblW);table.setTblPr(pr);CTJc jc = pr.addNewJc();jc.setVal(STJc.LEFT);pr.setJc(jc);//使布局固定,不随内容改变宽度,这个非常非常非常重要,如果不固定布局,一个单元格里边的字符长度成百上千的时候,单元格就会放飞自我,就像下边的例图一样,惨不忍睹。另附一张加上下边固定布局之后的代码格式。。CTTblLayoutType t = pr.isSetTblLayout()?pr.getTblLayout():pr.addNewTblLayout();t.setType(STTblLayoutType.FIXED);}/*** 翻译表头信息* @return*/private static  List<String> getAssetHeadTemp(List<String> fileds){List<String> assetHeadTemp = new ArrayList<>();fileds.forEach(field->{if(field.startsWith(DIMENSION_PREFIX)){assetHeadTemp.add(LogFieldsEnum.getChinese(field.replace(DIMENSION_PREFIX,""))+"(聚合维度)");} else {assetHeadTemp.add(LogFieldsEnum.getChinese(field));}});System.out.println("获得的表头信息是:"+assetHeadTemp);return assetHeadTemp;}


关于poi word 文档生成的那些坑坑洼洼相关推荐

  1. Word文档生成神器:开源项目poi.tl使用介绍

    导航: Word文档生成神器:开源项目poi-tl使用介绍 一. 概述 1.1 适合的场景 1.2 poi-tl的优势 二. poi-tl实例演示: 2.1 使用poi-tl生成word文档 三. 更 ...

  2. 文档转成html在线预览,java poi Word文档转为HTML文件 实现在线预览功能

    Java代码 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; im ...

  3. 如何将word文档生成二维码

    最近遇到很多客户咨询如何将word文档生成二维码,如何将视频生成二维码,目前二维码中是无法直接储存word文档,视频一类的,唯一的途径就是先把文档和视频信息上传到网站服务器上,然后在二维码生成器中利用 ...

  4. word文档生成目录的方法,word生成目录之后怎么修改页码

    word文档生成目录步骤,包括撰写标题.层级化标题.插入空白页.引入目录四个步骤.word文档生成目录后怎么修改页码?自动生成的目录,可通过自动更新页码的方式修改页码,无须手动修改.接下来,以Micr ...

  5. word文档生成PDF文档时候自动生成书签方法

    0 Preface/Foreword 在日常工作中,经常需要写技术文档,为了排版美观,一般会选择word,这样就可以生成目录. word文件可以很方便生产PDF文档,方便分享给同事. 在阅读PDF文档 ...

  6. 计算机生成目录步骤word,如何在word文档生成目录

    如何在word文档生成目录 随着科技的进步,电脑越来月成为我们生活中不可缺少的一部分.用电脑制作相应的word文档也是我们日常生活中离不开的工作内容与操作任务.那么,用word制作文档,就要涉及到生成 ...

  7. python之word文档生成

    python之word文档生成 python-docx官方文档 python-docx操作word文档 python文件读取操作 excel文件操作 python-docx官方文档 Document ...

  8. java word文档生成目录_Java使用POI添加Word文档的目录(Table of contents)

    不废话,直接放代码吧. public class AddTOC { public static void main(String[] args) throws IOException, Invalid ...

  9. java word文档生成_java生成word文档

    java生成word文档有多种方式: 1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过JNI的方式实现 ...

最新文章

  1. 『Scrapy』爬虫框架入门
  2. PHP函数series,PHP: 简介 - Manual
  3. 分析思维导图与绘制思维导图方法介绍
  4. Day 07 艺术家是靠天赋还是努力
  5. mysql dump xtrabackup_MySQL--备份恢复【Mysqdump+xtrabackup(XBK)】
  6. 用 Hasor 谈一谈MVC设计模式
  7. LeetCode-14 最长公共前缀
  8. LeetCode 1985. 找出数组中的第 K 大整数(排序)
  9. 移动端拖拽排序 html,移动端拖拽排序
  10. sublime text3常用的一些快捷键
  11. kubernetes 启动_如何启动和组织Kubernetes聚会
  12. 程序包清单签名验证失败_数字世界的手写签名
  13. 卷积神经网络中的权值共享
  14. vc运行库各版本下载
  15. TSSD2018下载地址及更新说明
  16. 专属程序员的西游记,不是程序员读不懂哦?
  17. 百度砸120W年薪,只要这个专业,应届生也行!
  18. Js数组里删除指定的元素(不是指定的位置)
  19. 20个用户看了每天都想打开app的登录页面模板
  20. Zotero简易使用教程

热门文章

  1. 谷歌携Chromebox会议套件进入视频会议市场
  2. 分享5个黑科技APP,都是优秀好资源,手机里没有的可惜了
  3. 高通Android9设置双屏同显示
  4. Web系统测试中的重点
  5. Hive窗口函数 row_number over()和sum() over()的使用详解
  6. 动态视频目标检测和跟踪技术
  7. Unity通过鼠标点击生成网格模型
  8. 什么是FreeMarker
  9. 注解与反射 - 反射 - 操作反射
  10. spss安装剩下一个python_SPSSPython脚本在spss命令内部时停止并出现错误spss.提交()将创建一个警告...