关闭

【NSBD】——导入导出代码实现

449人阅读 评论(16) 收藏 举报

   上篇博客,我们介绍了,导入导出的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);//下载
	}

【总结】

   系统的导入导出功能,基本上就是这个样子,这也是第一次做导入导出的功能,虽然这些代码并不是我写的,但是看别人的代码也是一种学习,从看代码这件事情上,我的收获是:以后写代码一定要写清注释,如果这个功能是通用的,比方说很多系统都会用,最好有一个文档来介绍,这样别人在去用的时候就能够很快的理清楚逻辑,能够快速的上手。但是,在这个混乱的代码中我们也学会了很多东西,例如调错能力,正是在混乱中锻炼了我们~

   接下来,工作流的走起~ 在混乱中锻炼思维,在混乱中成长~


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:164308次
    • 积分:9917
    • 等级:
    • 排名:第1810名
    • 原创:150篇
    • 转载:4篇
    • 译文:29篇
    • 评论:3852条
    博客专栏
    友情链接