`
53873039oycg
  • 浏览: 843713 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]poi word2007表格按模版样式填充行数据

    博客分类:
  • poi
 
阅读更多

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

  • 大小: 42.4 KB
  • 大小: 39.6 KB
  • 大小: 77 KB
  • 大小: 70.5 KB
  • 大小: 48.8 KB
  • 大小: 46.7 KB
0
0
分享到:
评论
1 楼 wang3048 2016-11-08  
模板怎么设置,我试的找不到加载的地方?

相关推荐

    java运用poi填充word数据并将多个word合并为一个

    本篇文章将详细讲解如何利用Apache POI库在Java中实现Word文档的数据填充以及多文件合并。 1. **Apache POI简介** Apache POI是一个开源项目,提供了一组API来处理Microsoft Office格式的文件,如DOCX(Word 2007...

    java Apache poi word模板 表格模板 word报表.zip

    `XWPFTable`和`XWPFTableRow`是Apache POI用于创建和操作Word表格的主要类。你可以预先在模板中设计好表格结构,然后在运行时填充数据。表格的行和列可以通过这些类的方法进行添加、删除和修改。 4. **Word报表...

    POI使用word模板文件循环输出行并导出word

    在这个例子中,我们将探讨如何使用POI库来处理Word文档,特别是利用模板文件循环输出表格行并导出新的Word文档。这个过程在数据分析、报告生成或自动化文档制作等场景中非常有用。 首先,我们需要理解Word文档的...

    java使用poi操作.doc word模板替换,循环插入表格

    本篇文章将深入探讨如何利用POI库在Word文档中进行模板替换以及循环插入表格的操作。 首先,我们需要理解Apache POI的工作原理。POI提供了HWPFOI(用于处理老版的.doc文件)和XWPF(用于处理新版的.docx文件)两个...

    Java Poi流根据Word模板插入相应的文本、表格和图片,并生成新的Word报告。

    在这个场景中,我们关注的是如何利用Java POI库通过Word模板生成包含特定文本、表格和图片的报告。 首先,我们需要了解Java POI中的XWPFDocument类,它是用来处理.docx文件的。XWPFDocument可以读取、修改和创建...

    Java Poi流 根据Word模板插入相应的文本、表格和图片,生成新的Word报告

    在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入文本、表格和图片,以及生成新的Word报告。 1. **Java POI流处理Word模板**: - POI API提供了`XWPFDocument`类来处理`.docx`文件,这是Word 2007...

    java poi 填充word(合并单元格,添加图片,设置字号)(csdn)————程序.pdf

    总结来说,这段代码展示了如何使用Java POI库创建一个动态Word文档生成器,它能够根据查询结果填充数据,合并单元格,调整文本样式,以及插入图片。这个功能对于生成报告、证书或任何需要自定义文本和图像的文档非常...

    java poi操作word模版文件生成表单和修改

    总的来说,Java POI为Java开发者提供了一个强大的工具,能够方便地处理Word文档,包括创建、修改和填充表单,这对于自动化报告生成、数据导出或任何基于Word文档的工作流程都是极其有用的。通过熟练掌握Java POI,你...

    POI替换word模板中的关键字

    Apache POI是一个强大的Java库,专门用于处理...以上就是使用Apache POI在Java中替换Word模板关键字和动态追加表格的知识点。通过熟练掌握这些技术,你可以构建出强大的文档自动化处理工具,满足各种业务需求。

    使用poi-3.9通过模板实现对word写入内容的demo

    - 数据源集成:可以结合数据库查询结果或CSV数据来自动填充模板。 - 错误处理:确保处理可能出现的异常,例如文件不存在、IO错误等。 总之,Apache POI 3.9提供了强大的功能,让我们能够在Java环境中方便地操作...

    java使用poi根据word模板生成word(图片及文字).zip

    本示例聚焦于使用POI库根据Word模板生成带有图片和文字的新Word文档。以下是对这一技术的详细解释: 1. **Apache POI库**:Apache POI是Apache软件基金会的一个开源项目,提供了Java API来操作Microsoft Office格式...

    poi 将echar报表生成到word table表格中

    这个图片文件将是插入到Word表格中的元素。 以下是实现这一功能的基本步骤: 1. **创建Word文档**:初始化`XWPFDocument`对象,并创建一个新的`XWPFParagraph`。 2. **创建表格**:使用`XWPFDocument.createTable...

    poi解析excel、word2007,2010等版本

    - 自动化报告:利用Word模板生成动态的业务报告,填充各种变量和计算结果。 - 文档处理:自动化处理大量Word文档,如批量替换文字、修改格式等。 6. **注意事项** - 性能优化:处理大型Excel文件时,要注意内存...

    poi3.15,word模板以及代码

    描述中提到的"定义好模板"是指在Word文档中预先设计好固定的格式,比如表格、标题、段落样式等,然后通过Apache POI的API填充动态数据。这种方式可以极大地提高批量生成或修改文档的效率。"导出需要的数据"意味着将...

    POI生成word文档

    你可以通过阅读这些代码来了解如何将数据库中的题目数据转换为Word文档,并结合模板进行排版和图片插入。记得,处理复杂格式和模板时,可能需要对Word文档的XML结构有深入理解,以便正确设置样式和位置。 在实际...

    java生成word,包括word表格,表格插入图片,jar包都在了

    2. **生成Word表格**:使用Apache POI,你可以创建表格,设定行数、列数,填充数据。表格的样式,如边框、颜色、字体等,也可以进行定制。例如,你可以创建一个`XWPFTable`对象,然后添加`XWPFTableRow`和`...

    Java使用POI导出Word文档

    Java使用Apache POI库导出Word文档是一种常见的技术实践,特别是在企业级应用中,用于生成报告、合同或者自定义的数据输出。Apache POI是Apache软件基金会的一个开源项目,它提供了处理Microsoft Office格式(如Word...

    POI-TL合并多个Word文档

    POI-TL是POI的一个扩展,专门用于处理Word文档(.docx格式),提供了更高级的功能,如模板填充和文档合并。 Apache POI库主要基于HSSF和XSSF组件,分别用于处理旧版的BIFF8格式(.xls)和新的OOXML格式(.xlsx)。...

    easypoi 模板导出

    通过模板,开发者可以预先定义好表格的样式、格式,包括单元格的字体、颜色、边框、对齐方式等,然后在运行时只需填充数据,即可生成与模板一致的Excel文件。这种方式既保证了导出表格的一致性,又减轻了开发的工作...

    poi3.8操作word

    9. **处理复杂格式**: 尽管Apache POI 3.8对基本的Word操作支持良好,但对更复杂的格式(如页眉/页脚的自定义域、复杂表格样式、宏等)支持可能有限。对于这些高级特性,可能需要更新到更高版本的Apache POI。 10. ...

Global site tag (gtag.js) - Google Analytics