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

原创 2016年08月28日 21:59:29

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

【总结】

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

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

java之poi操作excel-批量导入导出

介绍采用poi批量导入导出excel数据
  • u013871100
  • u013871100
  • 2016年10月23日 16:52
  • 24552

导入导出功能实现代码

  • 2012年06月27日 16:44
  • 136KB
  • 下载

【NSBD】——系统导入导出

在最近做的项目中,要实现一个导入导出的功能,很高兴,组长将这个任务交给了我,下面我就来介绍一下,我们这个系统的导入导出的功能实现。 本系统的导入导出功能实现分为两个步骤:Excel配置,具体...
  • u013035538
  • u013035538
  • 2016年08月21日 10:29
  • 323

数据导出到Excel(或Word)源代码大全

数据导出到Excel(或Word)源代码大全 标签: exceldatasetnulloffice数据库generation 2008-11-16 15:24 13988人阅读 评论(15) ...
  • kasama1953
  • kasama1953
  • 2016年06月16日 23:23
  • 3545

【NSBD】——Combotree 加载数据

【项目需求】 以前只做过下拉框加载数据字典,数据字典里面的项都是在同一级下。但是这次物资分类的数据字典是有分类的,像树一样,也就是说我要将整个树结构加载到我的combotree组合框里面。 ...
  • u013035538
  • u013035538
  • 2016年06月19日 22:10
  • 2222

【NSBD】——二维码的生成与打印

二维码的生成
  • u013035538
  • u013035538
  • 2016年08月14日 22:04
  • 373

java代码实现导出CSV格式

参考代码 /** * 导出CSV格式的 * @return */ @POST @Path("/subjectExportCSV") @Produces("*/*") publi...
  • b671900
  • b671900
  • 2014年09月26日 15:51
  • 1181

java导出excel功能模块代码

1.BaseController /** * Copyright © 2015-2020 HXQC All rights reserved. */ package com.jeeplus...
  • weinichendian
  • weinichendian
  • 2017年04月27日 14:16
  • 643

超实用git技巧之提交前后代码导出

随着git的普及,很多公司基本上都在使用git进行代码管理。有些情况,比如需要对某个特性做归档;或者需要找出某个提交点前后的代码对比详情,这个时候我们就需要将前后的代码连同文件夹一起导出备份,同时提供...
  • wu__di
  • wu__di
  • 2017年07月16日 14:43
  • 468

最近在写导出excel表格的代码,发现网上大部分代码都是导出简单格式的excel,所以自己顺便就写了一个导出复杂表格的工具类,有些代码是借鉴网友的,同时也谢谢分享代码的朋友们.

最近在写导出excel表格的代码,发现网上大部分代码都是导出简单格式的excel,所以自己顺便就写了一个导出复杂表格的工具类,有些代码是借鉴网友的,同时也谢谢分享代码的朋友们....
  • qq_14861089
  • qq_14861089
  • 2016年11月18日 16:15
  • 1414
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【NSBD】——导入导出代码实现
举报原因:
原因补充:

(最多只允许输入30个字)