前段时间做项目时,碰到了要导入Excel文件中的数据的需求,网上查了下,用的比较多的是jxl和apache的poi。刚开始用的是jxl(当时感觉它比较小巧)可是它貌似只能处理Excel2003及其以下版本的文件,而且在处理单元格前后的有全角空格时会出现乱码问题所以在处理时还得去掉首尾空格,最后跟客户沟通说是他们公司用的最多的是2007,果断放弃jxl,改用poi,毕竟是一百多人支持开发了10年的的开源项目,处理文件类型几乎囊括了微软的所有办公软件。。但是在用poi处理数据的时候出现了这样和那样的问题:如它把数字类型的值都按照double类型来处理了,而且如果是数字列有空单元格的话,它是算做是字符串类型的。。我把我写的处理代理拷贝过来,方便以后使用。。。嘿嘿...
package com.study.poi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.study.entity.Emp;
public class PoiExcelTest {
public static void main(String[] args) {
Class[] clazz=new Class[]{Integer.class,String.class,String.class,Integer.class,Date.class,Double.class,Double.class,Integer.class};
List<Emp> list=null;
DecimalFormat df=new DecimalFormat("0.00");
try {
list = readExcel("d:"+File.separator+"test.xls",clazz);
} catch (ParseException e) {
e.printStackTrace();
}
for (Iterator<Emp> iter=list.iterator(); iter.hasNext();) {
Emp emp=iter.next();
System.out.println("Emp:"+emp.getEmpno()+"\t"+emp.getEname()+"\t"+df.format(emp.getSal())+"\t"+df.format(emp.getComm())+"\t"+new SimpleDateFormat("yyyy-MM-dd").format(emp.getHiredate())+"\t"+emp.getDeptno());
}
}
private static int version2003=2003;
private static int version2007=2003;
private static int version=version2003;
private static Workbook wb;
private static Sheet sheet;
private static Row row;
private static Cell cell;
public static List<Emp> readExcel(String excelFilePath,Class[] clazz) throws ParseException{
List<Emp> list=new ArrayList<Emp>();
Emp emp;
version=(excelFilePath.endsWith(".xls")?version2003:version2007);
if(version==2003){
try {
InputStream stream=new FileInputStream(new File(excelFilePath));
wb=new HSSFWorkbook(stream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else if(version==2007){
try {
wb=new XSSFWorkbook(excelFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
sheet=wb.getSheetAt(0);
int rows=sheet.getLastRowNum();
int cells=sheet.getRow(0).getPhysicalNumberOfCells();
for (int i = 0; i < rows; i++) {
row=sheet.getRow(i+1);
emp=new Emp();
for (int j = 0; j < cells; j++) {
cell=row.getCell(j);
Object obj=getCellValue(cell, clazz[j]);
switch (j) {
case 0:
emp.setEmpno((Integer)obj);
break;
case 1:
emp.setEname((String)obj);
break;
case 2:
emp.setJob((String)obj);
break;
case 3:
emp.setMgr((Integer)obj);
break;
case 4:
emp.setHiredate(new SimpleDateFormat("yyyy-MM-dd").parse(obj.toString()));
break;
case 5:
emp.setSal((Double)obj);
break;
case 6:
emp.setComm((Double)obj);
break;
case 7:
emp.setDeptno((Integer)obj);
break;
default:
break;
}
}
list.add(emp);
}
return list;
}
public static Object getCellValue(Cell cell,Class clazz){
String name=clazz.getSimpleName();
if("String".equals(name)){
return cell.getStringCellValue();
}else if("Double".equals(name)){
try {
double valued=cell.getNumericCellValue();
return valued;
} catch (Exception e) {
return 0.0;
}
}else if("Integer".equals(name)){
try {
int valuei=(int)cell.getNumericCellValue();
return valuei;
} catch (Exception e) {
return 0;
}
}else if("Date".equals(name)){
if(HSSFDateUtil.isCellDateFormatted(cell)){
Date date=cell.getDateCellValue();
if(date==null){
return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
}else{
return new SimpleDateFormat("yyyy-MM-dd").format(date);
}
}
}
return null;
}
}
下载地址:http://poi.apache.org/download.html
分享到:
相关推荐
poi读取excel2007和2003兼容工具例子.利用简单工厂方法
之前用jxl发现不支持excel2007,不得以就去用poi实现excel的读取了!本人亲测的一个实例,支持excel2007!
java读取excel,并且兼容2003和2007. 附带实例 可自定义表头,行读取开始位置、结束位置,列开始位置、结束位置
NULL 博文链接:https://ahomeeye.iteye.com/blog/1571090
NULL 博文链接:https://cgs1999.iteye.com/blog/1525665
JAVA用POI读取和创建2003和2007版本Excel完美示例 同时还有相关的类包 注意工程里面别存在冲突类包
一个读取excel2003、2007、2010的类
ExcelUtil借助反射和POI对Excel读取,省略了以往读取Excel的繁琐步骤,调用ExcelUtil只需要2步,对,你没有看错,2步足以读取到Excel的内容.兼容03/07版Excel.
兼容解析 Excel2003 Excel2007 的工具 将Excel 每一行数据封装成map集合 方便开发者读取excel中数据 用到的jar包有 xmlbeans-5.1.6.jar 和 poi-bin-3.8-20120326.zip中的包
NULL 博文链接:https://chong0660.iteye.com/blog/1923204
java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
使用POI官网上的事件驱动模式的示例方法,读取单sheet的Excel表格文件(.xlsx),Microsoft Excel和WPS Excel创建的表格文件可以正常读取数据,但是java代码创建的表格文件(不使用软件打开并保存)却读取不到数据。...
用于office文件的处理的工具类,word文档的读取和处理。excel文件的处理. 官网上下载的免费资源
poi3.7 完整版jar包,有需要的可以下载,个人用过比较好,已经兼容了excel2007,可以方便的读取excel中的内容 POI是“Point of Interest”的缩写,可以翻译成“兴趣点”吧,每个POI包含四方面信息,名称、类别、经度...
将读取和写入Excel写成了兼容的工具类。对初学者和开发朋友也许有帮助
ExcelUtil 借助反射和 POI 对 Excel 读取,省略了以往读取 Excel 的繁琐步骤,调用 ExcelUtil 只需要2步,对,你没有看错,2步足以读取到 Excel 的内容。自动赋值,传入对应Model所在路径,即可自动赋值。自动匹配...
poi读取xlsx后缀名的excel时需要用到jar包,希望你们能用到
通过java poi,对excel表格进行读取的工具类!比较使用以及做过了兼容,可以读取xls,xlsx
二、jxls对应版本是2.4,由于POI3.15版本之前读取xlsx文件的批注有bug,3.15版本才解决,所以本实例只能操作excel2003,如果诸位的poi版本在3.15或以上的话,xlsx文件同样可以操作; 三、我没有将修改后的jxls源码...