使用 poi 导入execl模版文件添加数据制作报表

突然发现好久没写blog了,上一篇还是14年10月更新的,不是这段时间没编码,而是恰恰相反,这段时间实在太忙了,所以没有时间更新

项目中经常要制作报表而完全自己用poi生成报表太繁杂了,于是想用制作好的execl 替换数据实现报表的生成.

我对这各功能做好了封装,请看代码:

package com.newnewbank.utils.doc;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 * @author 刘夏楠
 * 用于按照xls模版生成xls
 * 适用于仅有一个sheet的xls
 */
public class TempleteXlsCreator implements XlsCreator {
	private SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
	private File file;
	private String dir;
	{
		dir=this.getClass().getClassLoader().getResource("/").getPath();
		dir=dir.replace("classes", "xlsTemp");
		///F:/workspace_v1.5/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/newnewbank-finance/WEB-INF/xlsTemp/
		//dir="D:\\xls\\";
	}
	public TempleteXlsCreator(String tempName) throws IOException{
		String fileAbsolutePath=dir+tempName+".xls";
		file=new File(fileAbsolutePath);
		load();
	}
	private HSSFWorkbook wb;
	private HSSFSheet sheet;
	public void load() throws IOException{
		InputStream is = new FileInputStream(file);
		this.wb= new HSSFWorkbook(is);
		this.sheet = wb.getSheetAt(0);
	}

	private void setValue(HSSFCell cell,Object value){
		if(value instanceof Integer){
			cell.setCellValue((Integer)value);
		}
		if(value instanceof Double){
			cell.setCellValue((Double)value);
		}
		if(value instanceof String){
			cell.setCellValue((String)value);
		}
		if(value instanceof Date){
			cell.setCellValue(sdf.format((Date)value));
		}
	}

	public void replace(int row,int col,Object value){
		HSSFRow hssfRow=sheet.getRow(row);
		HSSFCell cell=hssfRow.getCell(col);
		setValue(cell, value);
	}

	/**
	 * @param row 创建的行下标
	 * @param values 本行的所有值
	 * @param styleCopayRow 复制样式的行(创建本行前)
	 * @param styleCopyCol 复制样式的列(创建本行前)
	 * 本行的所有列都 套用 styleCopayRow 和 styleCopyCol 指定的单元格的样式
	 */
	public void createRow(int row,Object[] values,int styleCopayRow,int styleCopyCol){
		HSSFRow styleHssfRow=sheet.getRow(styleCopayRow);
		HSSFCell styleCell=styleHssfRow.getCell(styleCopyCol);
		HSSFCellStyle cellStyle=styleCell.getCellStyle();
		createRow(row, values, cellStyle);
	}
	/**
	 * @param row 创建的行下标
	 * @param values 本行的所有值
	 * @param cellStyle 单元格的样式
	 */
	public void createRow(int row,Object[] values,HSSFCellStyle cellStyle){

		sheet.shiftRows(row, sheet.getLastRowNum(), 1,true,false);
		HSSFRow hssfRow=sheet.createRow(row);
		for (int i = 0; i < values.length; i++) {
			HSSFCell cell=hssfRow.createCell(i);
			setValue(cell, values[i]);
			cell.setCellStyle(cellStyle);
		}
	}

	/* (non-Javadoc)
	 * @see com.newnewbank.utils.doc.xlsCreator#write(java.lang.String)
	 */
	@Override
	public void write(String path) throws IOException{
		File outPutFile=new File(path);
		if(!outPutFile.exists()){
			outPutFile.createNewFile();
		}

		FileOutputStream os = new FileOutputStream(outPutFile);
	    wb.write(os);
	    os.close();
	}

	/* (non-Javadoc)
	 * @see com.newnewbank.utils.doc.xlsCreator#write(java.io.OutputStream)
	 */
	@Override
	public void write(OutputStream outputStream) throws IOException{
		wb.write(outputStream);
		outputStream.close();
	}

	public static void main(String[] args) throws IOException {
		TempleteXlsCreator creator=new TempleteXlsCreator("(3)newnewbank");
//		creator.replace(1, 2, "标的名称");
		creator.createRow(5, new Object[]{"1","2",3,4,5,6,7,8},5,2);
		creator.write("D:\\xls\\abc123.xls");
	}

}

功能包装的比较简单

只有两个功能

1)使用 replace 替换 对应坐标的 cell的值(样式不变)

2)使用 createRow 创建一行并填值

public void createRow(int row,Object[] values,int styleCopayRow,int styleCopyCol);

public void createRow(int row,Object[] values,HSSFCellStyle cellStyle);

两种方法的区别是 所创建的单元格的样式的来源

第一种是 复制 styleCopayRow styleCopyCol 对应的单元格的样式

第二种是 设置新的样式

时间: 2024-09-29 00:11:10

使用 poi 导入execl模版文件添加数据制作报表的相关文章

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

【SSH项目实战】国税协同平台-7.POI导入用户列表文件

上次我们使用POI技术完成了用户列表的打印工作,下面我们来完成用户列表Excel文件的导入. 我们要导入这个Excel文件到我们的系统中: 确切的说,是我们要将excel中的数据导入到数据库中保存起来 我们的操作过程: 1.获取excel文件 2.导入 2.1.读取工作簿 2.2.读取工作表 2.3.读取行 2.4.读取单元格 2.5.保存用户 下面我们来进行具体的实现工作 我们在用户列表的jsp页面中可以看到还有一个"导出"的按钮, <input type="butt

java中使用poi导入导出excel文件_并自定义日期格式

Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使用java.此外,您可以读取和写入MS Word和PowerPoint文件使用java.Apache POI是java Excel解决方案(Excel 97-2008). 需要jar: poi-3.9-20121203.jar 导出 public static void main(String[]

android使用POI读写word doc文件

目录 1     读word doc文件 1.1     通过WordExtractor读文件 1.2     通过HWPFDocument读文件 2     写word doc文件 Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的.在hwpf里面我们使用HWPFDocument来表示一个word doc文档.在HWPFDocument里面有这么几个概念: l  Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是

使用POI读写word doc文件

Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的.在hwpf里面我们使用HWPFDocument来表示一个word doc文档.在HWPFDocument里面有这么几个概念: l  Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun) . l  Section:word文档的一个小节,一个word文档可以由多个小节构成. l

Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件. 2.excel定义成模板,里面只填写了所需要的数据,有可能数据有问题. 3.在导入的时候就需要对每个excel单元格的数据进行验证. 4.验证完之后,若所有数据正确,那么批量保存.若有一点点错误,就不执行保存操作,并提示错误原因. 思路: 1.完美使用了Map的功能,先将xml中的数据存入map

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])  本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   (三)SSIS的简介   (四)数据库中存储过程示例(SSIS应用需要) (五)Excel模板的制作(这步这么简单,稍微介绍一下)   (六)SSIS操作过程(生成Package,用来调用)(下一篇随笔将详细讲解制作Package包的过程,图片太多,篇幅过长,因此本文将直接采用生成的Package包进行

SqlServer2008 脚本导入Execl数据

使用SQL脚本导入Execl数据,是使用SQL的链接服务器的访问接口来完成的. 1.所以首先,需要数据库中有对应的Execl访问接口,使用的是SQlServer2008R2+Office2013,所以安装使用的是ACE2010的驱动 下载地址:  http://www.microsoft.com/zh-cn/download/details.aspx?id=13255 安装之后在数据会有对应的访问接口 2.开启Ad Hoc Distributed Queries --开启Ad Hoc Distr

ORA-03206,当表空间不够时,如何以添加数据文件的方式扩展表空间

准备导入一个数据库,大约为33G,开始创建的空库表空间为自增到20G,结果自然不够,然后就开始自动扩展表空间大小 使用的如下语句 --自动扩展表空间大小 ALTER DATABASE DATAFILE 'E:\app\oracle\oradata\ORCL\WORKFLOW01.ora' AUTOEXTEND ON NEXT 200M MAXSIZE 60000M; 然后就提示 ORA-03206,块大小超出范围云云 查了一下说是单个文件最大为32G,这里自增的有将近60G,所以就报错了 看了很