java使用POI操作Excel报表

来源:互联网 发布:淘宝直通车基础 编辑:程序博客网 时间:2024/05/05 19:36

HSSFWorkbook API:http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html

office办公软件的使用使得开发企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开。或者是:我们已经习惯用Excel打印。这样子如果用.net开发是没有问题的,但是有j2ee这个比.net更有前途的开放式的开发环境,难道我为了解决打印的要求去另写客户端的控件?或者在服务器端使用本地代码?第一种方案的问题是关键数据的处理有时候不能在客户端做,第2种方案的问题是牺牲了代码的可移植性和稳定性。

Apache的Jakata项目的POI子项目,目标是处理ole2对象。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。他是真正的Excel对象,可以控制一些属性如sheet,cell等等。现在HSSF已经成熟到能够和足够我们使用了

POI可以到www.apache.org下载到。编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。

hssf的各种对象都有例程的介绍。hssf提供的例程在org.apache.poi.hssf.usermodel.examples包中,共有14个,生成的目标xls都是workbook.xls。

如果你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。hssf都有测试代码。

那么Java是怎么样使用POI包操作excel的?

1。首先下载到http://www.apache.org/下载poi,在工程中引入然后:

在servlet里面的doGet方法写法如下:

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 java.io.*;

public void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
//设置返回数据类型 
response.setContentType("application/vnd.ms-excel;charset=GBK"); 
//设置返回的文件名 
response.setHeader("Content-Disposition", 
"attachment;Filename=Excel.xls"); 
//得到输出流 
OutputStream outStream = response.getOutputStream(); 
//新建一个工作薄 
HSSFWorkbook wb = new HSSFWorkbook(); 
//建一个插页 
HSSFSheet sheet = wb.createSheet("new sheet"); 
//插入多行,并加入数据 
for(int i=0;i<10;i++){ 
HSSFRow rowi = sheet.createRow((short) i); 
rowi.createCell((short)i).setCellValue(i); 

//开始写了数据流了噢! 
wb.write(outStream); 
outStream.flush(); 
}

2。直接把网页定义成excel文件

<%@ page contentType="application/msexcel" %> 
<!-- 以上这行设定本网页为excel格式的网页 --> 
<% 
response.setHeader("Content-disposition","inline; filename=test1.xls"); 
//以上这行设定传送到前端浏览器时的档名为test1.xls 
//就是靠这一行,让前端浏览器以为接收到一个excel档 
%> 
<html> 
<head> 
<title>Excel档案呈现方式</title> 
</head> 
<body> 
<table border="1" width="100%"> 
<tr> 
<td>姓名</td><td>身份证字号</td><td>生日</td> 
</tr> 
<tr> 
<td>李玟</td><td>N111111111</td><td>1900/11/12</td> 
</tr> 
<tr> 
<td>梁静如</td><td>N222222222</td><td>1923/10/1</td> 
</tr> 
<tr> 
<td>张惠妹</td><td>N333333333</td><td>1934/12/18</td> 
</tr> 
</table> 
</body> 
</html>

二、将网页资料以excel报表以下载的方式呈现 
这个jsp档和上一个差不多,只有差别在这一行: 
线上浏览的方式: response.setHeader("Content-disposition","inline; filename=test1.xls"); 
下载的方式: response.setHeader("Content-disposition","attachment; filename=test2.xls"); 
附注: 1.以上纯以静态网页的方式呈现excel档,配合资料库,你便能以动态的报表方式做出excel报表了 
2.完全不用安装任何元件,或只能受限於win平台,一个简单的方式解决你的报表需求 
3.聪明的你,应该能举一反三,知道如何将网页资料以word的doc格式展现了吧! 
(是不是只要把contentType改成"application/msword"以及filename的副档名改成.doc就可以了!)

3.最后一种方法,很简单哦

序号 名称 单价 数量 合计 
1 xxx 253 1 253 
2 ttt 433 1 433 
总数:2 合计:686


下面是poi详细的增删查找类型的,呵呵,网上转载,仅供参考

资料读取范例 
<%@ page contentType="text/html;charset=MS950" import="java.util.*,java.io.*" %> 
<%@ page import="org.apache.poi.poifs.filesystem.*,org.apache.poi.hssf.usermodel.*" %> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=MS950"> 
<title>读取Excel档案</title> 
</head> 
<body> 
<table border="1" width="100%"> 
<% 
FileInputStream finput = new FileInputStream(application.getRealPath("/")+"book1.xls" ); 
//设定FileINputStream读取Excel档 
POIFSFileSystem fs = new POIFSFileSystem( finput ); 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
HSSFSheet sheet = wb.getSheetAt(0); 
//读取第一个工作表,宣告其为sheet 
finput.close(); 
HSSFRow row=null; 
//宣告一列 
HSSFCell cell=null; 
//宣告一个储存格 
short i=0; 
short y=0; 
//以巢状回圈读取所有储存格资料 
for (i=0;i<=sheet.getLastRowNum();i++) 

out.println("<tr>"); 
row=sheet.getRow(i); 
for (y=0;y<row.getLastCellNum();y++) 

cell=row.getCell(y); 
out.print("<td>");

//判断储存格的格式 
switch ( cell.getCellType() ) 

case HSSFCell.CELL_TYPE_NUMERIC: 
out.print(cell.getNumericCellValue()); 
//getNumericCellValue()会回传double值,若不希望出现小数点,请自行转型为int 
break; 
case HSSFCell.CELL_TYPE_STRING: 
out.print( cell.getStringCellValue()); 
break; 
case HSSFCell.CELL_TYPE_FORMULA: 
out.print(cell.getNumericCellValue()); 
//读出公式储存格计算后的值 
//若要读出公式内容,可用cell.getCellFormula() 
break; 
default: 
out.print( "不明的格式"); 
break; 

out.println("</td>"); 

out.println("</tr>"); 

%> 
</table> 
</body> 
</html>

五、资料新增范例 
<%@ page contentType="text/html;charset=MS950" import="java.util.*,java.io.*" %> 
<%@ page import="org.apache.poi.poifs.filesystem.*,org.apache.poi.hssf.usermodel.*" %> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=MS950"> 
<title>插入资料至Excel档案</title> 
</head> 
<body> 
<% 
FileInputStream finput = new FileInputStream(application.getRealPath("/")+"book1.xls" ); 
//设定FileINputStream读取Excel档 
POIFSFileSystem fs = new POIFSFileSystem( finput ); 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
HSSFSheet sheet = wb.getSheetAt(0); 
//读取第一个工作表,宣告其为sheet 
finput.close(); 
HSSFRow row=null; 
//宣告一列 
HSSFCell cell=null; 
//宣告一个储存格 
short i=4; 
row=sheet.createRow(i); 
//建立一个新的列,注意是第五列(列及储存格都是从0起算) 
cell=row.createCell((short)0); 
cell.setEncoding(HSSFCell.ENCODING_UTF_16); 
//设定这个储存格的字串要储存双位元 
cell.setCellValue("显示卡"); 
cell=row.createCell((short)1); 
cell.setCellValue(1700); 
cell=row.createCell((short)2); 
cell.setCellValue(8); 
cell=row.createCell((short)3); 
//设定这个储存格为公式储存格,并输入公式 
cell.setCellFormula("B"+(i+1)+"*C"+(i+1)); 
try 

FileOutputStream fout=new FileOutputStream(application.getRealPath("/")+"book1.xls"); 
wb.write(fout); 
//储存 
fout.close(); 
out.println("储存成功<a href='book1.xls'>book1.xls</a>"); 

catch(IOException e) 

out.println("产生错误,错误讯息:"+e.toString()); 

%> 
</body> 
</html>

六、资料删除、修改范例 
<%@ page contentType="text/html;charset=MS950" import="java.util.*,java.io.*" %> 
<%@ page import="org.apache.poi.poifs.filesystem.*,org.apache.poi.hssf.usermodel.*" %> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=MS950"> 
<title>删除、修改资料至Excel档案</title> 
</head> 
<body> 
<% 
FileInputStream finput = new FileInputStream(application.getRealPath("/")+"book1.xls" ); 
//设定FileINputStream读取Excel档 
POIFSFileSystem fs = new POIFSFileSystem( finput ); 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
HSSFSheet sheet = wb.getSheetAt(0); 
//读取第一个工作表,宣告其为sheet 
finput.close(); 
HSSFRow row=null; 
//宣告一列 
HSSFCell cell=null; 
//宣告一个储存格 
row=sheet.getRow((short)4); 
//取出第五列 
if (row!=null) 
sheet.removeRow(row); 
//先侦测第五列存不存在,若在的话将第五列删除 
row=sheet.getRow((short)3); 
//取出第四列 
cell=row.getCell((short)2); 
//取出第三个储存格 
cell.setCellValue(7); 
//设定该储存格值为7 
cell=row.getCell((short)3); 
cell.setCellFormula(cell.getCellFormula()); 
//上两行为取出公式储存格,并重新计算(因为刚才更新过计算公式的值) 
//如果不做,公式计算后的值不会更新 
try 

FileOutputStream fout=new FileOutputStream(application.getRealPath("/")+"book1.xls"); 
wb.write(fout); 
//储存 
fout.close(); 
out.println("储存成功<a href='book1.xls'>book1.xls</a>"); 

catch(IOException e) 

out.println("产生错误,错误讯息:"+e.toString()); 

%> 
</body> 
</html>

原文:http://hi.baidu.com/yehaizi_2008/blog/item/3a60c18703c9b622c75cc352.html

原创粉丝点击