A. 如何提高poi读写excel文件(同一文件)的效率
我的代码
//导入普通客户信息
publicStringimportExcle(){
TEmployeeemployee=(TEmployee)request.getSession().getAttribute(
"employee");
TCustomerInfoc=newTCustomerInfo();
//声明数据流
InputStreamis=null;
if(employee!=null){
inthang=0;
intlie=0;
if(excel!=null){
try{
//解析excel2007版本文件
is=newFileInputStream(excel);
XSSFWorkbookwork=newXSSFWorkbook(is);
XSSFSheetsheet=work.getSheetAt(0);
introws=sheet.getPhysicalNumberOfRows();
//循环表的行,从第二行开始
for(inti=1;i<rows;i++){
hang=i+1;
c=newTCustomerInfo();
XSSFRowrow=sheet.getRow(i);
if(row==null){//判断是否为空
continue;
}
//读取该行的每一列
for(intj=0;j<row.getPhysicalNumberOfCells();j++){
XSSFCellcell=row.getCell(j);
if(cell==null){
continue;
}
if(cell.toString()==null
||"".equals(cell.toString())){
continue;
}
Stringv=Util.getXssfCellValue(cell);
switch(j){//通过列数来判断对应插如的字段
case0:
c.setCompanyName(v);
break;
case1:
c.setLinkName(v);
break;
case2:
c.setTell(v);
break;
case3:
c.setTelephone(v);
break;
case4:
c.setPosition(v);
break;
case5:
c.setEmail(v);
break;
case6:
c.setCompanyType(v);
break;
case7:
c.setCustomerType(v);
break;
case8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(employee.getName());
c.setCreateDate(newDate());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message","导入成功(=^_^=)");
}catch(Exceptione){
System.out.println("进入---解析excel2003版本文件--错误抛出");
try{
//解析excel2003版本文件
is=newFileInputStream(excel);
HSSFWorkbookwork=newHSSFWorkbook(is);
HSSFSheetsheet=work.getSheetAt(0);
if(sheet!=null){
introws=sheet.getPhysicalNumberOfRows();
//循环表的行,从第二行开始
for(inti=1;i<rows;i++){
hang=i+1;
c=newTCustomerInfo();
HSSFRowrow=sheet.getRow(i);
if(row==null){//判断是否为空
continue;
}
//循环表格的列
for(shortj=0;j<row
.getPhysicalNumberOfCells();j++){
HSSFCellcell=row.getCell(j);
if(cell==null){
continue;
}
if(cell.toString()==null||"".equals(cell.toString())){
continue;
}
Stringv=Util.getHssfCellValue(cell);
switch(j){//通过列数来判断对应插如的字段
case0:
c.setCompanyName(v);
break;
case1:
c.setLinkName(v);
break;
case2:
c.setTell(v);
break;
case3:
c.setTelephone(v);
break;
case4:
c.setPosition(v);
break;
case5:
c.setEmail(v);
break;
case6:
c.setCompanyType(v);
break;
case7:
c.setCustomerType(v);
break;
case8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(v);
c.setCreateDate(newDate());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message","导入成功(=^_^=)");
}
}catch(Exceptione1){
request.setAttribute("message","第"+hang+"行,第"
+lie+"列开始导入失败,请注意导入格式!!");
e1.printStackTrace();
}
}
}
}else{
request.setAttribute("message","登录超时,请重新登录!!");
}
//查询时对象中含有值对查询有误
if(customer!=null){
customer=null;
}
returncustomerList();
}
B. poi解析excel2003和2007有没有办法是用同样的方法实现
Poi解析2003时使用的是HSSFCell,而2007的则是
XSSFCell,是完全不同的两套API
必须先要判断excel的类型,不过 HSSFWorkbook 和 XSSFWorkbook 实现的接口都漏核散是一样的Workbook,直接在实氏正例化接口的时候有点区别其他时候没有任何差异。
比如,刚刚获取excle文件流,先判断excel格式确定用03还是07处理类实例化Workbook接口。
view sourceprint?
01.Workbook workbook = null;
02.if(Constants.ImportExport.EXCEL.equals(fileExtension))
03.{
04.workbook = new HSSFWorkbook(fin);
05.}
06.else
07.{
08.workbook = new XSSFWorkbook(fin);
09.}
获取workbook 后,后续处理Sheet、Row、Cell 统统用接口实现,不用关注返氏03,07差异性。也就是根本不会涉及到 XSSFCell、HSSFCell这些类。
相关类或接口:
view sourceprint?
1.import org.apache.poi.ss.usermodel.Workbook;
2.import org.apache.poi.hssf.usermodel.HSSFWorkbook;
3.import org.apache.poi.xssf.usermodel.XSSFWorkbook;
4.
5.import org.apache.poi.ss.usermodel.Sheet;
6.import org.apache.poi.ss.usermodel.Row;
7.import org.apache.poi.ss.usermodel.Cell;
C. java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的
思路为:为了防止数字变成科学计数法方式表示,在源文件以及java代码中都用文本的方式去生成和袭察解析excel,具体如下:
1.生成Excel时,设置单元格格式为STRING,即:
//关键代码
HSSFCellcell=newHSSFCell();
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
2.同理,解析察脊的时候,首先要保证源excel文件中该单元格格式是文本类型的,然后在java代码里用STRING类型去解败禅渗析:
//关键代码
Stringvalue=cell.getStringCellValue();
D. java poi根据列头解析excel
这个需要你自己写方法. 遍历你毁伏模的表头行每厅森个单元格的数据
对比你传的参数 匹配时 返回 该单元格的列号. 然后再用不同的row去get得到的纤缓列号
E. java 用POI处理比较大的word和excel文档。
java的主要有两种方法
1、使用POI,这样的包,直接的是根据office文件的相应规则,进行解析封装
2、使用jcob这样的,通过调用office的dll文件,操作
第一种优点:
不需要在环境上安装office,纯java环境,开发文档较全,使用方便
缺点:
对于office的某些功能,特性兼容不是很全面,但一般的内容也可以满足
第二种优点:
对于office文件的兼容性良好,和使用word,excel的操作基本上是一样的
缺点:
由于是通过java调用office来完成,所以需要在环境上安装office,文档较少
F. poi解析excel表头不在一行
原因是POI导轿手纯入Excel文件时,读取的数据少了一行。
如果是使用 XSSFSheet 对象来获取行数的话,那获取闭咐行数的方法应该是:
1.XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
2.XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
3.int row = xssfSheet.getPhysicalNumberOfRows();
而不是使用int rows = xssfSheet.getLastRowNum();来获薯蠢得行数。