Java利用apache的POI操作Excel

最近在写一些报表的活,顺便总结下。。。第一篇博文,希望多多指教。

项目中经常会设计到一些数据的报表问题,目前java中操作Excel的插件也有很多 ,我说下用apache的POI操作Excel的方法。

首先,最简单 一种方法就是直接从本地读取Excel模版,然后往Excel里添加数据,

首先需要加载POI的几个包,目前最新的版本是3.9的,读取本地Excel的代码如下

package com.zhao.poi;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.struts2.ServletActionContext;

/**
 * 类名:
 * 描述:利用POI读取excel模版信息
 * 类型:
 * 作者:ZhaoLibin
 * 日期:2013-01-22
 */
public class ReadExcelTemplate {

	private HttpServletResponse response = ServletActionContext.getResponse();
	
	/**
	 * 描述:测试主方法信息
	 * 参数:
	 * 返回:
	 * 作者:ZhaoLibin
	 * 日期:2013-01-22
	 */
	public static void main(String[] args) throws IOException{
		
		readExcelTemplate();
	}
	
	public static void readExcelTemplate() throws IOException{
		
		FileInputStream in = new FileInputStream("C:/新退休审批名册(归并后启用).xls");
		POIFSFileSystem fs = new POIFSFileSystem(in);
		
		HSSFWorkbook wb = new HSSFWorkbook(fs);
		HSSFSheet sheet = wb.getSheetAt(0);
		HSSFRow row = sheet.getRow(5);
		
		HSSFCell cell = row.getCell((short)0);//姓名
		cell.setCellValue("Zhaolibin");
		cell = row.getCell((short)1);//性别
		cell.setCellValue("男");
		cell = row.getCell((short)2);//出生年月o
		cell.setCellValue("1990-04-02");
		cell = row.getCell((short)3);//参加工作年月
		cell.setCellValue("2012-07");
		cell = row.getCell((short)4);//连续工龄
		cell.setCellValue(1);
		cell = row.getCell((short)5);//职务
		cell.setCellValue("java程序猿");
		cell = row.getCell((short)6);//退休年月
		cell.setCellValue("2033-06");
		
		FileOutputStream out = new FileOutputStream("c:/加入数据的退休审批名册.xls");
		wb.write(out);
	}
	
}

  比较简单,如果是在J2EE项目中,一般我们需要在页面生成下载流,可以把Excel模版放在项目webRoot下面,获得此路径的方法如下:

String path = ServletActionContext.getServletContext().getRealPath("/");

如在webRoot建立文件夹fileTemplate,并把我们的Excel模版“新退休审批名册(归并后启用).xls”放在此文件夹下,读取文件路径可以这么写

String filePath = path+"fileTemplate/新退休审批名册(归并后启用).xls";

当然我们还需要设置response的响应头,我们操作文件过程中,最重要的就是对流的控制,打开流之后一定要关闭,不然就会一直在我们的java虚拟机中,导致我们无法正常读取文件,J2EE中在页面生成下载流的代码如下:

package com.zhao.poi;

import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.struts2.ServletActionContext;

/**
 * 类名:
 * 描述:利用POI读取excel模版信息
 * 类型:
 * 作者:ZhaoLibin
 * 日期:2013-01-22
 */
public class ReadExcelTemplate {

	private HttpServletResponse response = ServletActionContext.getResponse();//响应流
	private String path = ServletActionContext.getServletContext().getRealPath("/");//webRoot路径
	
	/**
     * 描述:设置下载响应信息
     * 参数:
     * 返回:
     * 作者:ZhaoLibin
     * 日期:2013-01-14
     */
    public void setResponseHeader(String title){  
    	
        try{  
        	response.setContentType("application/vnd.ms-excel;charset=UTF-8");  
            response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(title, "UTF-8"));
            //客户端不缓存   
            response.addHeader("Pargam", "no-cache");  
            response.addHeader("Cache-Control", "no-cache");  
        }catch(Exception ex){
            ex.printStackTrace();  
        }
    }
	
    /**
     * 描述:入口方法信息
     * 参数:
     * 返回:
     * 作者:ZhaoLibin
     * 日期:2013-01-22
     */
	public void readExcelTemplate(){  
	        
	 try {  
		 	setResponseHeader("退休审批名册.xls");  
		 	readExcelTemplate(response.getOutputStream());  
            response.getOutputStream().flush();  
            response.getOutputStream().close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
	 }
	
	/**
	 * 描述:操作模版Excel信息
	 * 参数:
	 * 返回:
	 * 作者:ZhaoLibin
	 * 日期:2013-01-22
	 */
	public void readExcelTemplate(OutputStream os){
		
		try{
			FileInputStream in = new FileInputStream(path+
								"fileTemplate/retirement_examine/新退休审批名册(归并后启用).xls");
			POIFSFileSystem fs = new POIFSFileSystem(in);//POI读取输入流
			HSSFWorkbook wb = new HSSFWorkbook(fs);//代表整个excel
			HSSFSheet sheet = wb.getSheetAt(0);//得到excel里的第一个sheet表单 如有多个表单可以改变参数来获得
			HSSFRow row = sheet.getRow(5);//得到sheet表单的第几行,注意excel相当于一个二维数组,下标是从0开始的
											//这里获取的是第6行,我的模版前5行都是表头菜单
			//设置值
			HSSFCell cell = row.getCell((short)0);//姓名
			cell.setCellValue("Zhaolibin");
			cell = row.getCell((short)1);//性别
			cell.setCellValue("男");
			cell = row.getCell((short)2);//出生年月o
			cell.setCellValue("1990-04-02");
			cell = row.getCell((short)3);//参加工作年月
			cell.setCellValue("2012-07");
			cell = row.getCell((short)4);//连续工龄
			cell.setCellValue(1);
			cell = row.getCell((short)5);//职务
			cell.setCellValue("java程序猿");
			cell = row.getCell((short)6);//退休年月
			cell.setCellValue("2033-06");
			
			wb.write(os);//在response响应中生成下载流
		}catch(Exception e){
			e.printStackTrace();//按照你们日志的设置格式,把异常添加到日志里
		}
	}
}

  以上就是项目中读取excel模版的方法,比较简单但还是挺实用的,因为如果你在模版中设置好了Excel的各种样式表头,在实际操作中只要加入数据即可。

posted @ 2013-01-22 11:29  Zhao Libin  阅读(356)  评论(0)    收藏  举报