适用场景

通过 apache poi 库导出带表格的 word 文件,并且表格的宽度可能过宽,需要纸张横向或者更大的纸张

需要的包

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</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-ooxml</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>ooxml-schemas</artifactId><version>1.1</version>
</dependency>

模板代码

import cn.hutool.extra.spring.SpringUtil;
import com.ylkj.tydb.common.service.UserService;
import com.ylkj.tydb.export.domain.HeaderCell;
import com.ylkj.tydb.export.domain.WordStyle;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;import java.math.BigInteger;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;public abstract class AbstractFileTemplate {private Date exportDate;/*** 换行符标记*/private static final String LINE_MARK = "\n";/*** A4纸宽度*/private static final BigInteger PAPER_A4_W = BigInteger.valueOf(11907);/*** A4纸高度*/private static final BigInteger PAPER_A4_H = BigInteger.valueOf(16840);public XWPFDocument exportWord() {UserService userService = SpringUtil.getBean(UserService.class);userService.setSessionUser();XWPFDocument document = new XWPFDocument();createDocument(document);return document;}/*** 创建文档方法* @param document 文档*/abstract protected void createDocument(XWPFDocument document);/*** 获取导出文件名称* @return 导出文件名称*/abstract public String getFileName();/*** 设置换行* @param value     需要换行的内容* @param paragraph 当前段落* @param style     文字格式*/protected void setText(String value, XWPFParagraph paragraph, WordStyle style) {XWPFRun run = paragraph.createRun();if (value.indexOf(LINE_MARK) > 0) {//设置换行String[] text = value.split(LINE_MARK);run = paragraph.insertNewRun(0);for (int f = 0; f < text.length; f++) {if (f == 0) {run.setText(text[f].trim());} else {run.addCarriageReturn();//硬回车run.setText(text[f].trim());}}} else {run.setText(value);}run.setColor(style.getColor());run.setFontSize(style.getFontSize());run.setBold(style.isBold());}protected WordStyle getMainTextWordStyle(){return new WordStyle();}protected WordStyle getKeyPointTextWordStyle(){WordStyle style = new WordStyle();style.setBold(true);return style;}protected void setTable(List<HeaderCell> headerData, List<LinkedHashMap<String,Object>> dataList, String tableName, XWPFDocument document, boolean pageHorizontal){//若是需要将纸张方向改变为横向,需要提前将之前的方向设定为纵向作为分割,否则会将之前的内容也变为横向if(pageHorizontal){XWPFParagraph paragraph = document.createParagraph();CTSectPr ctSectPr = paragraph.getCTP().addNewPPr().addNewSectPr();CTPageSz ctPageSz = ctSectPr.addNewPgSz();// 必须要设置下面两个参数,否则整个的代码是无效的ctPageSz.setW(PAPER_A4_W);ctPageSz.setH(PAPER_A4_H);ctPageSz.setOrient(STPageOrientation.PORTRAIT);}// 设置表格的标题setText(tableName,document.createParagraph(),getKeyPointTextWordStyle());XWPFTable infoTable = document.createTable();infoTable.setWidthType(TableWidthType.PCT);// 表格标题行XWPFTableRow headers = infoTable.getRow(0);if(headerData!=null && headerData.size()>=1){XWPFTableCell cell = headers.getCell(0);cell.setText(headerData.get(0).getLabel());cell.setWidth(headerData.get(0).getColumnWidth());}for (int i = 1; i < headerData.size(); i++) {XWPFTableCell cell = headers.addNewTableCell();cell.setText(headerData.get(i).getLabel());cell.setWidth(headerData.get(i).getColumnWidth());}// 表格的数据行for (LinkedHashMap<String,Object> item : dataList){XWPFTableRow row = infoTable.createRow();for (int cellNum = 0; cellNum < headerData.size(); cellNum++) {XWPFTableCell cell = row.getCell(cellNum);cell.setText(item.get(headerData.get(cellNum).getCode())+"");cell.setWidth(headerData.get(cellNum).getColumnWidth());}}// 若是需要将纸张方向改变为横向,在这里设置,纸张的方向由分割后最后的段落指定if(pageHorizontal){XWPFParagraph paragraph = document.createParagraph();CTSectPr ctSectPr = paragraph.getCTP().addNewPPr().addNewSectPr();CTPageSz ctPageSz = ctSectPr.addNewPgSz();// 必须要设置下面两个参数,否则整个的代码是无效的// A3纸横向 宽度为A4纸宽度两倍,高度为A4纸高度ctPageSz.setW(PAPER_A4_W.multiply(BigInteger.valueOf(2)));ctPageSz.setH(PAPER_A4_H);ctPageSz.setOrient(STPageOrientation.LANDSCAPE);}}protected void setTable(List<HeaderCell> headers, List<LinkedHashMap<String,Object>> dataList, String tableName, XWPFDocument document){setTable(headers,dataList,tableName,document,false);}public Date getExportDate() {return exportDate;}public void setExportDate(Date exportDate) {this.exportDate = exportDate;}
}

转换纸张方向的关键代码

XWPFParagraph paragraph = document.createParagraph();
CTSectPr ctSectPr = paragraph.getCTP().addNewPPr().addNewSectPr();
CTPageSz ctPageSz = ctSectPr.addNewPgSz();
// 必须要设置下面两个参数,否则整个的代码是无效的
// A3纸横向 宽度为A4纸宽度两倍,高度为A4纸高度
ctPageSz.setW(PAPER_A4_W.multiply(BigInteger.valueOf(2)));
ctPageSz.setH(PAPER_A4_H);
ctPageSz.setOrient(STPageOrientation.LANDSCAPE);

假如想要在同一个文档中多次调整纸张的方向和大小,就要在需要调节的纸张的末尾添加一个额外的段落来修改 CTSectPr对象,下面的代码会使整个文档都变成调整后的纸张样式。

CTDocument1 document1 = document.getDocument();
CTBody body = document1.getBody();
CTSectPr ctSectPr = body.addNewSectPr();
CTPageSz ctPageSz = ctSectPr.addNewPgSz();
ctPageSz.setW(PAPER_A4_W.multiply(BigInteger.valueOf(2)));
ctPageSz.setH(PAPER_A4_H);
ctPageSz.setOrient(STPageOrientation.LANDSCAPE);

另附上用到的两个实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class HeaderCell {private String code;private String label;private int span = 1;private List<HeaderCell> children;private String columnWidth = "300";public HeaderCell(String code, String label) {this.code = code;this.label = label;}public HeaderCell(String code, String label, String columnWidth) {this.code = code;this.label = label;this.columnWidth = columnWidth;}public void setChildren(List<HeaderCell> children) {if(children!=null){this.span = children.size();this.children = children;}}
}@Data
@NoArgsConstructor
@AllArgsConstructor
public class WordStyle {private String color = "000000";private int fontSize = 16;private boolean bold = false;}

POI 导出 Word 文档基础模板,导出表格和转换纸张方向相关推荐

  1. 【day22】java导出word文档(包含导出图片)

    1.[Java]使用freemarker模板技术导出word main方法测试 package com.havenliu.document;import java.io.UnsupportedEnco ...

  2. java导出word文档组件_java导出word文档(转)

    导出word文档有两种方式:第一种是使用POI,第二种是使用itext组件,下面逐渐介绍: 1.使用POI的方式:本方式目前没法改变字体样式,只能输出纯文本. /** * 试卷导出word文档 * @ ...

  3. easypoi导出word文档(文本,表格)

    文件模板 依赖导入 *坑:注意依赖版本 4.3.0+才支持多图片循环导出 <!-- word导出 方式:easypoi--><dependency><groupId> ...

  4. C# 导出word文档及批量导出word文档(2)

    aspose.word主要是通过把读取出来的数据放到datatable里,在datable里做相应的格式的调整,再导出到word文档里.mvc和webform最后导出的语句略有不同,在mvc的cont ...

  5. C# 导出word文档及批量导出word文档(3)

    在初始化WordHelper时,要获取模板的相对路径.获取文档的相对路径多个地方要用到,比如批量导出时要先保存文件到指定路径下,再压缩打包下载,所以专门写了个关于获取文档的相对路径的类. 1 #reg ...

  6. Java导出PDF文档(模板导出和自定义)

    项目场景: 需要导出PDF文档,支持模板导出和自定义文档格式. 场景分析: PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf. 解决方案: PDF模板可以 ...

  7. java实现Word 文档形式的导出功能

    关于在Java中实现导出功能,导出格式为Word文档导出,具体参考如下代码. 1 先准备好一个导出Word文档的模板. 例如: 将其存值地方用字段代替.例如: 2.打开doc文件后 ,文件中的另存为, ...

  8. Java使用POI实现导出Word文档

    POI官网链接:http://deepoove.com/poi-tl/(方便各位博友后期深入学习) 1.首先导入POM依赖包 <dependency><groupId>com. ...

  9. java用poi导出word,Java使用POI导出Word文档的操作教程,poiword

    Java使用POI导出Word文档的操作教程,poiword 一.主要pom依赖 org.apache.poi poi-ooxml 3.16 二.需要导出word模板 三.相关导出代码 package ...

最新文章

  1. 设计模式----组合模式UML和实现代码
  2. 女性程序员占比超17%,平均月薪近2万 | 程序员就业大数据报告
  3. Spring集成spymemcached
  4. 我用Python抓取了【S11全球总决赛】直播评论,EDG nb
  5. java不能弹出打印窗口,java – 如何打印一个摆动窗口,使其非常适合一页
  6. Vray材质速查手册(精讲)
  7. HotPDF Delphi PDF1.7,上传和编辑所有类型的PDF文件
  8. 在win10下,xilinx公司FPGA下载器上,指示灯不亮,设备管理器中驱动显示正常,下载器无法识别到期间
  9. PADS中常用无模命令快捷键
  10. android 友盟统计功能,Android应用中添加友盟统计
  11. 关于如何使用DirectX11进行编程的相关问题
  12. 为什么神经网络有偏置? 神经网络中的偏置(bias)究竟有这么用
  13. 20190408每周精品之理财
  14. 8个免费在线编程游戏网站,让每个人都可以学习编程
  15. 使用cpolar配置内网访问(内网穿透)教程(超详细,简单)
  16. 内卷老员工之三级缓存和伪共享
  17. oracle 表变化监控,oracle 怎么 监控数据变化
  18. 编程与数学的关系_学编程需要很好的数学吗
  19. 【日语词汇类编】自然与人:气候与环境
  20. [小甲鱼]record.txt 文档下载 文档 习题解析

热门文章

  1. 小米手机拦截返回音设置不了_手机老出现闪退怎么办?这样可以解决
  2. php简单吗,JS简单还是php简单?
  3. 虚拟机能装红旗linux吗,在虚拟机中安装红旗LINUX及制作LiveCD.doc
  4. Tableau作图技巧:动态指标分析-制作动态坐标轴
  5. 计算机双CPU,双CPU的电脑用起来,性能和功耗都是原来的两倍?
  6. centos7中通过LVM挂载新硬盘
  7. 【linux】正则表达式
  8. 用单反相机拍摄VR全景时参数设置怎么调?
  9. python成绩总分最高分_最高分是多少
  10. java/php/net/python公寓管理系统设计