您的位置:首页 > 其它

POI解决EXCLE导入03,07兼容性问题

2015-08-21 09:44 555 查看
项目中需要用到数据录入,由此需要在项目中做一个EXCLE导入数据功能,原先项目导入是用jxl写的,我进行用poi优化与改造。

我们先写一个工具类来判断文件的格式与版本。

<span style="white-space:pre">	</span>/**
* 获取文件名称后缀
* @param filename
* @return
*/
public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
导入domain层代码:

/**
* 导入
* @param pset
*/
public void insertProjectCform(ParameterSet pset){
//楼上获取文件流信息
Record record=(Record)pset.get("records");
ExcelUploadFile excelUploadFile=(ExcelUploadFile)record.toBean(ExcelUploadFile.class);
UploadFile file =excelUploadFile.getCformFile();<span style="font-family: Arial, Helvetica, sans-serif;">//平常的获取路径的写法,是适用于本机。</span>

Workbook xwb = null;//定义工作簿

try {
if(FileUtil.getExtensionName(file.toString()).equals("xls")){
xwb = new HSSFWorkbook(file.getInputStream());
//System.out.print("xls版本");
}else{
xwb = new XSSFWorkbook(file.getInputStream());
//System.out.print("xlsx版本");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

/*********读取excel里的数据**************/
Sheet uploadsheet=xwb.getSheetAt(0);
Row row = null;//对应excle的行
//接受数据对象
Syj  syj = null;
//接受数据对象List
List<Syj> list = new ArrayList<Syj>();
//定义删除所需的List集合
List<String> delList =  new ArrayList<String>();
//定义批量删除所需的数组
Object[] delarray = null;
int totalRow = uploadsheet.getLastRowNum();//得到excle的总记录条

//企业名称集合
List<String> qymcList =  new ArrayList<String>();
for (int i = 1; i <= totalRow; i++) {
row = uploadsheet.getRow(i);
qymcList.add(row.getCell(1).toString());
}
<span style="white-space:pre">		</span>//数据集
DataSet ds = qcmd.queryJgdmXzqhXzqhdm(qymcList);

for (int i = 1; i <= totalRow; i++) {
syj = new Syj();
row = uploadsheet.getRow(i);
if(row.getCell(0).toString()==""){//数据主件为空则结束循环,EXCLE用户可能并没输入信息但是表格也在也会被读取会报空值错误
break;
}
String Qymc= row.getCell(1).toString();
Record recordds=GetRecord(Qymc,ds);  //java中的Ds并没有检索信息的功能只能自己写了....
syj.setXxxx(row.getCell(0).toString());

//			   Cell cell=row.getCell(7);
//			   cell.setCellType(Cell.CELL_TYPE_STRING);//设置列的类型为String 要不然有时候数是浮点
syj.setLxdh(getCellValue(row.getCell(7)));//调用后面写的格式方法

//对机构代码集合进行遍历,查找出单条数据匹配的对象
//将匹配到的对象,赋值 /
//			   syj.setgggg(zjjdao.queryXXXX(syj.getQymc()));
//			   syj.setxxxzqh(zjjdao.queryAAA(syj.getJgdm()));
//			   syj.setxxxxzqhdm(zjjdao.queryBBB(syj.getJgdm()));
//上面的方法对性能来说比较差,每一次都要去数据库匹配这样不行~

<span style="white-space:pre">			</span> //获取数据集DS中检索出来匹配的记录进行赋值
if(recordds!=null){
syj.setgggg(recordds.get("zzjgdm").toString());
syj.set<span style="font-family: Arial, Helvetica, sans-serif;">xxxzqh</span>(recordds.get("xzqh").toString());
syj.setxxxxzqhdm(recordds.get("xzqhdm").toString());
}

<span style="white-space:pre">			</span>//批量删除LIST集合
delList.add(syj.getXkzh());
<span style="white-space:pre">			</span>//批量插入LIST集合
list.add(syj);
}

delarray = delList.toArray();
/*批量操作*/

dao.batchDelete(delarray);
dao.batchInsert(list);

}


更改Cell的类型格式方法:

/*
* 依据用户可能输入错误(电话号码不是字符串格式,和日期不是字符串格式)
*/
public String getCellValue(Cell cell){
String value = null;
switch(cell.getCellType()){
case Cell.CELL_TYPE_STRING://字符串类型
value = cell.getStringCellValue(); //必须加~要不然调用的时候会变空值
break;
case Cell.CELL_TYPE_NUMERIC:
cell.setCellType(Cell.CELL_TYPE_STRING);//将Excle列格式转换
value = cell.getStringCellValue();
break;
default:
break;

}
return value;
}


JAVA中对Dataset的操作:

<span style="white-space:pre">	</span>/**
* 从数据集ds中检索需要的信息记录并提取出来
* @param qymc
* @param ds
* @return
*/
public Record GetRecord(String str,DataSet ds)
{
Record R = null;
Record R1 = null;
for(int i=0;i<=ds.getCount()-1;i++)
{
R1=ds.getRecord(i);
if(R1.get("记录中的值").equals(str)){
R=R1;
}
}
return R; //返回record
}


总结:尽量匹配数据不需要动用数据库就不要动用数据库,将数据存入程序中检索,这对性能上会有极大的提高。

减少数据库语句执行次数也是提升性能的办法之一。有什么疑问,请留言或评论,还有更好的方法可以和我交流分享下

谢谢~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: