zoukankan      html  css  js  c++  java
  • [简单]poi word2007表格按模版样式填充行数据

    主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点:1)暂未实现特殊样式填充(如列合并(跨行合并)),只能用于普通样式(如段落间距 缩进 字体 对齐)2)数据行插到模版行下面,没有实现指定位置插入

    直接上代码:

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    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.CTFonts;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
    
    public class POI_表格_按模版样式填充数据_S3_Test {
        public static void main(String[] args) throws Exception {
            POI_表格_按模版样式填充数据_S3_Test t = new POI_表格_按模版样式填充数据_S3_Test();
            t.insertDataToTable("f:/saveFile/temp/sys_s3_template.docx", 3, false);
        }
    
        public void insertDataToTable(String filePath, int tableSize,
                boolean isDelTmpRow) throws Exception {
            InputStream is = new FileInputStream(filePath);
            XWPFDocument doc = new XWPFDocument(is);
            List<List<String>> resultList = generateTestData(4);
            insertValueToTable(doc, resultList, tableSize, isDelTmpRow);
            saveDocument(doc, "f:/saveFile/temp/sys_" + System.currentTimeMillis()
                    + ".docx");
        }
    
        /**
         * @Description: 按模版行样式填充数据,暂未实现特殊样式填充(如列合并),只能用于普通样式(如段落间距 缩进 字体 对齐)
         * @param resultList  填充数据
         * @param tableRowSize  模版表格行数 取第一个行数相等列数相等的表格填充
         * @param isDelTmpRow 是否删除模版行
         */
        // TODO 数据行插到模版行下面,没有实现指定位置插入
        public void insertValueToTable(XWPFDocument doc,
                List<List<String>> resultList, int tableRowSize, boolean isDelTmpRow)
                throws Exception {
            Iterator<XWPFTable> iterator = doc.getTablesIterator();
            XWPFTable table = null;
            List<XWPFTableRow> rows = null;
            List<XWPFTableCell> cells = null;
            List<XWPFTableCell> tmpCells = null;// 模版列
            XWPFTableRow tmpRow = null;// 匹配用
            XWPFTableCell tmpCell = null;// 匹配用
            boolean flag = false;// 是否找到表格
            while (iterator.hasNext()) {
                table = iterator.next();
                rows = table.getRows();
                if (rows.size() == tableRowSize) {
                    tmpRow = rows.get(tableRowSize - 1);
                    cells = tmpRow.getTableCells();
                    if (cells.size() == resultList.get(0).size()) {
                        flag = true;
                        break;
                    }
                }
            }
            if (!flag) {
                return;
            }
            tmpCells = tmpRow.getTableCells();
            for (int i = 0, len = resultList.size(); i < len; i++) {
                XWPFTableRow row = table.createRow();
                row.setHeight(tmpRow.getHeight());
                List<String> list = resultList.get(i);
                cells = row.getTableCells();
                // 插入的行会填充与表格第一行相同的列数
                for (int k = 0, klen = cells.size(); k < klen; k++) {
                    tmpCell = tmpCells.get(k);
                    XWPFTableCell cell = cells.get(k);
                    setCellText(tmpCell, cell, list.get(k));
                }
                // 继续写剩余的列
                for (int j = cells.size(), jlen = list.size(); j < jlen; j++) {
                    tmpCell = tmpCells.get(j);
                    XWPFTableCell cell = row.addNewTableCell();
                    setCellText(tmpCell, cell, list.get(j));
                }
            }
            // 删除模版行
            if (isDelTmpRow) {
                table.removeRow(tableRowSize - 1);
            }
        }
    
        public void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,
                String text) throws Exception {
            CTTc cttc2 = tmpCell.getCTTc();
            CTTcPr ctPr2 = cttc2.getTcPr();
    
            CTTc cttc = cell.getCTTc();
            CTTcPr ctPr = cttc.addNewTcPr();
            cell.setColor(tmpCell.getColor());
            cell.setVerticalAlignment(tmpCell.getVerticalAlignment());
            if (ctPr2.getTcW() != null) {
                ctPr.addNewTcW().setW(ctPr2.getTcW().getW());
            }
            if (ctPr2.getVAlign() != null) {
                ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());
            }
            if (cttc2.getPList().size() > 0) {
                CTP ctp = cttc2.getPList().get(0);
                if (ctp.getPPr() != null) {
                    if (ctp.getPPr().getJc() != null) {
                        cttc.getPList().get(0).addNewPPr().addNewJc().setVal(
                                ctp.getPPr().getJc().getVal());
                    }
                }
            }
    
            if (ctPr2.getTcBorders() != null) {
                ctPr.setTcBorders(ctPr2.getTcBorders());
            }
    
            XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);
            XWPFParagraph cellP = cell.getParagraphs().get(0);
            XWPFRun tmpR = null;
            if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {
                tmpR = tmpP.getRuns().get(0);
            }
            XWPFRun cellR = cellP.createRun();
            cellR.setText(text);
            // 复制字体信息
            if (tmpR != null) {
                cellR.setBold(tmpR.isBold());
                cellR.setItalic(tmpR.isItalic());
                cellR.setStrike(tmpR.isStrike());
                cellR.setUnderline(tmpR.getUnderline());
                cellR.setColor(tmpR.getColor());
                cellR.setTextPosition(tmpR.getTextPosition());
                if (tmpR.getFontSize() != -1) {
                    cellR.setFontSize(tmpR.getFontSize());
                }
                if (tmpR.getFontFamily() != null) {
                    cellR.setFontFamily(tmpR.getFontFamily());
                }
                if (tmpR.getCTR() != null) {
                    if (tmpR.getCTR().isSetRPr()) {
                        CTRPr tmpRPr = tmpR.getCTR().getRPr();
                        if (tmpRPr.isSetRFonts()) {
                            CTFonts tmpFonts = tmpRPr.getRFonts();
                            CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR
                                    .getCTR().getRPr() : cellR.getCTR().addNewRPr();
                            CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr
                                    .getRFonts() : cellRPr.addNewRFonts();
                            cellFonts.setAscii(tmpFonts.getAscii());
                            cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());
                            cellFonts.setCs(tmpFonts.getCs());
                            cellFonts.setCstheme(tmpFonts.getCstheme());
                            cellFonts.setEastAsia(tmpFonts.getEastAsia());
                            cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());
                            cellFonts.setHAnsi(tmpFonts.getHAnsi());
                            cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());
                        }
                    }
                }
            }
            // 复制段落信息
            cellP.setAlignment(tmpP.getAlignment());
            cellP.setVerticalAlignment(tmpP.getVerticalAlignment());
            cellP.setBorderBetween(tmpP.getBorderBetween());
            cellP.setBorderBottom(tmpP.getBorderBottom());
            cellP.setBorderLeft(tmpP.getBorderLeft());
            cellP.setBorderRight(tmpP.getBorderRight());
            cellP.setBorderTop(tmpP.getBorderTop());
            cellP.setPageBreak(tmpP.isPageBreak());
            if (tmpP.getCTP() != null) {
                if (tmpP.getCTP().getPPr() != null) {
                    CTPPr tmpPPr = tmpP.getCTP().getPPr();
                    CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP
                            .getCTP().getPPr() : cellP.getCTP().addNewPPr();
                    // 复制段落间距信息
                    CTSpacing tmpSpacing = tmpPPr.getSpacing();
                    if (tmpSpacing != null) {
                        CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr
                                .getSpacing()
                                : cellPPr.addNewSpacing();
                        if (tmpSpacing.getAfter() != null) {
                            cellSpacing.setAfter(tmpSpacing.getAfter());
                        }
                        if (tmpSpacing.getAfterAutospacing() != null) {
                            cellSpacing.setAfterAutospacing(tmpSpacing
                                    .getAfterAutospacing());
                        }
                        if (tmpSpacing.getAfterLines() != null) {
                            cellSpacing.setAfterLines(tmpSpacing.getAfterLines());
                        }
                        if (tmpSpacing.getBefore() != null) {
                            cellSpacing.setBefore(tmpSpacing.getBefore());
                        }
                        if (tmpSpacing.getBeforeAutospacing() != null) {
                            cellSpacing.setBeforeAutospacing(tmpSpacing
                                    .getBeforeAutospacing());
                        }
                        if (tmpSpacing.getBeforeLines() != null) {
                            cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines());
                        }
                        if (tmpSpacing.getLine() != null) {
                            cellSpacing.setLine(tmpSpacing.getLine());
                        }
                        if (tmpSpacing.getLineRule() != null) {
                            cellSpacing.setLineRule(tmpSpacing.getLineRule());
                        }
                    }
                    // 复制段落缩进信息
                    CTInd tmpInd = tmpPPr.getInd();
                    if (tmpInd != null) {
                        CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd()
                                : cellPPr.addNewInd();
                        if (tmpInd.getFirstLine() != null) {
                            cellInd.setFirstLine(tmpInd.getFirstLine());
                        }
                        if (tmpInd.getFirstLineChars() != null) {
                            cellInd.setFirstLineChars(tmpInd.getFirstLineChars());
                        }
                        if (tmpInd.getHanging() != null) {
                            cellInd.setHanging(tmpInd.getHanging());
                        }
                        if (tmpInd.getHangingChars() != null) {
                            cellInd.setHangingChars(tmpInd.getHangingChars());
                        }
                        if (tmpInd.getLeft() != null) {
                            cellInd.setLeft(tmpInd.getLeft());
                        }
                        if (tmpInd.getLeftChars() != null) {
                            cellInd.setLeftChars(tmpInd.getLeftChars());
                        }
                        if (tmpInd.getRight() != null) {
                            cellInd.setRight(tmpInd.getRight());
                        }
                        if (tmpInd.getRightChars() != null) {
                            cellInd.setRightChars(tmpInd.getRightChars());
                        }
                    }
                }
            }
        }
    
        public void saveDocument(XWPFDocument document, String savePath)
                throws Exception {
            FileOutputStream fos = new FileOutputStream(savePath);
            document.write(fos);
            fos.close();
        }
    
        // 生成测试数据
        public List<List<String>> generateTestData(int num) {
            List<List<String>> resultList = new ArrayList<List<String>>();
            for (int i = 1; i <= num; i++) {
                List<String> list = new ArrayList<String>();
                list.add("" + i);
                list.add("测试_" + i);
                list.add("测试2_" + i);
                list.add("测试3_" + i);
                list.add("测试4_" + i);
                resultList.add(list);
            }
            return resultList;
        }
    }

    结果如下:
          普通表格不删除模版列:
          

     
          普通表格删除模版列:
          

     
          带样式表格不删除模版列:
          

     
          带样式表格删除模版列:
           

     
          带合并单元格表格不删除模版列:
          

     
          带合并单元格表格删除模版列:
          

    原链接:http://53873039oycg.iteye.com/blog/2152759

  • 相关阅读:
    SDUT OJ 河床
    BZOJ 1500: [NOI2005]维修数列( splay )
    BZOJ 2049: [Sdoi2008]Cave 洞穴勘测( LCT )
    BZOJ 3401: [Usaco2009 Mar]Look Up 仰望( 单调栈 )
    BZOJ 1552: [Cerc2007]robotic sort( splay )
    BZOJ 1251: 序列终结者( splay )
    BZOJ 1576: [Usaco2009 Jan]安全路经Travel( 树链剖分 )
    BZOJ 3408: [Usaco2009 Oct]Heat Wave 热浪( 最短路 )
    BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛( deque )
    BZOJ 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题( dp )
  • 原文地址:https://www.cnblogs.com/dreammyle/p/4606867.html
Copyright © 2011-2022 走看看