Java通过POI读写Excel文件——于晓昆

http://www.nit-pro.org/ReadNews_shisheng.asp?NewsID=7865

 

 在企业项目中经常要用Java来读写Excel或者Word文档,Excel是微软的office产品中的一个重要产品,并且也是非常流行的产品。现在走在大街上的10个人可能都不知道java是什么东西,但是可能10个人都知道怎么操作Excel。Excel的流行是有原因的,很方便,很通用,很简单。
这么好的东西怎么可以不属于java呢?所以就出现了poi包。
      首先呢?poi是java开源组织的贡献(因为java的开源导致很多人在研究它,进而出现了许多的开源组织。);具体是那个组织我们就不要知道了,但是要会用。
      Poi 说白了就是别人写好的一些操作excel的class,打成了一个.jar包!既然人家已经写好了,我们就不要知道其内部的东西,我们只要会使用poi给我们留的接口就可以了,如果想知道内部是这样运行的就下一个src包看看好了啊。可以更加方便帮助你对poi的理解。那么首先到http://apache.justdn.org/jakarta/poi  我下的是poi-bin-2.5.1-final-20040804
      因为大家要听我讲,建议统一一下文件的版本就下这个好了啊,然后解压这个文件,进入解压之后的文件中,会找到这样3个.jar包。如下图:
建议大家自己建立一个文件夹,比如我的就叫Mylib 然后将这3个.jar包拷贝到Mylib文件夹中,然后打开eclips导入这个3个.jar文件。
所谓的操作excel无非就是将我们的信息写入excel文件和获得excel文件中的信息。这个是我们关心的重点。
首先创建excel文件。
static public void main(String arg[]) throws IOException
       {
              /**创建一个空白的excel文件,这个是excel文件在java中的对象,java不是操作对象的语言吗?
               *那么就将一个excel文件映射成为一个对象。然而这个excel的对象在java就是HSSFWorkbook
               *那么也就是说:在java中你要使用poi来操作excel那么HSSFWorkbook对象就是你要操作的那个excel文件,
               *当HSSFWorkbook 对象是一个空对象的时候,就默认为你创建了一个excel文件
               */
              HSSFWorkbook hssfworkbook = new HSSFWorkbook();
//           建议大家,当使用一个未知的类或者接口也好,当创建这个类或者接口的对象,最好用其全称的小写方式,容易记录。学的能快点
              FileOutputStream fileoutputstream = new FileOutputStream("D:exceltext.xls");
//           通过java的io包创建一个要输出的文件,但是文件名要用“.xls”结尾
              hssfworkbook.write(fileoutputstream);
//           调用HSSFWorkbook对象的write方法根据excel本书的规范生产新文件。注:并不是说你把文件是用什么结尾就是什么类型的文件。
              fileoutputstream.close();
//           输出完成之后要关闭文件流。要节约系统资源,同时可以避免不必要的麻烦。然后执行这段程序。
       }结果如下图:


可以看到我们的输出结果了。
那么既然我们要操作excel就不是要创建一个空的excel文件,那样的话就没有意思了,还不如直接用excel了。重点是我们要将我们的信息写入excel中。
在excel 中信息都是放在一个有一个sheet页中的。那么没一个sheet也对java来说就是一个对象,但是这个对象的产生要依赖于excel对象,也就是 HSSFWorkbook对象。要不sheet页放在那里呢?那么在poi中sheet页对象是那个呢?在poi中sheet映射为HSSFSheet对象。刚已经说了,sheet页对象的存在的前提就是HSSFWorkbook对象的存在。
方法如下,HSSFWrokbook hssfworkbook = new HSSFWorkbook();
 HSSFSheet     hssfsheet    = hssfworkbook.createSheet(“sheet_one”);
     //到这里我们就通过HSSFWorkbook对象创建了HSSFSheet对象。同时将这个sheet页定名为sheet_ont 也可以这样创建sheet页:hssfworkbook.createSheet(); hssfworkbook.setSheetName(0,””)其中0代表sheet页的编号,在hssfworkbook对象中的每一个sheet页是按照数组的形式存储的,那么第一个sheet页的数组下标就应该是0,可以从方法名字setSheetName看出来这个方法是给已经有的sheet页定义名字的,那么如果这个sheet页尚未建立,那么给一个根本没有的sheet页定义名字就会出现异常情况。
     //然后我们像上边一样输出社个文件
     FileOutputStream fileoutputstream = new FileOutputStream(“D:exceltext.xls”);
        Hssfworkbook.write(fileoutputstream);
     Fileoutputstream.close();
     然后我们进入d盘的excel文件夹中打开text.xls文件,我们将看到如下的效果。

 

这样我们就建立了一个自己的excel文件,和一个自己的excel文件中的sheet页。但是当使用方法

Hssfworkbook.createSheet(“”);方法的时候,如果要建立的sheet页要用中文命名,那么会出现乱码的情况,出现这个情况的原因就是:excel文件默认的编码规则是ENCODING_COMPRESSED_UNICODE

但是中文不支持或者说这个编码规则不支持中文,那么怎么办啊.能不能因为他不支持中文就放弃了啊!答案是不能,那么怎么办啊,转码啊.方法如下:

Hssfworkbook.createSheet();

Hssfworkbook.setSheetName(0,”哈哈中文咯”,HSSFWorkbook.ENCODING_UTF_16);

//然后我们像上边一样输出社个文件

     FileOutputStream fileoutputstream = new FileOutputStream(“D:exceltext.xls”);

        Hssfworkbook.write(fileoutputstream);

     Fileoutputstream.close();

效果如下:



好了以上我们就输出了一个包括了中文命名sheet页的excel文件。但是我们的目的是不是输出这个东西啊,我们的目的是输出信息。那么我们来输出信息了,在excel文件中的信息存放形式是这样的,首先文件是严格按照行列形式存放在每个单元格中,于是poi中就用HSSFRow对象来映射excel中的行,(也可以说是代替)那么列怎么映射呢?这里就体现出了poi创造者的智慧了,他使poi在获得了行对象之后,通过这个行对象来创建了一个格子对象,同时将信息存放在格子(HSSFCell)对象中,同时借用了格子的数目达到了对列的映射。具体方法如下。

HSSFWorkbook hssfworkbook = new HSSFWorkbook();

              HSSFSheet    hssfsheet    = hssfworkbook.createSheet("frist");

              HSSFRow      hssfrow      = hssfsheet.createRow(0);

// 以上就不用说了,这里通过hssfsheet对象的createRow(int i)方法创建了一个行对象同时指定了就是第一行

              HSSFCell     hssfcell     = hssfrow.createCell((short)0);

//然后在这个行对象上创建了一个单元格对象,就是HSSFCell对象。Hssfrow.createCell()方法的参数是short型的,这里一定要注意转型。

hssfcell.setCellValue("哈哈也是中文咯");

//然后给这个单元格对象设定值

              hssfrow.createCell((short)1).setCellValue(new Date());

              hssfrow.createCell((short)2).setCellValue(false);

              hssfrow.createCell((short)3).setCellValue(12.00);

              FileOutputStream fileoutputstream = new FileOutputStream("d:excela.xls");

              hssfworkbook.write(fileoutputstream);

              fileoutputstream.close();

执行这个程序结果如下:

这个时候我们发现了第一个单元格的中文没有显示出来,同时日期型数据也没有给我们正确的显示出来。我们来一个一个的解决,中文问题出现的原因刚已经说了是因为字符的问题,将上面蓝色的部分替换成下边这样即可:
hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
              hssfcell.setCellValue("哈哈也是中文咯");
然后执行程序结果如下:

注意:hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);

这句一定要写在给单元格设定值的前面,个人建议在单元格建立之后直接就写这个方法,无论单元格里是不是中文。


好了中文的问题解决了,就要处理日期的问题了:

我们在excel中看到的那串数字其实不是日期型的乱码,而是excel将日期型作为了long型来处理了,那么要这样才能得到我们要的那种日期呢? java中有一个包叫java.text其中多是些操作字符传,日期,数字等等的规则方法,建议有时间多看看,但是在poi中不能这样用,于是poi给了我们一个特殊的对象,就是excel样式表对象,所谓的样式表就是按照预先定义好了的方式来进行数据的显示,在页面上很常用,要是有精力的人还是要看看,虽然对java程序员来说意义不大,但是义不压人吗?

好了废话少说来定义excel中的日期样式:同样excel也给出了一个HSSFCellseyle对象,那么我们就来操作这个对象好了啊。方法如下:

HSSFWorkbook hssfworkbook = new HSSFWorkbook();

              HSSFSheet    hssfsheet    = hssfworkbook.createSheet();

              hssfworkbook.setSheetName(0, "哈哈中文咯",HSSFWorkbook.ENCODING_UTF_16);

              HSSFRow      hssfrow      = hssfsheet.createRow(0);

              HSSFCell     hssfcell     = hssfrow.createCell((short)0);

              hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);

              hssfcell.setCellValue("哈哈也是中文咯");

              HSSFCellStyle hssfcellstyle = hssfworkbook.createCellStyle();

              hssfcellstyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

             

              HSSFCell celldate = hssfrow.createCell((short)1);

              celldate.setCellValue(new Date());

              celldate.setCellStyle(hssfcellstyle);

              hssfrow.createCell((short)2).setCellValue(false);

              hssfrow.createCell((short)3).setCellValue(12.00);

              FileOutputStream fileoutputstream = new FileOutputStream("d:exceltext.xls");

              hssfworkbook.write(fileoutputstream);

              fileoutputstream.close();

其中蓝色的地方就是要进行修改的地方。结果如下图:

到这里我们就可以自由的用poi来操作excel文件的信息输出部分了。

 

信息输出的目的是为了更好的读取(引自“今天的撤退就是为了明天的胜利!”)

既然我们把信息当成了这样或者那样的对象输出的,那么我们就再把信息按照这样和那样的对象读取出来就可以了。如果你清楚了怎么输出那么输入就比较简单了,只要知道几个方法就OK了。

例子如下:

String filepath = "d:excela.xls";

              HSSFWorkbook hssfworkbook = new HSSFWorkbook(new FileInputStream(filepath));

              HSSFSheet    hssfsheet    = hssfworkbook.getSheetAt(0);

              int i = hssfsheet.getLastRowNum();

              for(int k=0;k<=i;k++)

              {

                     HSSFRow hssfrow = hssfsheet.getRow(k);

                     for(int j=0;j<hssfrow.getLastCellNum();j++)

                     {

                            HSSFCell hssfcell = hssfrow.getCell((short)j);

                            System.out.println(hssfcell.getDateCellValue());

                     }

              }

解释一下:filepath 是你要操作的excel,通过有参数的HSSFWorkbook()构造器我们可以获得一个已有的excel文件,就像我们打开一个excel文件一样。因为一个excel文件可能有多个sheet页。那么我们首先要定位操作那个sheet页。方法是:hssfworkbook.getSheetAt (0);

这个方法其实也是一个创建sheet页的过程,但是由于对象在已经有了(显示中),我们就引用就可以了。

得到要操作的sheet页之后就要操作信息了,int i = hssfsheet.getLastRowNum();这个方法很重要的,就是我们通过HSSFSheet对象,获得了这个对象下最大的行数。然后用这个作为索引可以遍历所有的行,方法是:HSSFRow hssfrow = hssfsheet.getRow(k);这样就依次的获得了每个行对象,然后根据行对象了

hssfrow.getLastCellNum ()这个方法就可以获得对于的行中最大了单元格的数目,然后通过HSSFCell hssfcell = hssfrow.getCell((short)j);这个方法得到单元格的内容;注意标红的位置,也是一个short型的。

 

    现在是晚上3:33了,我必须睡觉了,要不明天该起不来了,写的不是很细致,如果有问题可以联系我的啊,我是于晓昆! (于晓昆msn:yxk790302@hotmail.com

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java使用POI库可以实现对Excel文件的读取操作。具体的步骤如下: 1. 引用POI库。在Java项目中引入POI相关的jar包。 2. 创建文件输入流。使用FileInputStream类创建一个输入流对象,并指定要读取的Excel文件路径。 3. 创建工作簿对象。使用HSSFWorkbook类创建一个工作簿对象,将输入流作为参数传入。 4. 获取工作表。使用getSheetAt方法获取指定的工作表,可以通过工作表的索引或名称进行获取。 5. 获取行。使用getRow方法获取指定行的对象,行号作为参数传递给该方法。 6. 获取单元格。使用getCell方法获取指定单元格的对象,行号和列号作为参数传递给该方法。 7. 获取单元格的值。使用getStringCellValue方法获取单元格的值,将其赋给一个字符串变量。 8. 输出结果。使用System.out.println方法将获取到的数据打印出来。 需要注意的是,在读取Excel文件时可能会出现FileNotFoundException和IOException异常,需要进行异常处理。同时,在读取完成后,需要关闭输入流。 下面是一个示例代码,用于演示Java使用POI读取Excel文件: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; 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; public class ExcelReader { public static void poiRead() { FileInputStream xlsStream = null; try { // 创建文件输入流 xlsStream = new FileInputStream(new File("C:\\Users\\itour\\Desktop\\poiTest.xls")); // 创建工作簿对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(xlsStream); // 获取工作表 HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0); // 获取行 HSSFRow row = sheetAt.getRow(0); // 获取单元格 HSSFCell cell = row.getCell(0); // 获取单元格的值 String cellValue = cell.getStringCellValue(); System.out.println("获取到的数据是:" + cellValue); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (xlsStream != null) { try { xlsStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 以上代码演示了如何使用POI库读取Excel文件中第一个工作表的第一个单元格的值。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值