这么好的东西怎么可以不属于java呢?所以就出现了poi包。
所谓的操作excel无非就是将我们的信息写入excel文件和获得excel文件中的信息。这个是我们关心的重点。
首先创建excel文件。
static public void main(String arg[]) throws IOException
//
//
//
//
可以看到我们的输出结果了。
那么既然我们要操作excel就不是要创建一个空的excel文件,那样的话就没有意思了,还不如直接用excel了。重点是我们要将我们的信息写入excel中。
在excel 中信息都是放在一个有一个sheet页中的。那么没一个sheet也对java来说就是一个对象,但是这个对象的产生要依赖于excel对象,也就是 HSSFWorkbook对象。要不sheet页放在那里呢?那么在poi中sheet页对象是那个呢?在poi中sheet映射为HSSFSheet对象。刚已经说了,sheet页对象的存在的前提就是HSSFWorkbook对象的存在。
方法如下,HSSFWrokbook hssfworkbook = new HSSFWorkbook();
//以前版本好像会出现中文不支持的情况,使用3.0版本可以跳过些段。
这样我们就建立了一个自己的excel文件,和一个自己的excel文件中的sheet页。但是当使用方法
Hssfworkbook.createSheet(“”);方法的时候,如果要建立的sheet页要用中文命名,那么会出现乱码的情况,出现这个情况的原因就是:excel文件默认的编码规则是ENCODING_COMPRESSED_UNICODE
但是中文不支持或者说这个编码规则不支持中文,那么怎么办啊.能不能因为他不支持中文就放弃了啊!答案是不能,那么怎么办啊,转码啊.方法如下:
Hssfworkbook.createSheet();
Hssfworkbook.setSheetName(0,”哈哈中文咯”,HSSFWorkbook.ENCODING_UTF_16);
//然后我们像上边一样输出社个文件
好了以上我们就输出了一个包括了中文命名sheet页的excel文件。但是我们的目的是不是输出这个东西啊,我们的目的是输出信息。那么我们来输出信息了,在excel文件中的信息存放形式是这样的,首先文件是严格按照行列形式存放在每个单元格中,于是poi中就用HSSFRow对象来映射excel中的行,(也可以说是代替)那么列怎么映射呢?这里就体现出了poi创造者的智慧了,他使poi在获得了行对象之后,通过这个行对象来创建了一个格子对象,同时将信息存放在格子(HSSFCell)对象中,同时借用了格子的数目达到了对列的映射。具体方法如下。
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
// 以上就不用说了,这里通过hssfsheet对象的createRow(int i)方法创建了一个行对象同时指定了就是第一行
//然后在这个行对象上创建了一个单元格对象,就是HSSFCell对象。Hssfrow.createCell()方法的参数是short型的,这里一定要注意转型。
hssfcell.setCellValue("哈哈也是中文咯");
//然后给这个单元格对象设定值
这个时候我们发现了第一个单元格的中文没有显示出来,同时日期型数据也没有给我们正确的显示出来。我们来一个一个的解决,中文问题出现的原因刚已经说了是因为字符的问题,将上面蓝色的部分替换成下边这样即可:
hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
注意:hssfcell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
这句一定要写在给单元格设定值的前面,个人建议在单元格建立之后直接就写这个方法,无论单元格里是不是中文。
好了中文的问题解决了,就要处理日期的问题了:
我们在excel中看到的那串数字其实不是日期型的乱码,而是excel将日期型作为了long型来处理了,那么要这样才能得到我们要的那种日期呢? java中有一个包叫java.text其中多是些操作字符传,日期,数字等等的规则方法,建议有时间多看看,但是在poi中不能这样用,于是poi给了我们一个特殊的对象,就是excel样式表对象,所谓的样式表就是按照预先定义好了的方式来进行数据的显示,在页面上很常用,要是有精力的人还是要看看,虽然对java程序员来说意义不大,但是义不压人吗?
好了废话少说来定义excel中的日期样式:同样excel也给出了一个HSSFCellseyle对象,那么我们就来操作这个对象好了啊。方法如下:
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
其中蓝色的地方就是要进行修改的地方。
到这里我们就可以自由的用poi来操作excel文件的信息输出部分了。
信息输出的目的是为了更好的读取(引自“今天的撤退就是为了明天的胜利!”)
既然我们把信息当成了这样或者那样的对象输出的,那么我们就再把信息按照这样和那样的对象读取出来就可以了。如果你清楚了怎么输出那么输入就比较简单了,只要知道几个方法就OK了。
例子如下:
String filepath = "d:excela.xls";
解释一下: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型的。
遍历execl每行下的每一个cell(单元格)
FileInputStream fis = new FileInputStream(filePath);
HSSFWorkbook book = new HSSFWorkbook(fis);
HSSFSheet sheet = book.getSheetAt(0);
// 遍历行
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
HSSFRow row = sheet.getRow(i);
no.clear();// 清空
// 遍历列
for (int j = row.getFirstCellNum(); j < row
.getLastCellNum(); j++) {
Cell cell = row.getCell(j, Row.RETURN_BLANK_AS_NULL);
int type = cell.getCellType();
if (type == Cell.CELL_TYPE_STRING) {
System.out.println("string \t"
+ cell.getStringCellValue());
no.add(cell.getStringCellValue());
}
if (type == Cell.CELL_TYPE_NUMERIC) {
System.out.println("number \t"
+ df.format(cell.getNumericCellValue()));
no.add(df.format(cell.getNumericCellValue()));
}
}
String mobileno = no.get(0);
String rmobileno = no.get(1);
其他教材:http://www.chineselinuxuniversity.net/articles/33964.shtml