• 使用POI导出Word(含表格)的实现方式及操作Word的工具类


    转载请注明出处:https://www.cnblogs.com/sun-flower1314/p/10128796.html 

    本篇是关于利用Apache 的POI导出Word的实现步骤。采用XWPFDocument导出Word,结构和样式完全由代码控制,操作起来还是非常的不太方便,只能够创建简单的word,不能设置样式,功能太少。但在这里还是实现一下,毕竟做过。

    关于导出Word的方案另一种方式:https://www.cnblogs.com/sun-flower1314/p/10126111.html 

    首先声明一些基本概念:

    XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
    XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
    XWPFRun代表具有同样风格的一段文本
    XWPFTable代表一个表格
    XWPFTableRow代表表格的一行
    XWPFTableCell代表表格的一个单元格
    XWPFChar 表示.docx文件中的图表
    XWPFHyperlink 表示超链接
    XWPFPicture 代表图片

    注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。

    先看效果图:(完全是由代码导出)

    1.导入jar包:

    (虽然只有两个,但是会自动依赖其他jar包进来)

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

      这是依赖包:

         

    2. 代码部分:

    package cn.hxc.myWorld.myWorld;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    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.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
    
    import cn.hxc.myWorld.util.XWPFHelper;
    import cn.hxc.myWorld.util.XWPFHelperTable;
    
    /**
     * @Description 导出word文档
     * @Author  Huangxiaocong
     * 2018年12月1日  下午12:12:15
     */
    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();
            createTitleParagraph(doc);
            createTableParagraph(doc, 10, 6);
            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 void createTableParagraph(XWPFDocument document, int rows, int cols) {
    //        xwpfHelperTable.createTable(xdoc, rowSize, cellSize, isSetColWidth, colWidths)
            XWPFTable infoTable = document.createTable(rows, cols);
            xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER);
            //合并表格
            xwpfHelperTable.mergeCellsHorizontal(infoTable, 1, 1, 5);
            xwpfHelperTable.mergeCellsVertically(infoTable, 0, 3, 6);
            for(int col = 3; col < 7; col++) {
                xwpfHelperTable.mergeCellsHorizontal(infoTable, col, 1, 5);
            }
            //设置表格样式
            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).getParagraphArray(0);
                    cellParagraph.setAlignment(ParagraphAlignment.CENTER);
                    XWPFRun cellParagraphRun = cellParagraph.createRun();
                    cellParagraphRun.setFontSize(12);
                    if(i % 2 != 0) {
                        cellParagraphRun.setBold(true);
                    }
                }
            }
            xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER);
        }
        
        /**
         * 往表格中填充数据
         * @param dataList
         * @param document
         * @throws IOException
         * @Author Huangxiaocong 2018年12月16日 
         */
        @SuppressWarnings("unchecked")
        public void exportCheckWord(Map<String, Object> dataList, XWPFDocument document, String savePath) throws IOException {
            XWPFParagraph paragraph = document.getParagraphArray(0);
            XWPFRun titleFun = paragraph.getRuns().get(0);
            titleFun.setText(String.valueOf(dataList.get("TITLE")));
            List<List<Object>> tableData = (List<List<Object>>) dataList.get("TABLEDATA");
            XWPFTable table = document.getTableArray(0);
            fillTableData(table, tableData);
            xwpfHelper.saveDocument(document, savePath);
        }
        /**
         * 往表格中填充数据
         * @param table
         * @param tableData
         * @Author Huangxiaocong 2018年12月16日
         */
        public void fillTableData(XWPFTable table, List<List<Object>> tableData) {
            List<XWPFTableRow> rowList = table.getRows();
            for(int i = 0; i < tableData.size(); i++) {
                List<Object> list = tableData.get(i);
                List<XWPFTableCell> cellList = rowList.get(i).getTableCells();
                for(int j = 0; j < list.size(); j++) {
                    XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0);
                    XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0);
                    cellParagraphRun.setText(String.valueOf(list.get(j)));
                }
            }
        }
    }

       下面是用到的工具类:                                         

    package cn.hxc.myWorld.util;
    
    import java.io.ByteArrayInputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.math.BigInteger;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    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.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFPicture;
    import org.apache.poi.xwpf.usermodel.XWPFPictureData;
    import org.apache.poi.xwpf.usermodel.XWPFRelation;
    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.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule;
    
    import cn.hxc.myWorld.domain.ParagraphStyle;
    import cn.hxc.myWorld.domain.TextStyle;
    
    /**
     * @Description 设置docx文档的样式及一些操作  
     * @Author  Huangxiaocong
     * 2018年12月1日  下午12:18:41
     * 基本概念说明:XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
     *     XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
     *     XWPFRun代表具有同样风格的一段文本
     *  XWPFTable代表一个表格
     *  XWPFTableRow代表表格的一行
     *  XWPFTableCell代表表格的一个单元格    
     *  XWPFChar 表示.docx文件中的图表
     *  XWPFHyperlink 表示超链接
     *  XWPFPicture  代表图片
     *  
     *  注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。
     */
    public class XWPFHelper {
        private static Logger logger = Logger.getLogger(XWPFHelper.class.toString());
        
        /**
         * 创建一个word对象
         * @return
         * @Author Huangxiaocong 2018年12月1日 上午11:56:35
         */
        public XWPFDocument createDocument() {
            XWPFDocument document = new XWPFDocument();
            return document;
        }
        /**
         * 打开word文档
         * @param path 文档所在路径
         * @return
         * @throws IOException
         * @Author Huangxiaocong 2018年12月1日 下午12:30:07
         */
        public XWPFDocument openDoc(String path) throws IOException {
            InputStream is = new FileInputStream(path);
            return new XWPFDocument(is);
        }
        /**
         * 保存word文档
         * @param document 文档对象
         * @param savePath    保存路径
         * @throws IOException
         * @Author Huangxiaocong 2018年12月1日 下午12:32:37
         */
        public void saveDocument(XWPFDocument document, String savePath) throws IOException {
            OutputStream os = new FileOutputStream(savePath);
            document.write(os);
            os.close();
        }
        /**
         * 设置段落文本样式  设置超链接及样式
         * @param paragraph
         * @param textStyle
         * @param url
         * @Author Huangxiaocong 2018年12月1日 下午3:56:32
         */
        public void addParagraphTextHyperlink(XWPFParagraph paragraph, TextStyle textStyle) {
            String id = paragraph.getDocument().getPackagePart().
                addExternalRelationship(textStyle.getUrl(),
                    XWPFRelation.HYPERLINK.getRelation()).getId();
            //追加链接并将其绑定到关系中
            CTHyperlink cLink = paragraph.getCTP().addNewHyperlink();
            cLink.setId(id);
            //创建链接文本
            CTText ctText = CTText.Factory.newInstance();
            ctText.setStringValue(textStyle.getText());
            CTR ctr = CTR.Factory.newInstance();
            CTRPr rpr = ctr.addNewRPr();
            //以下设置各种样式 详情看TextStyle类
            if(textStyle.getFontFamily() != "" && textStyle.getFontFamily() != null     ) {
                CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
                fonts.setAscii(textStyle.getFontFamily());
                //...
            }
            //设置字体大小
        }
        /**
         * 设置段落的基本样式  设置段落间距信息, 一行 = 100    一磅=20 
         * @param paragraph
         * @param paragStyle
         * @Author Huangxiaocong 2018年12月1日 下午4:27:17
         */
        public void setParagraphSpacingInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle, STLineSpacingRule.Enum lineValue) {
            CTPPr pPPr = getParagraphCTPPr(paragraph);
            CTSpacing pSpacing = pPPr.getSpacing() != null ? pPPr.getSpacing() : pPPr.addNewSpacing();
            if(paragStyle.isSpace()) {
                //段前磅数
                if(paragStyle.getBefore() != null) {
                    pSpacing.setBefore(new BigInteger(paragStyle.getBefore()));
                }
                //段后磅数
                if(paragStyle.getAfter() != null) {
                    pSpacing.setAfter(new BigInteger(paragStyle.getAfter()));
                }
                //依次设置段前行数、段后行数
                //...
            }
            //间距
            if(paragStyle.isLine()) {
                if(paragStyle.getLine() != null) {
                    pSpacing.setLine(new BigInteger(paragStyle.getLine()));
                }
                if(lineValue != null) {
                    pSpacing.setLineRule(lineValue);    //
                }
            }
        }
        /**
     * 设置段落缩进信息  1厘米 约等于 567
         * @param paragraph
         * @param paragStyle
         * @Author Huangxiaocong 2018年12月1日 下午7:59:35
         */
        public void setParagraphIndInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle) {
            CTPPr pPPr = getParagraphCTPPr(paragraph);
            CTInd pInd = pPPr.getInd() != null ? pPPr.getInd() : pPPr.addNewInd();
            if(paragStyle.getFirstLine() != null) {
                pInd.setFirstLine(new BigInteger(paragStyle.getFirstLine()));
            }
            //再进行其他设置
            //...
        }
        /**
         * 设置段落对齐 方式
         * @param paragraph
         * @param pAlign
         * @param valign
         * @Author Huangxiaocong 2018年12月1日 下午8:54:43
         */
        public void setParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) {
            if(pAlign != null) {
                paragraph.setAlignment(pAlign);
            }
            if(valign != null) {
                paragraph.setVerticalAlignment(valign);
            }
        }
        /**
         * 得到段落的CTPPr
         * @param paragraph
         * @return
         * @Author Huangxiaocong 2018年12月1日 下午7:36:10
         */
        public CTPPr getParagraphCTPPr(XWPFParagraph paragraph) {
            CTPPr pPPr = null;
            if(paragraph.getCTP() != null) {
                if(paragraph.getCTP().getPPr() != null) {
                    pPPr = paragraph.getCTP().getPPr();
                } else {
                    pPPr = paragraph.getCTP().addNewPPr();
                }
            }
            return pPPr;
        }
        /**
         * 得到XWPFRun的CTRPr
         * @param paragraph
         * @param pRun
         * @return
         * @Author Huangxiaocong 2018年12月1日 下午7:46:01
         */
        public CTRPr getRunCTRPr(XWPFParagraph paragraph, XWPFRun pRun) {
            CTRPr ctrPr = null;
            if(pRun.getCTR() != null) {
                ctrPr = pRun.getCTR().getRPr();
                if(ctrPr == null) {
                    ctrPr = pRun.getCTR().addNewRPr();
                }
            } else {
                ctrPr = paragraph.getCTP().addNewR().addNewRPr();
            }
            return ctrPr;
        }
        
        
        /**
         * 复制表格
         * @param targetTable
         * @param sourceTable
         * @Author Huangxiaocong 2018年12月1日 下午1:40:01
         */
        public void copyTable(XWPFTable targetTable, XWPFTable sourceTable) {
            //复制表格属性
            targetTable.getCTTbl().setTblPr(sourceTable.getCTTbl().getTblPr());
            //复制行
            for(int i = 0; i < sourceTable.getRows().size(); i++) {
                XWPFTableRow targetRow = targetTable.getRow(i);
                XWPFTableRow sourceRow = sourceTable.getRow(i);
                if(targetRow == null) {
                    targetTable.addRow(sourceRow);
                } else {
                    copyTableRow(targetRow, sourceRow);
                }
            }
        }
        /**
         * 复制单元格
         * @param targetRow
         * @param sourceRow
         * @Author Huangxiaocong 2018年12月1日 下午1:33:22
         */
        public void copyTableRow(XWPFTableRow targetRow, XWPFTableRow sourceRow) {
            //复制样式
            if(sourceRow != null) {
                targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());
            }
            //复制单元格
            for(int i = 0; i < sourceRow.getTableCells().size(); i++) {
                XWPFTableCell tCell = targetRow.getCell(i);
                XWPFTableCell sCell = sourceRow.getCell(i);
                if(tCell == sCell) {
                    tCell = targetRow.addNewTableCell();
                }
                copyTableCell(tCell, sCell);
            }
        }
        /**
         * 复制单元格(列) 从sourceCell到targetCell
         * @param targetCell
         * @param sourceCell
         * @Author Huangxiaocong 2018年12月1日 下午1:27:38
         */
        public void copyTableCell(XWPFTableCell targetCell, XWPFTableCell sourceCell) {
            //表格属性
            if(sourceCell.getCTTc() != null) {
                targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
            }
            //删除段落
            for(int pos = 0; pos < targetCell.getParagraphs().size(); pos++) {
                targetCell.removeParagraph(pos);
            }
            //添加段落
            for(XWPFParagraph sourceParag : sourceCell.getParagraphs()) {
                XWPFParagraph targetParag = targetCell.addParagraph();
                copyParagraph(targetParag, sourceParag);
            }
        }
        /**
         * 复制段落,从sourceParag到targetParag
         * @param targetParag
         * @param sourceParag
         * @Author Huangxiaocong 2018年12月1日 下午1:16:26
         */
        public void copyParagraph(XWPFParagraph targetParag, XWPFParagraph sourceParag) {
            targetParag.getCTP().setPPr(sourceParag.getCTP().getPPr());    //设置段落样式
            //移除所有的run
            for(int pos = targetParag.getRuns().size() - 1; pos >= 0; pos-- ) {
                targetParag.removeRun(pos);
            }
            //copy新的run
            for(XWPFRun sRun : sourceParag.getRuns()) {
                XWPFRun tarRun = targetParag.createRun();
                copyRun(tarRun, sRun);
            }
        }
        /**
         * 复制XWPFRun 从sourceRun到targetRun
         * @param targetRun
         * @param sourceRun
         * @Author Huangxiaocong 2018年12月1日 下午12:56:53
         */
        public void copyRun(XWPFRun targetRun, XWPFRun sourceRun) {
            //设置targetRun属性
            targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr());
            targetRun.setText(sourceRun.text());//设置文本
            //处理图片
            List<XWPFPicture> pictures = sourceRun.getEmbeddedPictures();
            for(XWPFPicture picture : pictures) {
                try {
                    copyPicture(targetRun, picture);
                } catch (InvalidFormatException e) {
                    e.printStackTrace();
                    logger.log(Level.WARNING, "copyRun", e);
                } catch (IOException e) {
                    e.printStackTrace();
                    logger.log(Level.WARNING, "copyRun", e);
                }
            }
        }
        /**
         * 复制图片从sourcePicture到 targetRun(XWPFPicture --> XWPFRun)
         * @param targetRun
         * @param source
         * @throws IOException 
         * @throws InvalidFormatException 
         * @Author Huangxiaocong 2018年12月1日 下午12:57:33
         */
        public void copyPicture(XWPFRun targetRun, XWPFPicture sourcePicture) throws InvalidFormatException, IOException {
            XWPFPictureData picData = sourcePicture.getPictureData();
            String fileName = picData.getFileName();    //图片的名称
            InputStream picInIsData = new ByteArrayInputStream(picData.getData());    
            int picType = picData.getPictureType();
            int width = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCx();
            int height =  (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCy();
            targetRun.addPicture(picInIsData, picType, fileName, width, height);
    //        targetRun.addBreak();//分行
        }
    }

        工具类二:    

    package cn.hxc.myWorld.util;
    
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import org.apache.poi.xwpf.usermodel.BodyElementType;
    import org.apache.poi.xwpf.usermodel.IBodyElement;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    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.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGridCol;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTrPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
    
    /**
     * @Description 操作word的基本工具类
     * 2018年12月3日  上午11:12:18
     * @Author Huangxiaocong
     */
    public class XWPFHelperTable {
        
        /**
         * 删除指定位置的表格,被删除表格后的索引位置
         * @param document
         * @param pos
         * @Author Huangxiaocong 2018年12月1日 下午10:32:43
         */
        public void deleteTableByIndex(XWPFDocument document, int pos) {
            Iterator<IBodyElement> bodyElement = document.getBodyElementsIterator();
            int eIndex = 0, tableIndex = -1;
            while(bodyElement.hasNext()) {
                IBodyElement element = bodyElement.next();
                BodyElementType elementType = element.getElementType();
                if(elementType == BodyElementType.TABLE) {
                    tableIndex++;
                    if(tableIndex == pos) {
                        break;
                    }
                }
                eIndex++;
            }
            document.removeBodyElement(eIndex);
        }
        /**
         * 获得指定位置的表格
         * @param document
         * @param index
         * @return
         * @Author Huangxiaocong 2018年12月1日 下午10:34:14
         */
        public XWPFTable getTableByIndex(XWPFDocument document, int index) {
            List<XWPFTable> tableList = document.getTables();
            if(tableList == null || index < 0 || index > tableList.size()) {
                return null;
            }
            return tableList.get(index);
        }
        /**
         * 得到表格的内容(第一次跨行单元格视为一个,第二次跳过跨行合并的单元格)
         * @param table
         * @return
         * @Author Huangxiaocong 2018年12月1日 下午10:46:41
         */
        public List<List<String>> getTableRConten(XWPFTable table) {
            List<List<String>> tableContextList = new ArrayList<List<String>>();
            for(int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {
                XWPFTableRow row = table.getRow(rowIndex);
                List<String> cellContentList = new ArrayList<String>();
                for(int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++ ) {
                    XWPFTableCell cell = row.getCell(colIndex);
                    CTTc ctTc = cell.getCTTc();
                    if(ctTc.isSetTcPr()) {
                        CTTcPr tcPr = ctTc.getTcPr();
                        if(tcPr.isSetHMerge()) {
                            CTHMerge hMerge = tcPr.getHMerge();
                            if(STMerge.RESTART.equals(hMerge.getVal())) {
                                cellContentList.add(getTableCellContent(cell));
                            }
                        } else if(tcPr.isSetVMerge()) {
                            CTVMerge vMerge = tcPr.getVMerge();
                            if(STMerge.RESTART.equals(vMerge.getVal())) {
                                cellContentList.add(getTableCellContent(cell));
                            }
                        } else {
                            cellContentList.add(getTableCellContent(cell));
                        }
                    }
                }
                tableContextList.add(cellContentList);
            }
            return tableContextList;
        }
    
        /**
         * 获得一个表格的单元格的内容
         * @param cell
         * @return
         * @Author Huangxiaocong 2018年12月2日 下午7:39:23
         */
        public String getTableCellContent(XWPFTableCell cell) {
            StringBuffer sb = new StringBuffer();
            List<XWPFParagraph> cellParagList = cell.getParagraphs();
            if(cellParagList != null && cellParagList.size() > 0) {
                for(XWPFParagraph xwpfPr: cellParagList) {
                    List<XWPFRun> runs = xwpfPr.getRuns();
                    if(runs != null && runs.size() > 0) {
                        for(XWPFRun xwpfRun : runs) {
                            sb.append(xwpfRun.getText(0));
                        }
                    }
                }
            }
            return sb.toString();
        }
        /**
         * 得到表格内容,合并后的单元格视为一个单元格
         * @param table
         * @return
         * @Author Huangxiaocong 2018年12月2日 下午7:47:19
         */
        public List<List<String>> getTableContent(XWPFTable table) {
           List<List<String>> tableContentList = new ArrayList<List<String>>();
            for (int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) {
              XWPFTableRow row = table.getRow(rowIndex);
              List<String> cellContentList = new ArrayList<String>();
              for (int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++) {
                XWPFTableCell cell = row.getCell(colIndex);
                cellContentList.add(getTableCellContent(cell));
              }
              tableContentList.add(cellContentList);
            }
            return tableContentList;
        }
        
        /**
         * 跨列合并
         * @param table
         * @param row    所合并的行
         * @param fromCell    起始列
         * @param toCell    终止列
         * @Description
         * @Author Huangxiaocong 2018年11月26日 下午9:23:22
         */
        public void mergeCellsHorizontal(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);
                } else {
                    cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                }
            }
        }
        /**
         * 跨行合并
         * @param table
         * @param col    合并的列
         * @param fromRow    起始行
         * @param toRow    终止行
         * @Description
         * @Author Huangxiaocong 2018年11月26日 下午9:09:19
         */
        public void mergeCellsVertically(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);
                }
            }
        }
    
          /**
           * @Description: 创建表格,创建后表格至少有1行1列,设置列宽
           */
          public XWPFTable createTable(XWPFDocument xdoc, int rowSize, int cellSize,
              boolean isSetColWidth, int[] colWidths) {
            XWPFTable table = xdoc.createTable(rowSize, cellSize);
            if (isSetColWidth) {
              CTTbl ttbl = table.getCTTbl();
              CTTblGrid tblGrid = ttbl.addNewTblGrid();
              for (int j = 0, len = Math.min(cellSize, colWidths.length); j < len; j++) {
                  CTTblGridCol gridCol = tblGrid.addNewGridCol();
                  gridCol.setW(new BigInteger(String.valueOf(colWidths[j])));
              }
            }
            return table;
          }
    
          /**
           * @Description: 设置表格总宽度与水平对齐方式
           */
          public void setTableWidthAndHAlign(XWPFTable table, String width,
              STJc.Enum enumValue) {
            CTTblPr tblPr = getTableCTTblPr(table);
            // 表格宽度
            CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
            if (enumValue != null) {
              CTJc cTJc = tblPr.addNewJc();
              cTJc.setVal(enumValue);
            }
            // 设置宽度
            tblWidth.setW(new BigInteger(width));
            tblWidth.setType(STTblWidth.DXA);
          }
    
          /**
           * @Description: 得到Table的CTTblPr,不存在则新建
           */
          public CTTblPr getTableCTTblPr(XWPFTable table) {
            CTTbl ttbl = table.getCTTbl();
            // 表格属性
            CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
            return tblPr;
          }
        
          /**
           * 设置表格行高
           * @param infoTable
           * @param heigth 高度
           * @param vertical 表格内容的显示方式:居中、靠右...
           * @Author Huangxiaocong 2018年12月16日 
           */
          public void setTableHeight(XWPFTable infoTable, int heigth, STVerticalJc.Enum vertical) {
            List<XWPFTableRow> rows = infoTable.getRows();
            for(XWPFTableRow row : rows) {
                CTTrPr trPr = row.getCtRow().addNewTrPr();
                CTHeight ht = trPr.addNewTrHeight();
                ht.setVal(BigInteger.valueOf(heigth));
                List<XWPFTableCell> cells = row.getTableCells();
                for(XWPFTableCell tableCell : cells ) {
                    CTTcPr cttcpr = tableCell.getCTTc().addNewTcPr();
                    cttcpr.addNewVAlign().setVal(vertical);
                }
            }
          }
    }

       实体类(自己填写get/set方法):                   

    /**
     * @Description 文本样式 
     * 2018年12月1日  下午4:09:30
     * @Author Huangxiaocong
     */
    public class TextStyle {
        
        private String url;    // 超链接
        private String text;    //文本内容
        private String fontFamily;    //字体
        private String fontSize;    //字体大小
        private String colorVal;    //字体颜色
        private String shdColor;    //底纹颜色
        private int position;    //文本位置
        private int spacingValue;    //间距
        private int indent;    //缩进
        private boolean isBlod;    //加粗
        private boolean isUnderLine;    //下划线
        private boolean underLineColor;    //
        private boolean isItalic;    //倾斜
        private boolean isStrike;    //删除线
        private boolean isDStrike;    //双删除线
        private boolean isShadow;    //阴影
        private boolean isVanish;    //隐藏
        private boolean isEmboss;    //阳文
        private boolean isImprint;    //阴文
        private boolean isOutline;    //空心
        private boolean isHightLight;    //突出显示文本
        private boolean isShd;    //底纹
        
        //此处省略get/set方法...
    
    }
    /**
     * @Description 段落样式 
     * 2018年12月1日  下午4:20:05
     * @Author Huangxiaocong
     */
    public class ParagraphStyle {
        
        private boolean isSpace;  //是否缩进
        private String before;      //段前磅数
        private String after;  //段后磅数
        private String beforeLines;        //段前行数
        private String afterLines;        //段后行数
        private boolean isLine;        //是否间距
        private String line;    //间距距离
        //段落缩进信息
        private String firstLine;
        private String firstLineChar;
        private String hanging;
        private String hangingChar;
        private String right;
        private String rightChar;
        private String left;
        private String leftChar;
        
        //此处省略get/set方法...
    }

       最后是测试类:    

    package cn.hxc.myWorld.test;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    
    import cn.hxc.myWorld.myWorld.ExportWord;
    
    public class TestExportWord {
        
        public static void main(String[] args) throws Exception {
            ExportWord ew = new ExportWord();
            XWPFDocument document = ew.createXWPFDocument();
            List<List<Object>> list = new ArrayList<List<Object>>();
            
            List<Object> tempList = new ArrayList<Object>();
            tempList.add("姓名");
            tempList.add("黄xx");
            tempList.add("性别");
            tempList.add("男");
            tempList.add("出生日期");
            tempList.add("2018-10-10");
            list.add(tempList);
            tempList = new ArrayList<Object>();
            tempList.add("身份证号");
            tempList.add("36073xxxxxxxxxxx");
            list.add(tempList);
            tempList = new ArrayList<Object>();
            tempList.add("出生地");
            tempList.add("江西");
            tempList.add("名族");
            tempList.add("汉");
            tempList.add("婚否");
            tempList.add("否");
            list.add(tempList);
            tempList = new ArrayList<Object>();
            tempList.add("既往病史");
            tempList.add("无");
            list.add(tempList);
            
            Map<String, Object> dataList = new HashMap<String, Object>();
            dataList.put("TITLE", "个人体检表");
            dataList.put("TABLEDATA", list);
            ew.exportCheckWord(dataList, document, "E:/expWordTest.docx");
            System.out.println("文档生成成功");
        }
    }

    效果如图:

     

    总的制作完毕。

    关于导出Word的另一种方案:https://www.cnblogs.com/sun-flower1314/p/10126111.html 

    好累呀 确定不点个赞?(<微笑^^>)

    同时 希望各位能提出宝贵的意见方便改进 不甚感激!!

  • 相关阅读:
    SpingMVC类型转换
    SpingMVC系统异常处理(二)
    JDBC 之 事务
    JDBC 基础概念
    部分实用的SQL语句
    JDBC基础学习
    手动去除集合中重复元素
    三种形式遍历集合
    java IO流 复制图片
    java IO流 之 字符流
  • 原文地址:https://www.cnblogs.com/sun-flower1314/p/10128796.html
Copyright © 2020-2023  润新知