zoukankan      html  css  js  c++  java
  • 使用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 

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

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

  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/sun-flower1314/p/10128796.html
Copyright © 2011-2022 走看看