项目中需要用到数据录入,由此需要在项目中做一个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
}
总结:尽量匹配数据不需要动用数据库就不要动用数据库,将数据存入程序中检索,这对性能上会有极大的提高。
减少数据库语句执行次数也是提升性能的办法之一。有什么疑问,请留言或评论,还有更好的方法可以和我交流分享下
谢谢~