poi可以操作excel表格和word文档,但是网上找的poi表格相关大多是操作excel表格,很少有word的复杂表格.
加上最近项目上也遇到了要使用java导出word多表格的问题.
开始网上找的例子大多是使用xml来操作word,后来多翻了点文章完成了word多表导出.
参考文章:
网上找的表格导出基础工具类
有使用到上面链接里面的XWPFHelperTable类和XWPFHelper类 多表导出也是基于上面博客的WordTest类修改的.

poi中相关控件中文文档

下面是我的工具类 调用里面的exportCheckWord方法得到文档对象

import java.io.IOException;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.TextAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
/*** 测试文档工具类* @author 14277**/
public class ExportWord {private XWPFHelperTable xwpfHelperTable = null;private XWPFHelper xwpfHelper = null;public ExportWord() {xwpfHelperTable = new XWPFHelperTable();xwpfHelper = new XWPFHelper();}/*** 创建好文档的基本 标题,表格 段落等部分* * @return* @Author Huangxiaocong 2018年12月16日*/public XWPFDocument createXWPFDocument() {XWPFDocument doc = new XWPFDocument();return doc;}/*** 创建表格的标题样式* * @param document* @Author Huangxiaocong 2018年12月16日 下午5:28:38*/public void createTitleParagraph(XWPFDocument document) {XWPFParagraph titleParagraph = document.createParagraph(); // 新建一个标题段落对象(就是一段文字)titleParagraph.setAlignment(ParagraphAlignment.CENTER);// 样式居中XWPFRun titleFun = titleParagraph.createRun(); // 创建文本对象// titleFun.setText(titleName); //设置标题的名字titleFun.setBold(true); // 加粗titleFun.setColor("000000");// 设置颜色titleFun.setFontSize(25); // 字体大小// titleFun.setFontFamily("");//设置字体// ...titleFun.addBreak(); // 换行}/*** 设置表格 主体内容* * @param document* @param rows* @param cols* @Author Huangxiaocong 2018年12月16日*/public XWPFTable createTableParagraph(XWPFDocument document, List<List<String>> tableList) {int rows = tableList.size();int cols = tableList.get(0).size();XWPFTable infoTable = document.createTable(rows, 4);xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);// 合并表格xwpfHelperTable.mergeCellsHorizontal(infoTable, 1, 1, cols - 1);if (rows > 4) {xwpfHelperTable.mergeCellsVertically(infoTable, 0, 3, cols - 1);}for (int col = 2; col < rows; col++) {xwpfHelperTable.mergeCellsHorizontal(infoTable, col, 0, cols - 1);}// 设置表格样式List<XWPFTableRow> rowList = infoTable.getRows();for (int i = 0; i < rowList.size(); i++) {XWPFTableRow infoTableRow = rowList.get(i);List<XWPFTableCell> cellList = infoTableRow.getTableCells();for (int j = 0; j < cellList.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);if (i > 0) {cellParagraph.setAlignment(ParagraphAlignment.LEFT);} else {cellParagraph.setAlignment(ParagraphAlignment.CENTER);}XWPFRun cellParagraphRun = cellParagraph.createRun();cellParagraphRun.setFontSize(12);}}xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);return infoTable;}/*** 设置表格 人员内容* * @param document* @param rows* @param cols* @Author Huangxiaocong 2018年12月16日*/public XWPFTable createTableParagraphRY(XWPFDocument document, List<List<String>> tableList) {int rows = tableList.size();int cols = tableList.get(0).size();XWPFTable infoTable = document.createTable(rows, cols);xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);int cosHeight = 0;// 合并表格for (int i = 0; i < tableList.size(); i++) {if (i > 0 && !tableList.get(i).get(0).equals("")) {String string = tableList.get(i).get(0);String[] split = string.split(",");int col = Integer.parseInt(split[1]);cosHeight = i + col;xwpfHelperTable.mergeCellsVertically(infoTable, 0, i, i + col - 1);}}// 设置表格样式List<XWPFTableRow> rowList = infoTable.getRows();for (int i = 0; i < rowList.size(); i++) {XWPFTableRow infoTableRow = rowList.get(i);List<XWPFTableCell> cellList = infoTableRow.getTableCells();for (int j = 0; j < cellList.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);cellParagraph.setAlignment(ParagraphAlignment.CENTER);XWPFRun cellParagraphRun = cellParagraph.createRun();cellParagraphRun.setFontSize(12);}}xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);return infoTable;}/*** 设置表格 意见表* * @param document* @param rows* @param cols* @Author Huangxiaocong 2018年12月16日*/public XWPFTable createTableParagraphJY(XWPFDocument document, List<List<String>> tableList, int jyCols) {int rows = tableList.size();int cols = tableList.get(0).size();XWPFTable infoTable = null;// 合并表格if (jyCols < 6) {infoTable = document.createTable(2, 6);xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);xwpfHelperTable.mergeCellsHorizontal(infoTable, 1, 1, 5);} else if (6 <= jyCols && jyCols < 9) {infoTable = document.createTable(2, jyCols);xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);xwpfHelperTable.mergeCellsHorizontal(infoTable, 0, 5, jyCols - 1);xwpfHelperTable.mergeCellsHorizontal(infoTable, 1, 1, jyCols - 1);} else {infoTable = document.createTable(2, jyCols);xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);xwpfHelperTable.mergeCellsHorizontal(infoTable, 0, 1, 2);xwpfHelperTable.mergeCellsHorizontal(infoTable, 0, 4, 5);xwpfHelperTable.mergeCellsHorizontal(infoTable, 0, 7, jyCols - 1);xwpfHelperTable.mergeCellsHorizontal(infoTable, 1, 1, jyCols - 1);}// xwpfHelperTable.mergeCellsVertically(infoTable, 0, 3, 9);// 设置表格样式List<XWPFTableRow> rowList = infoTable.getRows();for (int i = 0; i < rowList.size(); i++) {XWPFTableRow infoTableRow = rowList.get(i);List<XWPFTableCell> cellList = infoTableRow.getTableCells();for (int j = 0; j < cellList.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);cellParagraph.setAlignment(ParagraphAlignment.CENTER);XWPFRun cellParagraphRun = cellParagraph.createRun();cellParagraphRun.setFontSize(12);}}xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);return infoTable;}/*** 设置表格 意见表2* * @param document* @param rows* @param cols* @Author Huangxiaocong 2018年12月16日*/public XWPFTable createTableParagraphJY2(XWPFDocument document, List<List<String>> tableList) {int rows = tableList.size();int cols = tableList.get(0).size();XWPFTable infoTable = document.createTable(10, cols);xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);// 合并表格List<XWPFTableRow> rowList = infoTable.getRows();for (int i = 0; i < rowList.size(); i++) {XWPFTableRow infoTableRow = rowList.get(i);List<XWPFTableCell> cellList = infoTableRow.getTableCells();for (int j = 0; j < cellList.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);cellParagraph.setAlignment(ParagraphAlignment.CENTER);XWPFRun cellParagraphRun = cellParagraph.createRun();cellParagraphRun.setFontSize(12);}}xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);return infoTable;}/*** 设置页眉方法* * @param document*            文档对象* @param* @param fontSize*/private void setXWPFRunStyle(XWPFDocument document, String docHead) throws Exception {CTP ctp = CTP.Factory.newInstance();XWPFParagraph paragraph2 = new XWPFParagraph(ctp, document);// 段落对象paragraph2.setFontAlignment(3);ctp.addNewR().addNewT().setStringValue(docHead);// 设置页眉参数ctp.addNewR().addNewT().setSpace(SpaceAttribute.Space.PRESERVE);CTSectPr sectPr = document.getDocument().getBody().isSetSectPr() ? document.getDocument().getBody().getSectPr(): document.getDocument().getBody().addNewSectPr();XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(document, sectPr);XWPFHeader header = policy.createHeader(STHdrFtr.DEFAULT, new XWPFParagraph[] { paragraph2 });header.setXWPFDocument(document);}/*** 设置附录* * @param document*            文档对象* @param* @param fontSize*/private void setDocumentFL(XWPFParagraph paragraph, String flString) throws Exception {paragraph.setAlignment(ParagraphAlignment.LEFT);// 样式居中XWPFRun runTitle = paragraph.createRun(); // 创建文本对象// titleFun.setText(titleName); //设置标题的名字runTitle.setBold(true); // 加粗runTitle.setColor("000000");// 设置颜色runTitle.setFontSize(10); // 字体大小runTitle.setText(flString);}/*** 结尾* * @param paragraph* @throws Exception*/private void setDocumentJW(XWPFParagraph paragraph, int i,String date) throws Exception {paragraph.setAlignment(ParagraphAlignment.CENTER);// 样式居中paragraph.setSpacingAfter(1);XWPFRun runTitle = paragraph.createRun(); // 创建文本对象// titleFun.setText(titleName); //设置标题的名字runTitle.setBold(true); // 加粗for (int j = 0; j < i; j++) {runTitle.addCarriageReturn();}runTitle.setText(" 这里是个结尾 ");runTitle.addCarriageReturn();if(date!=null) {runTitle.setText(date);}else {runTitle.setText("  年       月        日");}}/*** 封面 第一页* * @param document*            文档对象* @param* @param fontSize*/private void setDocumentFM(XWPFParagraph paragraph, List<String> dataList) throws Exception {paragraph.setAlignment(ParagraphAlignment.CENTER);// 样式居中XWPFRun run = paragraph.createRun(); // 创建文本对象XWPFRun runTitle = paragraph.createRun(); // 创建文本对象// titleFun.setText(titleName); //设置标题的名字runTitle.setBold(true); // 加粗runTitle.setColor("000000");// 设置颜色runTitle.setFontSize(25); // 字体大小runTitle.setText("大号标题");// 封面字段 前后加回车换行XWPFRun runFM = paragraph.createRun();runFM.setFontSize(20);runFM.addCarriageReturn();runFM.addCarriageReturn();runFM.addCarriageReturn();//计算加空格数量int returnNumber = 12/dataList.size();for (int i = 0; i < dataList.size(); i++) {runFM.setText(dataList.get(i));for(int j = 0;j<returnNumber;j++) {runFM.addCarriageReturn();}//runFM.addCarriageReturn();}}/*** 评审人员名单* * @param document*            文档对象* @param* @param fontSize*/private void setDocumentRY(XWPFParagraph paragraph) throws Exception {paragraph.setAlignment(ParagraphAlignment.LEFT);// 样式居中XWPFRun run = paragraph.createRun(); // 创建文本对象run.setText("人员名单");run.addCarriageReturn();}/*** 评审意见跟踪检查表* * @param document*            文档对象* @param* @param fontSize*/private void setDocumentJY(XWPFParagraph paragraph) throws Exception {paragraph.setAlignment(ParagraphAlignment.CENTER);// 样式居中XWPFRun run = paragraph.createRun(); // 创建文本对象run.setBold(true); // 加粗run.setText("检查表");run.addCarriageReturn();}/*** 编号* * @param document*            文档对象* @param* @param fontSize*/private void setDocumentBH(XWPFParagraph paragraph) throws Exception {paragraph.setAlignment(ParagraphAlignment.RIGHT);// 样式居中XWPFRun run = paragraph.createRun(); // 创建文本对象run.setText("编号:___________");run.addCarriageReturn();}/*** 意见结尾* * @param document*            文档对象* @param* @param fontSize*/private void setDocumentJYW(XWPFParagraph paragraph) throws Exception {paragraph.setAlignment(ParagraphAlignment.CENTER);// 样式居中XWPFRun run = paragraph.createRun(); // 创建文本对象run.addCarriageReturn();run.addCarriageReturn();run.setText("人:_________  PQA:________  代表_______    ________年_____月_____日");run.addCarriageReturn();}/*** * @param docHead*            页眉* @param dataList*            封面LIST* @param tableDataZT*            主体表* @param listRY*            人员表* @param listJY*            建议表头* @param listJY2*            建议字段* @param document* @param savePath* @throws Exception*/@SuppressWarnings("unchecked")public void exportCheckWord(String docHead, String date,String zjsi,List<String> dataList, List<List<String>> tableDataZT,List<List<String>> listRY, List<List<String>> listJY, int jyClos, List<List<String>> listJY2,XWPFDocument document) throws Exception {// 设置页眉setXWPFRunStyle(document, docHead);// 附录XWPFParagraph paragraphFl = document.createParagraph();setDocumentFL(paragraphFl, "左边一号");// 标题 封面XWPFParagraph paragraph = document.createParagraph();setDocumentFM(paragraph, dataList);// 结尾 个回车int i = 5;XWPFParagraph paragraphJW = document.createParagraph();setDocumentJW(paragraphJW, i,date);// 主题表XWPFParagraph paragraphZT = document.createParagraph();paragraphZT.setPageBreak(true);//换页XWPFTable table1 = createTableParagraph(document, tableDataZT);fillTableData(table1, tableDataZT,zjsi);// 人员表XWPFParagraph paragraphRY = document.createParagraph();paragraphRY.setPageBreak(true);setDocumentRY(paragraphRY);XWPFTable table2 = createTableParagraphRY(document, listRY);fillTableDataRY(table2, listRY);// 意见表XWPFParagraph paragraphJY = document.createParagraph();paragraphJY.setPageBreak(true);setDocumentFL(paragraphJY, "左边二号");XWPFParagraph paragraphJY2 = document.createParagraph();setDocumentJY(paragraphJY2);XWPFParagraph paragraphJY3 = document.createParagraph();setDocumentBH(paragraphJY3);XWPFTable table3 = createTableParagraphJY(document, listJY, jyClos);fillTableDataJY(table3, listJY);XWPFTable table4 = createTableParagraphJY2(document, listJY2);fillTableDataJY(table4, listJY2);// 意见结尾XWPFParagraph paragraphJYW = document.createParagraph();setDocumentJYW(paragraphJYW);// xwpfHelper.saveDocument(document, savePath);}/*** 往表格中填充数据 主题表* * @param table* @param tableData* @Author  2018年12月16日*/public void fillTableData(XWPFTable table, List<List<String>> tableData,String zjsi) {List<XWPFTableRow> rowList = table.getRows();for (int i = 0; i < tableData.size(); i++) {List<String> list = tableData.get(i);List<XWPFTableCell> cellList = rowList.get(i).getTableCells();for (int j = 0; j < list.size(); j++) {// XWPFRun cellParagraphRun = paragraphTable1.createRun();XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0);String tt = list.get(j);if (tt.equals("空格")) {//没找的空格占位的方法 需要占位的时候加白色字占位cellParagraphRun.setColor("ffffff");}cellParagraphRun.setText(String.valueOf(list.get(j)));if (i > 0) { //签名cellParagraphRun.addBreak();cellParagraphRun.addBreak();cellParagraphRun.addBreak();if(i==(tableData.size()-1)) {XWPFTableCell xwpfTableCell = cellList.get(j);XWPFParagraph addParagraph = xwpfTableCell.addParagraph();addParagraph.setAlignment(ParagraphAlignment.RIGHT);// 样式靠右XWPFRun createRun = addParagraph.createRun();createRun.setText(zjsi);}}}}}/*** 往表格中填充数据人员表* * @param table* @param tableData* @Author Huangxiaocong 2018年12月16日*/public void fillTableDataRY(XWPFTable table, List<List<String>> tableData) {List<XWPFTableRow> rowList = table.getRows();for (int i = 0; i < tableData.size(); i++) {List<String> list = tableData.get(i);List<XWPFTableCell> cellList = rowList.get(i).getTableCells();if (i > 0) {for (int j = 0; j < list.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0);if (list.get(0).equals("")) {cellParagraphRun.setText(String.valueOf(list.get(j)));} else {if (j > 0) {cellParagraphRun.setText(String.valueOf(list.get(j)));} else {String string = list.get(0);String[] split = string.split(",");cellParagraphRun.setText(split[0]);}}}} else {for (int j = 0; j < list.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0);cellParagraphRun.setText(String.valueOf(list.get(j)));}}}}/*** 往表格中填充数据 意见表* * @param table* @param tableData* @Author Huangxiaocong 2018年12月16日*/public void fillTableDataJY(XWPFTable table, List<List<String>> tableData) {List<XWPFTableRow> rowList = table.getRows();for (int i = 0; i < tableData.size(); i++) {List<String> list = tableData.get(i);List<XWPFTableCell> cellList = rowList.get(i).getTableCells();for (int j = 0; j < list.size(); j++) {XWPFParagraph cellParagraph = cellList.get(j).getParagraphs().get(0);XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0);cellParagraphRun.setText(String.valueOf(list.get(j)));}}}
}

返回前端方法

ExportWord ew = new ExportWord();
XWPFDocument document = ew.createXWPFDocument();
String zjsi = "签名";
ew.exportCheckWord(docHead, null, zjsi, listFMString, listZT, listRY, listJY1, jyCols, listJY2, document);//
//Map<String, Object> map = new HashMap<String, Object>();// 二进制返回前台
response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(docName, "utf-8") + ".docx");
OutputStream out = response.getOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.write(baos);
byte[] xlsBytes = baos.toByteArray();
out.write(xlsBytes);
out.close();

传参数list示例 大的List是列 里面的list是行里面参数

List<List<String>> listZT = new ArrayList<List<String>>();
List<String> tempList = new ArrayList<String>();
tempList.add("产品名称");
tempList.add("空格");
tempList.add("产品代号");
tempList.add("空格");listZT.add(tempList);

java poi导出word 多表格 页眉 非xml相关推荐

  1. Java poi导出word文件

    Java在导出word文件时主要对表格中内容垂直居中处理做以记录方便后续碰到类似问题解决. maven pom.xml中添加poi依赖 <!-- word.excel工具 --> < ...

  2. Java POI导出word文件及生成表格

    HWPF是处理 Microsoft Word 97(-2007) .doc文件格式,它还为较旧的Word 6和Word 95文件格式提供了有限的只读支持.包含在poi-scratchpad-XXX.j ...

  3. java poi实现Word生成表格并下载至本地

    首先我来讲一下需要用到的类: XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档 XWPFParagraph代表文档.表格.标题等种的段落,由多个XWPF ...

  4. java poi生成word 插入表格,图片,自动合并单元格,并且可以在已存在的word上追加

    poi版本选3.10以上的 要不然插入图片 word会打不开 <dependency><groupId>org.apache.poi</groupId><ar ...

  5. java poi导出word图片_poi 导出word,导出图片解决方法

    /** * 写入图片 * @param document * @param picName * @param width * @param height * @param alignment */ p ...

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

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

  7. JAVA使用POI导出Word文档和Excel文档

    导包 注意:POI包的版本,不同版本poi导出API会有差别!!!! <dependency><groupId>org.apache.poi</groupId>&l ...

  8. poi导出word文件(带表格)

    poi导出word文件(带表格) 一.背景介绍 现有业务需求根据前端页面上所选的时间和列,来生成word表格,方便打印. 二.POM <dependency><groupId> ...

  9. poi导出word时内嵌表格场景,即开即用

    poi导出word内嵌表格 设计分析部分 后端代码部分 xml文件配置 实体类 controller层 使用到的工具类 service层 前端代码部分 测试页面 设计分析部分 首先要对导出word的需 ...

最新文章

  1. Servlet笔记1
  2. DirectX11中XNA数据库常见的几个函数
  3. SpringAOP之代理设计模式
  4. Linux(RadHat)基础学习—FTP服务
  5. Effective-Python
  6. 多项目加载顺序修改_面试官:Java 类在 Tomcat 中是如何加载的?
  7. 深圳房价三连跌,国内的房地产价格或将持续下跌,该持现金过冬了
  8. Ubuntu 16.04 创建无线热点
  9. 超级账本(关键概念)
  10. 练习6:多表关联查询、嵌套子查询
  11. YAML详解 是什么
  12. ELGamal 加密算法及Java实现
  13. 机电revit的【桥架转化】功能,识别CAD图纸点击转化
  14. 博物馆3d数字化全景展示设计方案
  15. Office 365入门教程(一):开始使用Office 365
  16. Vivado 2020.1 and 2020.2 错误 arm-none-eabi-ar: *.o: Invalid argument
  17. spring中AspectJ
  18. 数据结构与算法基础Day1
  19. iOS 获取手机外网IP地址的成功与失败
  20. NSIS一键安装网站环境及部署网站

热门文章

  1. 标准技术方案指标体系研究报告国标策文件技术标准技术规范,政策GB行业报告白皮书数据资源
  2. centos clamav 杀毒安装与应用
  3. pdf怎么合并成一个文件?高效工具分享
  4. Linux下基于ffmpeg音视频解码
  5. 小结(由递推公式得到递推矩阵)
  6. 为你推荐一款最好用的免费截图工具-Snipaste,截图高清、智能模糊还支持滚动长截图!!!
  7. Power BI :利用雷达图(蛛网图)显示某一个体指标变动情况
  8. 科技创梦 乐赢未来!第十九届ChinaJoy如期开幕
  9. 【软考】系统集成项目管理工程师(十五)项目采购管理
  10. 基于Java Swing编写的运费计算系统