POI动态生成数据并删去多余模版

POI动态生成数据并删去多余模版_第1张图片
POI动态生成数据并删去多余模版_第2张图片

需求:

1、生成一个模版,记账形式,一组分为两页,第一联“记账联”,第二联“客户联”。

2、设置标记:"$页首",表示新的一页;"对账ID",替换成ID。

3、这样的一组两页尽可能生成更多,至少满足于最多的数据条数的2倍(因为一条数据分别插入两页中);然后删除多余的空白页。



package doc;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.xwpf.usermodel.BodyElementType;
import org.apache.poi.xwpf.usermodel.IBodyElement;
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.XWPFTableRow;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import po.HTDZPZ;
import util.DbUtil;
/**
 * XWPF 生成docx
 * @author founder
 * @time 2017-12-13
 */
public class WordDocx {

	/**
	 * POI XWPF 根据模板生成记账单
	 * 
* author:os.liuqiang *
* 2017-12-12 * @param sourceFile 源路径文件 * @param newsf 新路径生成文件 * @param whereStr 数据表的条件语句 * @param zdr 制单人 */ public void poiDocxTables(String sourceFile,String newsf,String whereStr,String zdr) { try { InputStream is=new FileInputStream(sourceFile); //XWPFDocument xwpf1=new XWPFDocument(is); XWPFDocument xwpf=new XWPFDocument(is); OutputStream os=new FileOutputStream(newsf); //所有表格 Iterator itTab= xwpf.getTablesIterator(); //所有普通段落 Iterator itPg= xwpf.getParagraphsIterator(); List listHtdzpz=getListHTDZPZ(whereStr); if(listHtdzpz.size()==0) { return; } int pageHeader=0;//临时变量 while (itPg.hasNext()) { XWPFParagraph paragraph1=itPg.next(); if(paragraph1.getText().indexOf("$页首")!=-1) { //设置每一页的开头,标记是新页 pageHeader++; List listRuns=paragraph1.getRuns(); while (listRuns.size()>0) { paragraph1.removeRun(0); } } //删除多余页(段落),只有一段一段remove if(listHtdzpz.size()0) { paragraph1.removeRun(0); } //打上删除标记 XWPFRun run1=paragraph1.createRun(); run1.setText("$删除"); paragraph1.addRun(run1); continue; } if(paragraph1.isEmpty()) { continue; } if(paragraph1.isPageBreak()) { System.out.println("isPageBreak:"+paragraph1.getText()); continue; } if(paragraph1.getText().indexOf("开票日期")!=-1) { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); Date d=Calendar.getInstance().getTime(); String today= sdf.format(d); //在段落最后添加时间 XWPFRun run1=paragraph1.createRun(); run1.setText(today); paragraph1.addRun(run1); continue; } if(paragraph1.getText().indexOf("对账ID")!=-1) { //替换成ID if(listHtdzpz.size()0) { paragraph1.removeRun(0); } XWPFRun run1=paragraph1.createRun(); HTDZPZ htdzpz=listHtdzpz.get(pageHeader-1); run1.setText(htdzpz.getID()); paragraph1.addRun(run1); continue; } if(paragraph1.getText().indexOf("制单人")!=-1) { XWPFRun run1=paragraph1.createRun(); run1.setText(zdr); paragraph1.addRun(run1); continue; } } //表格数据填充 int tempTabNum=0;//临时变量 while(itTab.hasNext()) { XWPFTable tab=itTab.next(); tempTabNum++; if(listHtdzpz.size()=0;i--){ tab.removeRow(i); } continue; } HTDZPZ HTDZPZ= listHtdzpz.get(tempTabNum-1); //认购人 tab.getRow(0).getCell(1).setText(HTDZPZ.getTRUSTORNAME()); //缴款日期 tab.getRow(0).getCell(3).setText(HTDZPZ.getCHANGETIME()); //认购项目 tab.getRow(1).getCell(1).setText(HTDZPZ.getPROGRAMNAME()); //认购金额 tab.getRow(2).getCell(1).setText(HTDZPZ.getCHANGESUM()); //人民币 tab.getRow(2).getCell(3).setText(HTDZPZ.getCHANGESUM()); } //删除多余 List listBe= xwpf.getBodyElements(); for(int i=0;i * author:os.liuqiang *
* 2017-12-6 * @param whereStr * @return */ @SuppressWarnings("unchecked") public List getListHTDZPZ(String whereStr) { Session session=null; session = DbUtil.getSession(); Query query = null; Transaction ts = null; List listHT= null; try{ ts = session.beginTransaction(); String sql="select ID,TRUSTORNAME,CHANGETIME,PROGRAMNAME,CHANGESUM from YWXT_V_HTDZPZ " +" where 1=1 "+whereStr; query=session.createSQLQuery(sql); List list=query.list(); ts.commit(); listHT=new ArrayList(); for(int i=0;i


package doc;




public class Test {

	
	public static void main(String[] args) {
		try{
	//		WordDocx4j wd=new WordDocx4j();
			WordDocx wd=new WordDocx();
			String whereStr="and ID in ('201708291290700022017111700000080','20170731902300032017073100000010') ";
			String sf="C:\\OS.LIUQ\\htdz.docx";
			String newsf="C:\\OS.LIUQ\\htdzNew.docx";
			String zdr="李白";
			//sourceFile 源路径文件
			//newsf 新路径生成文件
			//whereStr 数据表的条件语句
			//zdr 制单人
			wd.poiDocxTables(sf, newsf,whereStr,zdr);
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}
















你可能感兴趣的:(POI动态生成数据并删去多余模版)