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

   上篇博客,我们介绍了,导入导出的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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
dnSpy中文版是一款net程序反编译工具,可以对net程序进行反编译,还有替代库文档的功能,如果遇到了代码丢失或者损坏的情况,可以直接恢复,有需要的赶快下载吧! 1、无需设置 由于它是一个便携式工具,它不需要您将其安装在目标计算机上,因为只需拆包其存档并启动可执行文件即可完全访问其功能。 您还可以从可移动存储介质(如USB闪存驱动器或外部HDD)运行它。此外,它不会修改系统中的注册表项,也不会在您的PC上生成其他文件或文件夹,但未经您的明确许可。 2、综合界面 dnSpy配备了一个时尚,全面的用户界面,包含广泛的有用功能,它们整齐地组织在主窗口的标准菜单中。 更重要的是,它具有标准配置窗口,您可以在其中调整各种组件的设置,如其反编译器,调试器或十六进制编辑器,但也可以修改显示或其他参数。 3、.NET反汇编程序 如果您需要一个高效的工具,可以通过为您提供各种有用的工具来帮助您反编译.NET程序集,您可以转到dnSpy。它配有一个反编译器,一个调试器,一个十六进制编辑器和一个程序集编辑器,让你以有效的方式处理程序集。 主窗口附带了一个Assembly Explorer窗格,您可以在其中访问所需程序集的树视图。您可以通过从计算机指定适当的文件或使用“从GAC打开”选项打开程序集,该选项为您提供全局程序集缓存中可用的条目列表。 4、.NET程序集的可靠反向工程工具 所有考虑的事情,dnSpy是一个方便的应用程序,使您能够以有效的方式逆向工程.NET程序集,为您提供广泛的有用工具,包括反编译器,程序集编辑器和调试器。它不需要安装,具有全面,平滑的用户界面,并为您提供了一个标准配置窗口,您可以在其中调整各种组件的设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸运的梦之星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值