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的各种样式表头,在实际操作中只要加入数据即可。

浙公网安备 33010602011771号