posts - 2, comments - 12, trackbacks - 0, articles - 12

java中读取Excel文件

Posted on 2006-04-17 14:01 BBZ.DD.A 阅读(21248) 评论(6)  编辑  收藏 所属分类: 我的文章分类
												以前介绍了二种产生Excel报表的方法,一个过於简单,一个只能用於window平台(因为使用jdbc-odbc bridge),且无法使用到Excel内部的各种公式或是方法,因此,今天介绍一个apache出的元件叫POI,它可以在UNIX或window平台处理word或Excel档案,而不需要依靠window的com,并且可设定储存格格式、列印格式等等;今天我来介绍其中有关资料读取、新增、修改及删除的功能,若各位网友研究好其他的功能,麻烦Email给我(ljj@mlc.edu.tw),分享给大家! 

一、需要用的档案:jakarta-poi-1.8.0-dev-20020917.jar 
 几乎每天都有1.8.0的最新版(但非正式版),正式的版本是1.5.0 
 http://jakarta.apache.org/builds/jakarta-poi/nightly/ 
 将档案复制到classpath所指到的地方 

二、有兴趣的朋友可以参考 
  http://jakarta.apache.org/poi/ 

三、先建立一个叫做book1.xls的Excel档,内容如下 
---------------------------------- 
项目  单价  数量   合计 
CPU   7000  5    35000 
硬碟  2500  2    5000 
记忆体 1600  3    4800 
---------------------------------- 
其中合计的栏位是设定公式,单价*数量 



四、资料读取範例
<%@ 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>

										

Feedback

# re: java中读取Excel文件  回复  更多评论   

2006-04-17 14:12 by BBZ.DD.A
我Down下的是poi-2.5.1 解压后 添加poi-2.5.1-final-20040804.jar 第三方类到工程中

之后在页面也直接import即可

# re: java中读取Excel文件  回复  更多评论   

2006-08-14 21:11 by 赵海
版主:
您好!看见您的帖子,非感激动,最近我也在作一个关于读取Excel信
息保存到数据库服务器端上的业务。如下:
1 客户端创建好xls文件后,默认已经有三个sheet表名分别是sheet1,sheet2,sheet3。
sheet1中的每一个单元格里可能有数据,也可能没有数据。
2 读取sheet1单元格预期的数据,row是"行标",col是"列标",即cell(col,row),依次读取
cell(0,0);cell(1,0);cell(2,0);cell(3,0),...;cell(col,row).
4 程序期望运行结果:如果cell(col,row)单元格中有数据就接着进读取数据,把它保存起
了,继续读取下一个单元格数据;如果单元格中没有任何数据,就接着进行读取下一个单元
格数据,直到循环结束。
5 程序实际望运行结果:当程序读取到cell(col,row)单元格时,如果有数据就接着运行;
如果没有任何数据时,程序就自动跳转到异常去了,无法正常继续运行!
6 我试过用“null”和“”进行判断,都无法识别cell(col,row)单元格是否有数据存在。当
在cell(col,row)中输入空格或是其他字符后,接着删除掉,那么用“”或是“null”可以
识别到是否有数据存在;当cell(col,row)自创建xls文件到什么也不输入时,就无法识
别cell(col,row)单元格是否有数据存在。我试过POI包的方式,也无法识别单元格中是
否有数据存在。
7 请问在jxl包中是否有一个会识别cell(col,row)中为空的方法,当cell(col,row)
为空时就出现一个判断标志,以判断标志去控制程序不去读取空单元格,接着去读取下
一个单元个数据直到程序运行完?如果没有,怎样才能实现我的这种问题?
8 我的QQ:380462843 Email:zhaohai314@126.com。

请给予指点!帮助!
谢 谢

# re: java中读取Excel文件  回复  更多评论   

2006-11-26 17:52 by qinhj
楼主 上面的代码测试过吗?公式的值能取到吗?我现在在做一个项目就需要取公式里边的值,但是始终都去不到。
按照你的例子那样我cell.setCellFormula(cell.getCellFormula());但是报异常了,String数组越界。

# re: java中读取Excel文件  回复  更多评论   

2008-01-08 13:19 by hcrete QQ:176046046
在执行cell.setCellFormula(cell.getCellFormula());前要先判断该单元格的类型

# re: java中读取Excel文件  回复  更多评论   

2008-09-08 09:16 by hongye
楼主,如何读取excel中的百分数啊,我读到的都变成小数了,能不能把百分数读出来

# re: java中读取Excel文件  回复  更多评论   

2014-04-11 22:37 by 最代码
最代码上有不少关于java操作excel的代码,可以看看这个:http://www.zuidaima.com/share/1550463406312448.htm
http://www.zuidaima.com/share/search.htm?key=excel

只有注册用户登录后才能发表评论。


网站导航: