主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点: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 谢谢。
全文完。
相关推荐
本篇文章将详细讲解如何利用Apache POI库在Java中实现Word文档的数据填充以及多文件合并。 1. **Apache POI简介** Apache POI是一个开源项目,提供了一组API来处理Microsoft Office格式的文件,如DOCX(Word 2007...
`XWPFTable`和`XWPFTableRow`是Apache POI用于创建和操作Word表格的主要类。你可以预先在模板中设计好表格结构,然后在运行时填充数据。表格的行和列可以通过这些类的方法进行添加、删除和修改。 4. **Word报表...
在这个例子中,我们将探讨如何使用POI库来处理Word文档,特别是利用模板文件循环输出表格行并导出新的Word文档。这个过程在数据分析、报告生成或自动化文档制作等场景中非常有用。 首先,我们需要理解Word文档的...
本篇文章将深入探讨如何利用POI库在Word文档中进行模板替换以及循环插入表格的操作。 首先,我们需要理解Apache POI的工作原理。POI提供了HWPFOI(用于处理老版的.doc文件)和XWPF(用于处理新版的.docx文件)两个...
在这个场景中,我们关注的是如何利用Java POI库通过Word模板生成包含特定文本、表格和图片的报告。 首先,我们需要了解Java POI中的XWPFDocument类,它是用来处理.docx文件的。XWPFDocument可以读取、修改和创建...
在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入文本、表格和图片,以及生成新的Word报告。 1. **Java POI流处理Word模板**: - POI API提供了`XWPFDocument`类来处理`.docx`文件,这是Word 2007...
总结来说,这段代码展示了如何使用Java POI库创建一个动态Word文档生成器,它能够根据查询结果填充数据,合并单元格,调整文本样式,以及插入图片。这个功能对于生成报告、证书或任何需要自定义文本和图像的文档非常...
总的来说,Java POI为Java开发者提供了一个强大的工具,能够方便地处理Word文档,包括创建、修改和填充表单,这对于自动化报告生成、数据导出或任何基于Word文档的工作流程都是极其有用的。通过熟练掌握Java POI,你...
Apache POI是一个强大的Java库,专门用于处理...以上就是使用Apache POI在Java中替换Word模板关键字和动态追加表格的知识点。通过熟练掌握这些技术,你可以构建出强大的文档自动化处理工具,满足各种业务需求。
- 数据源集成:可以结合数据库查询结果或CSV数据来自动填充模板。 - 错误处理:确保处理可能出现的异常,例如文件不存在、IO错误等。 总之,Apache POI 3.9提供了强大的功能,让我们能够在Java环境中方便地操作...
本示例聚焦于使用POI库根据Word模板生成带有图片和文字的新Word文档。以下是对这一技术的详细解释: 1. **Apache POI库**:Apache POI是Apache软件基金会的一个开源项目,提供了Java API来操作Microsoft Office格式...
这个图片文件将是插入到Word表格中的元素。 以下是实现这一功能的基本步骤: 1. **创建Word文档**:初始化`XWPFDocument`对象,并创建一个新的`XWPFParagraph`。 2. **创建表格**:使用`XWPFDocument.createTable...
- 自动化报告:利用Word模板生成动态的业务报告,填充各种变量和计算结果。 - 文档处理:自动化处理大量Word文档,如批量替换文字、修改格式等。 6. **注意事项** - 性能优化:处理大型Excel文件时,要注意内存...
描述中提到的"定义好模板"是指在Word文档中预先设计好固定的格式,比如表格、标题、段落样式等,然后通过Apache POI的API填充动态数据。这种方式可以极大地提高批量生成或修改文档的效率。"导出需要的数据"意味着将...
你可以通过阅读这些代码来了解如何将数据库中的题目数据转换为Word文档,并结合模板进行排版和图片插入。记得,处理复杂格式和模板时,可能需要对Word文档的XML结构有深入理解,以便正确设置样式和位置。 在实际...
2. **生成Word表格**:使用Apache POI,你可以创建表格,设定行数、列数,填充数据。表格的样式,如边框、颜色、字体等,也可以进行定制。例如,你可以创建一个`XWPFTable`对象,然后添加`XWPFTableRow`和`...
Java使用Apache POI库导出Word文档是一种常见的技术实践,特别是在企业级应用中,用于生成报告、合同或者自定义的数据输出。Apache POI是Apache软件基金会的一个开源项目,它提供了处理Microsoft Office格式(如Word...
POI-TL是POI的一个扩展,专门用于处理Word文档(.docx格式),提供了更高级的功能,如模板填充和文档合并。 Apache POI库主要基于HSSF和XSSF组件,分别用于处理旧版的BIFF8格式(.xls)和新的OOXML格式(.xlsx)。...
通过模板,开发者可以预先定义好表格的样式、格式,包括单元格的字体、颜色、边框、对齐方式等,然后在运行时只需填充数据,即可生成与模板一致的Excel文件。这种方式既保证了导出表格的一致性,又减轻了开发的工作...
9. **处理复杂格式**: 尽管Apache POI 3.8对基本的Word操作支持良好,但对更复杂的格式(如页眉/页脚的自定义域、复杂表格样式、宏等)支持可能有限。对于这些高级特性,可能需要更新到更高版本的Apache POI。 10. ...