[简单]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  谢谢
  
     全文完
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值