对于excel文件的导入导出,后台接收读取和建表封存都是固定死的,所以对于excel导入时,excel文件内容必须匹配后台相关对象,不然报错。

  excel文件导出,用<a><a/>标签即可,通过后台去完成 ,不可用ajax去写导出,ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。

文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件。

当获取前台导入这个命令后,会通过Mybatis获取mysql数据库所有相关数据,通过for循环将获取集合中一个个对象及对象属性写入表中,导出。

  对于excel文件的导入则是可以通过form表单和ajax两种方法导入,前者在controller控制器里面返回字符串,会直接显示在页面上,需要手动重新刷新页面。

后者……,虽然很想使用,但网上并没有找到有关纯ajax写入后台的案例,不过有几类别人封装好的ajax插件用于写入excel文件的,有兴趣可以去找找。

文件上传,控制台获取到文件,读取文件里面value值,封存到其对象中,通过Mybatis保存数据库中。(UPDATE good SET g_id = UUID(),mybatis添加对象时uuid为主键,只要mysql主键为String类型长度足够容纳uuid自动生成长度)

<!-- html -->
<!-- excel文件导出 -->
<p><a href="${pageContext.request.contextPath}/user/exportExcel">导出</a>
<!-- excel文件导入 -->
<form action="${pageContext.request.contextPath}/user/importExcel" method="post" enctype="multipart/form-data">
	<input type="file" name="userExcel" />
	<input type="submit" value="导入">
</form>
//控制层//导出excel文档
	@RequestMapping("/exportExcel")
	@ResponseBody
	public void exportExcel(HttpServletRequest request,HttpServletResponse response){
		try {
			//获取数据源
			List<User> userList = userService.queryUserAll();

			//导出excel
			response.setHeader("Content-Disposition","attachment;filename="+new String("用户信息.xls".getBytes(),"ISO-8859-1"));
			response.setContentType("application/x-excel;charset=UTF-8");
			OutputStream outputStream = response.getOutputStream();
			//导出
			userService.exportExcel(userList,outputStream);
			outputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
//导入
	@RequestMapping("/importExcel")
	//@ResponseBody
	public String importExcel(MultipartFile userExcel,HttpServletRequest request,HttpSession session){
		if(userExcel == null){
			session.setAttribute("excelName", "未上传文件,上传失败!");
			return "redirect:queryUserAll";
		}
		String userExcelFileName = userExcel.getOriginalFilename();
		if(!userExcelFileName.matches("^.+\\.(?i)((xls)|(xlsx))$")){
			session.setAttribute("excelName", "文件格式不正确!请使用.xls或.xlsx后缀的文档,导入失败!");
			return "redirect:queryUserAll";
		}
		//导入
		try {
			userService.importExcel(userExcel);
		} catch (IOException | InvalidFormatException e) {
			e.printStackTrace();
		}
		session.setAttribute("excelName", "导入成功!");
		return "redirect:queryUserAll";
	}
//service层//导出
@Override
	public void exportExcel(List<User> userList, OutputStream outputStream) throws IOException {
		//1.创建工作簿
		HSSFWorkbook hwb =new HSSFWorkbook();
		//1.1创建合并单元格
		//CellRangeAddress cellRangeAddress =new CellRangeAddress(0,0,0,4);
		//2.创建工作表
		HSSFSheet sheet = hwb.createSheet("用户信息表");
		//2.1添加合并单元格
		//sheet.addMergedRegion(cellRangeAddress);
		//3.1创建第一行及单元格
		HSSFRow row1 = sheet.createRow(0);
		HSSFCell cell1 = row1.createCell(0);
		cell1.setCellValue("用户信息");
		//3.2创建第二行及单元格
		HSSFRow row2 = sheet.createRow(1);
		String[] row2Cell = {"编号","姓名","性别","年龄","部门名称"};
		for (int i =0 ; i < row2Cell.length ; i++ ){
			row2.createCell(i).setCellValue(row2Cell[i]);
		}
		//3.3创建第三行及单元格
		if(userList!= null && userList.size()>0){
			for(int j=0 ; j<userList.size() ;j++){
				HSSFRow rowUser = sheet.createRow(j+2);
				rowUser.createCell(0).setCellValue(userList.get(j).getId());
				rowUser.createCell(1).setCellValue(userList.get(j).getName());
				rowUser.createCell(2).setCellValue(userList.get(j).getSex());
				rowUser.createCell(3).setCellValue(userList.get(j).getAge());
				//rowUser.createCell(4).setCellValue(userList.get(j).getId());
			}
		}
		//5.输出
		hwb.write(outputStream);
	}

  

//导入
@Override
	public void importExcel(MultipartFile userExcel) throws IOException, InvalidFormatException {
		//获取输入流
		InputStream inputStream = userExcel.getInputStream();
		//创建读取工作簿
		Workbook workbook = WorkbookFactory.create(inputStream);
		//获取工作表
		Sheet sheet = workbook.getSheetAt(0);
		//获取总行
		int rows=sheet.getPhysicalNumberOfRows();
		if(rows>2){
			//获取单元格
			for (int i = 2; i < rows; i++) {
				Row row = sheet.getRow(i);
				User user =new User();

				try {
					String id = row.getCell(0).getStringCellValue();
					user.setId(Integer.parseInt(id));
				} catch (IllegalStateException e) {
					int id=(int)row.getCell(0).getNumericCellValue();
					user.setId(id);
				}

				String name = row.getCell(1).getStringCellValue();
				user.setName(name);

				String sex = row.getCell(2).getStringCellValue();
				user.setSex(sex);

				try {
					String age = row.getCell(3).getStringCellValue();
					user.setAge(Integer.parseInt(age));
				} catch (IllegalStateException e) {
					int age=(int)row.getCell(3).getNumericCellValue();
					user.setAge(age);
				}
				//想数据库中添加新对象
				addUser(user);//方法
			}

		}

		inputStream.close();
	}

  

  

SSM excel文件的导入导出的更多相关文章

  1. NPOI对excel文件的导入导出

    现理解:将一个Excel文件(工作簿-IWorkBook)看做是一个你要操作的对象,每个工作簿包含多个工作表(ISheet)对象,每个工作表中又包含多个行对象(IRow),每行又包含多个单元格(ICe ...

  2. java项目中Excel文件的导入导出

    package poi.excel; import java.io.IOException; import java.io.InputStream; import java.io.OutputStre ...

  3. 使用PHPExcel实现Excel文件的导入和导出(模板导出)

    在之前有写过一篇文章讲述了使用PHP快速生成excel表格文件并下载,这种方式生成Excel文件,生成速度很快,但是有缺点是:1.单纯的生成Excel文件,生成的文件没有样式,单元格属性(填充色,宽度 ...

  4. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  5. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)      select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...

  6. java实现文件批量导入导出实例(兼容xls,xlsx)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

  7. SQL SERVER 和ACCESS、EXCEL的数据导入导出

    SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06]     来源:Linux公社  作者:Linux 熟 悉 ...

  8. 使用phpExcel实现Excel数据的导入导出(完全步骤)

    使用phpExcel实现Excel数据的导入导出(完全步骤)   很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人 ...

  9. 利用PHPExcel 实现excel数据的导入导出(源码实现)

    利用PHPExcel 实现excel数据的导入导出(源码实现) 在开发过程中,经常会遇到导入导出的需求,利用phpexcel类实现起来也是比较容易的,下面,我们一步一步实现 提前将phpexcel类下 ...

随机推荐

  1. Centos下编译JDK

    因为OpenJDK是开源的,这里使用openJDK进行编译联系 环境要求 Centos6.7 64位 openjdk-7u40-fcs-src-b43-26_aug_2013.zip bootstra ...

  2. 28. 字符串的全排列之第2篇[string permutation with repeating chars]

    [本文链接] http://www.cnblogs.com/hellogiser/p/string-permutation-with-repeating-chars.html [题目] 输入一个字符串 ...

  3. 从别人那淘的知识 深入剖析Java中的装箱和拆箱

    (转载的海子的博文   海子:http://www.cnblogs.com/dolphin0520/) 深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来 ...

  4. oracle根据正则表达式查找对应的字段

    语法如下: SELECT * FROM 表名WHERE regexp_like(表字段,'正则') 例如: 查找某字段小数点后有两个小数以上的信息 SELECT * FROM A TWHERE reg ...

  5. Libevent 事件循环(1)

    // 事件的dispatch int event_base_loop(struct event_base *base, int flags) {    //得到采用的事件模型 epoll/epoll/ ...

  6. 7、TypeScript数据类型

    1.变量声明 var 不要使用 建议使用: let 变量 const 常量,一旦申明不能修改 2.数据类型 2.1布尔值:boolean 2.2数字类型  :number 2.3字符串类型:strin ...

  7. [TC13761]Mutalisk

    [TC13761]Mutalisk 题目大意: 有\(n(n\le20)\)个坏人,第\(i\)个坏人的血量为\(A_i(A_i\le60)\).你可以每次攻击\(3\)个坏人,并分别造成\(9\)点 ...

  8. 跟我学SharePoint 2013视频培训课程—— 审批、拒绝列表项(13)

    课程简介 第13天,怎样在SharePoint 2013中审批.拒绝列表项. 视频 SharePoint 2013 交流群 41032413

  9. YGC和FGC发生时间

    1.YGC和FGC是什么 YGC :对新生代堆进行gc.频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收.性能耗费较小. FGC :全堆范围的gc.默认堆空间使用到达80%(可调整)的时候会 ...

  10. 2-sat(tarjan算法)hdu(1824)

    hdu1824 Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...