主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点: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> 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> resultList,int tableRowSize,boolean isDelTmpRow) throws Exception {
Iterator iterator = doc.getTablesIterator();
XWPFTable table = null;
List rows=null;
List cells=null;
List 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 list=resultList.get(i);
cells=row.getTableCells();
//插入的行会填充与表格第一行相同的列数
for(int k=0,klen=cells.size();k0){
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> generateTestData(int num) {
List> resultList = new ArrayList>();
for (int i = 1; i <= num; i++) {
List list = new ArrayList();
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 谢谢。
全文完。