上篇博客,我们介绍了,导入导出的Excel配置,这篇博客我们来介绍一下导入导出的具体实现。
【功能介绍】
1、导入
点击选择文件,执行导入操作(主要是将Excel表格中的内容与Excel配置中的内容进行对比,相当于一步检查吧):
默认从sheet1中的第一行(字段行)开始导入。左边是Excel中的字段名列表,右边是从Excel配置中读取的字段名列表,可以调整右边Option的字段位置,使之与左边的对应,而且左边列表要大于等于右边的列表,否则数据库执行插入数据操作时会出现错误。当然这些都可以根据具体的Excel表来进行修改。点击确认按钮即执行真正的导入操作。
2、导出
主要是完成两个步骤:导出Excel,下载Excel,点击导入按钮,自动将参数提交到后台,执行导出代码。默认下载路径到系统的下载路径下(C:\Users\bill\Downloads)。
【关键代码】
1、导入
(1)创建文件信息,初始化文件
//创建文件、得到初始信息
@RequestMapping({"/excelupload/buildfile"})
@ResponseBody
public ModelAndView upload(HttpServletRequest req,String typeid,String mainId,String inputtype,String pid) throws Exception{
String refurl = req.getParameter("refurl"); //刷新链接
List<String> title=null;//得到表头
List<Map<String,Object>> fields=uploadService.queryColumn(typeid,ExcelInfo.SHOW_YES,ExcelInfo.SHOW_YES);//表字段
String fileName=null;
String url=null;
String realpath = ServletUtils.getSysProperty(req,"SYS_FILEPATH");
String realpath2="\\excelfile\\";
url=realpath+realpath2;
//
MultipartHttpServletRequest multireq = (MultipartHttpServletRequest) req;
//
fileName=java.net.URLDecoder.decode(multireq.getFile("file").getOriginalFilename(), "UTF-8");
//
List<MultipartFile> files = multireq.getFiles("file");
//创建url
StringBuffer fileUrl = new StringBuffer();
//年份规则
fileUrl.append(Calendar.getInstance().get(Calendar.YEAR)+UFConstant.separator);
//月份规则
fileUrl.append(Calendar.getInstance().get(Calendar.MONTH)+1+UFConstant.separator);
//日规则
fileUrl.append(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)+UFConstant.separator);
//创建文件目录
File fileDir = new File(url+fileUrl.toString());
if(!fileDir.exists()){
fileDir.mkdirs();
}
//生成随机文件名+路径
fileUrl.append(UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."),fileName.length()));
//1.构建输入流
InputStream fis = files.get(0).getInputStream();//new FileInputStream(srcFile.getInputStream());
//绝对路径
url=url+fileUrl.toString();
//2.构建输出流
FileOutputStream fos = new FileOutputStream(new File(url));
//3.通过字节写入输出流
try {
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) > 0) {
fos.write(buf, 0, len);
}
} catch (Exception e) {
throw e;
} finally {
closeOut(fos);
closeIn(fis);
}
//得到Excel 表头
title=ExcelUtils.readExcelTitle(url,fileName,"1","0");
List<Map<String,Object>> sheetNumber=ExcelUtils.sheet(url, fileName);
ModelAndView mv = new ModelAndView("/nsbd/excel/uoload.jsp");
req.setAttribute("titlen",title.size());
req.setAttribute("sheetnumber",sheetNumber);
req.setAttribute("title", title);
req.setAttribute("fields", fields);
req.setAttribute("path", url);
req.setAttribute("typeid", typeid);
req.setAttribute("inputtype", inputtype);
req.setAttribute("filename", fileName);
req.setAttribute("refurl", refurl);
req.setAttribute("mainId", mainId);
req.setAttribute("pid", pid);
return mv;
}
(2)从Excel中读取数据
********
(3)导入到数据库
//Excel数据入库
public boolean add(List<List<Object>> list,String field,String typeId,String userid,String mainId,String jl_id){
List<Map<String,Object>> noShowfields=queryColumn(typeId,ExcelInfo.SHOW_NO,ExcelInfo.SHOW_YES);//表字段
String[] nShowFiledArr = new String[noShowfields.size()];
for(int i=0;i<noShowfields.size();i++){
nShowFiledArr[i] = noShowfields.get(i).get("key_column").toString();
}
boolean b=false;
String table=null;
String temp[]=field.split(",");
String fields[]=new String[temp.length+nShowFiledArr.length];
String tablesql="select distinct t_table from "+tableInfo+" where id='"+typeId+"'";
List<Map<String, Object>> tableLsit=this.selectForList(tablesql);
for(Map<String, Object> m:tableLsit){
table=(String) m.get("t_table");
}
for(int i=0;i<temp.length;i++){
fields[i]=temp[i];
}
for(int i=0;i<nShowFiledArr.length;i++){
fields[temp.length+i]=nShowFiledArr[i];
}
Iterator<List<Object>> it=list.iterator();
while(it.hasNext()){
List<Object> rowlist=(List<Object>) it.next();
List<Object> cotout=rowlist.subList(0, temp.length);
String primaryKey = UUID.randomUUID().toString();
for(int i=0;i<noShowfields.size();i++){
String ctype = noShowfields.get(i).get("ctype").toString();
//设置excel配置中的导入但不显示的字段值
if("del".equalsIgnoreCase(ctype)){//删除标识
cotout.add(Constant.DEL_NO);
}else if ("addtime".equalsIgnoreCase(ctype)){
Timestamp datetime=new Timestamp(System.currentTimeMillis());
cotout.add(datetime);
}else if("pkey".equalsIgnoreCase(ctype)){//主键
cotout.add(primaryKey);
}else if("reporter".equalsIgnoreCase(ctype)){//上报人
cotout.add(userid);
}else if("relation".equalsIgnoreCase(ctype)){//关联id
cotout.add(mainId);
}
}
Object[] obj=cotout.toArray();
int i=this.insert(table,obj,fields);
List<Object> params = new ArrayList<Object>();
params.add(UUID.randomUUID().toString());
params.add(jl_id);
params.add(primaryKey);
params.add(table);
//this.insert(tableRecord,params.toArray(),"id,jl_id,inputid,btype");
if(i>0){
b=true;
}
}
return b;
}
2、导出(先存储到服务器,后下载)
/**
* 导出
* @param req
* @param response
* @param typeid 所操作的表的Id
* @param mainId 主表Id
* @param tablename 表的名称
*/
@RequestMapping({"/invoicing/invoicingcheckdetail/export"})
@ResponseBody
public void export(HttpServletRequest req,HttpServletResponse response,String typeid,String mainId,String tablename,String pid){
String url=ExcelUtils.fileName(req);//服务器文件路径
List<Map<String, Object>> titleColumn=uploadService.queryColumn(typeid, ExcelInfo.SHOW_YES,ExcelInfo.SHOW_YES);//表头和字段
List<Map<String,Object>> list=invoicingService.getList( mainId,tablename);
if(pid!=null && pid!=""){
String keyTitle = "";
List newList = new ArrayList();
Map dictMap = new HashMap();
String[] pId=pid.split(",");
for(int i=0;i<pId.length;i++){
pid=pId[i];
List<Datadict> dicts = datadictService.findNowListByPid(pid);
for(Datadict mp:dicts){
dictMap.put(mp.getDictcode(),mp.getDictname());
}
}
for(Map record:list){
for(Map tcolumn:titleColumn){
String ctype = tcolumn.get("ctype").toString();
if(StringUtils.isNotBlank(ctype)&&"datadict".equals(ctype)){
keyTitle = tcolumn.get("key_column").toString();
if(StringUtils.isNotBlank(record.get(keyTitle).toString())){
record.put(keyTitle, dictMap.get(record.get(keyTitle)));
}
}
}
newList.add(record);
}
ExcelUtils.exportExcel(url, titleColumn, newList);//存储到服务器
}else{
ExcelUtils.exportExcel(url, titleColumn, list);//存储到服务器
}
ExcelUtils.outPut(url, response);//下载
}
【总结】
系统的导入导出功能,基本上就是这个样子,这也是第一次做导入导出的功能,虽然这些代码并不是我写的,但是看别人的代码也是一种学习,从看代码这件事情上,我的收获是:以后写代码一定要写清注释,如果这个功能是通用的,比方说很多系统都会用,最好有一个文档来介绍,这样别人在去用的时候就能够很快的理清楚逻辑,能够快速的上手。但是,在这个混乱的代码中我们也学会了很多东西,例如调错能力,正是在混乱中锻炼了我们~
接下来,工作流的走起~ 在混乱中锻炼思维,在混乱中成长~