??????? 主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点: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? 谢谢。
??
???? 全文完。
?
原文:http://53873039oycg.iteye.com/blog/2152759