在springmvc项目中使用poi导入导出excel

首先要导入spring相关包,poi,和fileupload包,我是使用maven构建的。

一.导入excel

(1)使用spring上传文件

a.前台页面提交

 <form name="excelImportForm" action="${pageContext.request.contextPath}/brand/importBrandSort" method="post" onsubmit="return checkImportPath();" enctype="multipart/form-data" id="excelImportForm">
                <input  type="hidden" name="ids" id="ids">
                <div class="modal-body">
                    <div class="row gap">
                        <label class="col-sm-7 control-label"><input class="btn btn-default" id="excel_file" type="file" name="filename"  accept="xls"/></label>
                        <div class="col-sm-3">

                        	<input class="btn btn-primary" id="excel_button" type="submit" value="导入Excel"/>
                        </div>
                    </div>

                </div>

                <div class="modal-footer">
						<button type="button" class="btn btn-default" data-dismiss="modal" onClick="uncheckBoxes();">取消</button>
				</div>

在提交前可进行一些判断,可查看:

http://blog.csdn.net/kingson_wu/article/details/38928827

b.后台spring的controller进行相关操作,这里主要讲的是使用spring上传文件,和读取文件信息,可以参考这两篇文章:

http://endual.iteye.com/blog/1810170

http://dakulaliu.iteye.com/blog/236235

使用spring上传文件之前,需要配置bean

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
@RequestMapping(value = "/importBrandSort", method = RequestMethod.POST)
	public ModelAndView importBrandSort(@RequestParam("filename") MultipartFile file,
			HttpServletRequest request,HttpServletResponse response) throws Exception {
		String temp = request.getSession().getServletContext()
				.getRealPath(File.separator)
				+ "temp"; // 临时目录
		File tempFile = new File(temp);
		if (!tempFile.exists()) {
			tempFile.mkdirs();
		}
		DiskFileUpload fu = new DiskFileUpload();
		fu.setSizeMax(10 * 1024 * 1024); // 设置允许用户上传文件大小,单位:位
		fu.setSizeThreshold(4096); // 设置最多只允许在内存中存储的数据,单位:位
		fu.setRepositoryPath(temp); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
		// 开始读取上传信息
		// int index = 0;
	/*	List fileItems = null;
		try {
			fileItems = fu.parseRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Iterator iter = fileItems.iterator(); // 依次处理每个上传的文件
		FileItem fileItem = null;
		while (iter.hasNext()) {
			FileItem item = (FileItem) iter.next();// 忽略其他不是文件域的所有表单信息
			if (!item.isFormField()) {
				fileItem = item;
				// index++;
			}
		}

		if (fileItem == null)
			return null;
			*/
		if (file == null)
			return null;
		logger.info(file.getOriginalFilename());

		String name = file.getOriginalFilename();// 获取上传文件名,包括路径
		//name = name.substring(name.lastIndexOf("\\") + 1);// 从全路径中提取文件名
		long size = file.getSize();
		if ((name == null || name.equals("")) && size == 0)
			return null;
		InputStream in = file.getInputStream();
		List<BrandMobileInfoEntity> BrandMobileInfos = brandService
				.importBrandPeriodSort(in);

		// 改为人工刷新缓存KeyContextManager.clearPeriodCacheData(new
		// PeriodDimensions());// 清理所有缓存
		int count = BrandMobileInfos.size();
		String strAlertMsg ="";
		if(count!=0){
			strAlertMsg= "成功导入" + count + "条!";
		}else {
			strAlertMsg = "导入失败!";
		}
		logger.info(strAlertMsg);
		//request.setAttribute("brandPeriodSortList", BrandMobileInfos);
		//request.setAttribute("strAlertMsg", strAlertMsg);

		request.getSession().setAttribute("msg",strAlertMsg);
		return get(request, response);
		//return null;
	}

代码中的注释部分是如果不使用spring的方式,如何拿到提交过来的文件名(需要是要apache的一些工具包),其实使用spring的也是一样,只是已经做好了封装,方便我们写代码。

代码中的后半部分是读取完上传文文件的信息和对数据库进行更新之后,输出到前台页面的信息。

这里给页面设置session信息,前台检测session提示是否导入成功。具体可参考:

http://blog.csdn.net/kingson_wu/article/details/38926771

上述代码中:

InputStream in = file.getInputStream();
		List<BrandMobileInfoEntity> BrandMobileInfos = brandService
				.importBrandPeriodSort(in);

读取excel的信息。

(2)使用poi读取excel

a.更新数据库

@Override
	public List<BrandMobileInfoEntity> importBrandPeriodSort(InputStream in) throws Exception  {

		List<BrandMobileInfoEntity> brandMobileInfos = readBrandPeriodSorXls(in);
		for (BrandMobileInfoEntity brandMobileInfo : brandMobileInfos) {
			mapper.updateByConditions(brandMobileInfo);
		}
		return brandMobileInfos;
	}

这部分是sevice层的代码,用于读取excel信息之后更新数据库数据,我这里是使用mybatis。定义一个类BrandMobileInfoEntity,用与保存excel表每一行的信息,而List<BrandMobileInfoEntity>则保存了全部信息,利用这些信息对数据库进行更新。

b.读取excel信息

private List<BrandMobileInfoEntity> readBrandPeriodSorXls(InputStream is)
			throws IOException, ParseException {
		HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
		List<BrandMobileInfoEntity> brandMobileInfos = new ArrayList<BrandMobileInfoEntity>();
		BrandMobileInfoEntity brandMobileInfo;
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
			HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			if (hssfSheet == null) {
				continue;
			}
			// 循环行Row
			for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				brandMobileInfo = new BrandMobileInfoEntity();
				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
				for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
					HSSFCell brandIdHSSFCell = hssfRow.getCell(i);
					if (i == 0) {
						brandMobileInfo.setBrandId(Integer
								.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 1) {
						continue;
					} else if (i == 2) {
						brandMobileInfo.setMobileShowFrom(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 3) {
						brandMobileInfo.setMobileShowTo(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 4) {
						brandMobileInfo.setSellMarkValue(getCellValue(brandIdHSSFCell));
					} else if (i == 5) {
						brandMobileInfo.setWarehouse(getCellValue(brandIdHSSFCell));
					} else if (i == 6) {
						brandMobileInfo.setSortA1(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 7) {
						brandMobileInfo.setSortA2(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 8) {
						brandMobileInfo.setSortB(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 9) {
						brandMobileInfo.setSortC10(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 10) {
						brandMobileInfo.setSortC(Integer.parseInt(getCellValue(brandIdHSSFCell)));
					} else if (i == 11) {
						brandMobileInfo.setHitA(getCellValue(brandIdHSSFCell));
					} else if (i == 12) {
						brandMobileInfo.setHitB(getCellValue(brandIdHSSFCell));
					} else if (i == 13) {
						brandMobileInfo.setHitC(getCellValue(brandIdHSSFCell));
					} else if (i == 14) {
						brandMobileInfo.setCustomSellType(getCellValue(brandIdHSSFCell));
					}else if (i == 15) {
                      continue;
                    }else if (i == 16) {
                    	brandMobileInfo.setChannelId(Integer.parseInt(getCellValue(brandIdHSSFCell)));
                    }
				}
				brandMobileInfos.add(brandMobileInfo);

			}
		}
		return brandMobileInfos;
	}

这种代码有点搓,还没有优化,可以大概看到是怎么读取信息的。

(3)使用mybatis更新数据

二.导出excel

(1)

前台页面使用一个按钮,定义js事件:

$(".exportBrandSort").on('click', function() {

    	 var url = contextPath+"/brand/exportBrandSort";
    	 $('#searchform').attr('action', url);
    	 $('#searchform').submit();
    	 //还原action值
    	 url = contextPath+"/brand/getBrand";
    	 $('#searchform').attr('action', url);<span style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; font-size: 14px;">}</span>

这里使用查询功能的form的表单,则导出的就是查询之后的信息的excel表格。

可参考:

http://blog.csdn.net/kingson_wu/article/details/38927915

(2)后台controller处理

a.后端controller处理并输出到前台

@RequestMapping(value = "/exportBrandSort", method = RequestMethod.GET)
	public void exportBrandSort(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		try {
			Map<String, Object> params = new HashMap<>();
			// start time of selling
			String startTimeStr = RequestUtil.getStringParameter(request,
					"startTimeStr", null);
			if (StringUtils.isNotBlank(startTimeStr)) {
				params.put("startTimeStr", startTimeStr);
				params.put("startTime", df.parse(startTimeStr).getTime() / 1000);
			}

			// end time of selling
			String endTimeStr = RequestUtil.getStringParameter(request,
					"endTimeStr", null);
			if (StringUtils.isNotBlank(endTimeStr)) {
				params.put("endTimeStr", endTimeStr);
				params.put("endTime", df.parse(endTimeStr).getTime() / 1000);
			}

			// warehouse
			String warehouse = RequestUtil.getStringParameter(request,
					"warehouse");
			if (StringUtils.isNotBlank(warehouse)) {
				params.put("warehouse", warehouse);
			}

			// channel
			String channel4ui = BrandConstants.CHANNEL_ID_SEARCH_DEFAULT;

			String[] channel = request.getParameterValues("channel");
			if (channel != null && channel.length > 0) {
				channel4ui = stringArrayToString(channel);
			}
			params.put("channel", channel4ui);

			String orderType = request.getParameter("orderType");
			if (orderType == null || "".equals(orderType)) {
				orderType = "C";
			}
			params.put("orderType", orderType);

			// brand id
			if (RequestUtil.getIntParameter(request, "brandId") > 0)
				params.put("brandId",
						(RequestUtil.getIntParameter(request, "brandId")));
			// brand name
			if (RequestUtil.getStringParameter(request, "brandName") != null
					&& !"".equals(RequestUtil.getStringParameter(request,
							"brandName").trim()))
				// params.put("brandName", new
				// String(RequestUtil.getStringParameter(request,
				// "brandName").getBytes("ISO-8859-1"),"UTF-8"));
				params.put("brandName",
						RequestUtil.getStringParameter(request, "brandName"));

			int count = brandService.countByConditions(params);

			List<BrandCompleteInfoEntity> list = brandService
					.queryBrands(params);

			// --------

			byte[] fileNameByte = ("kxw.xls").getBytes("GBK");
			String filename = new String(fileNameByte, "ISO8859-1");

			byte[] bytes = brandService.exportBrandPeriodSort(list);
		//	logger.info("------------------------"+bytes.length);
			response.setContentType("application/x-msdownload");
			//response.setContentType("application/x-excel");
			response.setContentLength(bytes.length);
			response.setHeader("Content-Disposition", "attachment;filename="
					+ filename);
			response.getOutputStream().write(bytes);
			//response.getOutputStream().flush();

		} catch (Exception ex) {
			logger.debug(ex.getMessage());
		}
	}

代码中前半部分只是根据表单信息去后台那数据并保存在List<BrandCompleteInfoEntity>中,可忽略细节。

关键是把List<BrandCompleteInfoEntity>拼接成excel并输出到网页中。

这里注意该方法的返回值是void,否则如果是ModelAndView或者String等类型,提交之后会发生跳转,返回null则是跳转到空白页面。

代码中:

byte[] fileNameByte = ("档期列表.xls").getBytes("GBK");
			String filename = new String(fileNameByte, "ISO8859-1");

			byte[] bytes = brandService.exportBrandPeriodSort(list);

是拼接excel。

b.拼接excel(service层)

@Override
	public byte[] exportBrandPeriodSort(List<BrandCompleteInfoEntity>  list) throws Exception {

		ByteArrayOutputStream out = new ByteArrayOutputStream();
		// 第一步,创建一个webbook,对应一个Excel文件
		HSSFWorkbook wb = new HSSFWorkbook();
		// 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
		HSSFSheet sheet = wb.createSheet("档期排序表");
		// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
		HSSFRow row = sheet.createRow((int) 0);
		// 第四步,创建单元格,并设置值表头 设置表头居中
		HSSFCellStyle style = wb.createCellStyle();
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

		//设置表头
		List<String> excelHead = getExcelHead();

		HSSFCell cell = null;
		// excel头
		for (int i = 0; i < excelHead.size(); i++) {
			cell = row.createCell(i);
			cell.setCellValue(excelHead.get(i));
			cell.setCellStyle(style);
		}

		// 第五步,写入实体数据 实际应用中这些数据从数据库得到
		//List<BrandPeriodSortEntity> list = getBrandPeriodSortDynamicOrder(entity, orderType);

		BrandCompleteInfoEntity brandCompleteInfo = null; // 拼装excel内容
		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow((int) i + 1);
			brandCompleteInfo = list.get(i);
			// 创建单元格,并设置值

			int j=0;
			insertCell(row, j++, brandCompleteInfo.getBrandId());
			insertCell(row, j++, brandCompleteInfo.getBrandName());
			insertCell(row, j++, brandCompleteInfo.getMobileShowFrom());
			insertCell(row, j++, brandCompleteInfo.getMobileShowTo());
			insertCell(row, j++, brandCompleteInfo.getSellMarkValue());
			insertCell(row, j++, brandCompleteInfo.getWarehouse());
			insertCell(row, j++, brandCompleteInfo.getSortA1());
			insertCell(row, j++, brandCompleteInfo.getSortA2());
			insertCell(row, j++, brandCompleteInfo.getSortB());
			insertCell(row, j++, brandCompleteInfo.getSortC10());
			insertCell(row, j++, brandCompleteInfo.getSortC());
			insertCell(row, j++, brandCompleteInfo.getHitA());
			insertCell(row, j++, brandCompleteInfo.getHitB());
			insertCell(row, j++, brandCompleteInfo.getHitC());
			insertCell(row, j++, brandCompleteInfo.getCustomSellType());
			insertCell(row, j++, channelInfoMapper.loadChannelNameById(brandCompleteInfo.getChannelId()));
			insertCell(row, j++, brandCompleteInfo.getChannelId());

		}
		wb.write(out);
		return out.toByteArray();
	}

	/**
	 * 获取excel表头
	 *
	 * @return
	 */
	private List<String> getExcelHead() {
		List<String> result = new ArrayList<String>(17);
		result.add("XXXXX");
<pre name="code" class="java" style="font-size: 14.44444465637207px; line-height: 21px;"><span style="white-space:pre">		</span>result.add("XXXXX");
<pre name="code" class="java" style="font-size: 14.44444465637207px; line-height: 21px;"><span style="white-space:pre">		</span>result.add("XXXXX");
<pre name="code" class="java"><span>		</span>result.add("XXXXX");
<pre name="code" class="java" style="font-size: 14.44444465637207px; line-height: 21px;"><span style="white-space:pre">		</span>result.add("XXXXX");
<pre name="code" class="java"><span>		</span>result.add("XXXXX");
<span>		</span>result.add("XXXXX");
<pre name="code" class="java"><span>		</span>result.add("XXXXX");





//。。。。return result;}private void insertCell(HSSFRow row,int i,Object object){if(object==null){row.createCell(i).setCellValue("");}else{row.createCell(i).setCellValue(object.toString());}}


http://endual.iteye.com/blog/1810170

http://dakulaliu.iteye.com/blog/236235

时间: 2024-12-15 01:34:43

在springmvc项目中使用poi导入导出excel的相关文章

java中使用poi导入导出excel文件_并自定义日期格式

Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使用java.此外,您可以读取和写入MS Word和PowerPoint文件使用java.Apache POI是java Excel解决方案(Excel 97-2008). 需要jar: poi-3.9-20121203.jar 导出 public static void main(String[]

poi导入导出excel后记

续上一篇:在springmvc项目中使用poi导入导出excel http://blog.csdn.net/kingson_wu/article/details/38942967 一. 导入时,发现了不少问题,如果是导出excel之后,在里面不删除行,只是简单的修改一些数据的话,则不会出问题,但如果是删除了一些行,或者excel表不是导出的,而是另外的excel文件,里面有很多数据ctrl+a,ctrl+v生成的,那么导入的时候就会出问题,因为里面虽然看起来的数据就那么多,但是有一些数据痕迹.很

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

基于SSM的POI导入导出Excel实战第一篇-SSM框架的整合

业务背景:在JavaWeb应用开发中,经常需要将应用系统中某些业务数据导出到Excel中,又或者需要将这些业务数据先收集到Excel然后一键导入到系统 业务需求:如何用Java实现导入导出Excel 需求分析:目前流行的Java导入导出Excel的框架有POI跟JXL,这两者的优缺点在这里我就不作比较了,感兴趣的童鞋可以自行搜索了解一下; 技术选型:从本文开始,我将分享一下如何基于SSM框架+POI实现Java应用导入导出Excel,数据库采用mysql5.6,应用服务器采用tomcat7 工具

基于SSM的POI导入导出Excel实战第二篇-导出EXCEL

业务需求:这里我以产品信息为例,用于POI导入导出Excel实战的操作对象 需求分析:我们要导出的数据格式比较简单,其实就是待导出的表(视图)的数据,如下图所示: 实现思路:A.会发现待导出的数据列表是一个矩阵式的格式,即二维的形式 B.其中的头部id name unit price stock 等字段field是固定不变的,将会充当excel的头部 C.以数据行的角度观察数据列表,会发现每一行每一列的值都是B所指的那些字段一一对应的取值value D.由此可以得出这些数据组织是由每一行数据组成

基于SSM的POI导入导出Excel实战尾篇-其余功能实战(mvc三层开发模式体验)

业务需求:前几篇基本已经介绍完毕项目的核心功能,即POI导入导出Excel,为了整个项目的完整性,并让诸位童鞋体验体验企业级javaweb应用mvc三层模式的开发流程,本文将介绍一下项目的其余功能,包括搜索,新增,修改,删除 需求分析:作为程序员,在项目中经常接触的就是CRUD了,本篇博文将整合jquery-easyui框架(版本采用1.5.5.4)异步实现上述几个功能,给项目画上一个完整的句号!当然啦,在刚开始开发时,对于自己开发好的后端接口完全可以用Postman进行模拟(我就是这样做的),

springMVC中使用POI方式导出excel至客户端、服务器实例

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导出至客户端浏览器供用户下载,下面我把两个实例都放出来. 1.下载所需POI的jar包,并导入项目. 2.添加一个User类,用于存放用户实体,类中内容如下: 1 package com.mvc.po; 2 3 public class User { 4 private int id; 5 priva

SpringMvc 使用poi导入导出Excel

controller <pre name="code" class="java"> @ResponseBody @RequestMapping(value = "/chxm/exportAndUpdate") public void exportAndUpdate(@RequestParam(value = "projectId") String projectId, @RequestParam(value = &

基于SSM的POI导入导出Excel实战第二篇-导入EXCEL

业务需求:上文已经实现了产品信息Excel的导出,接下来将用POI实现Excel导入 需求分析:导入其实是导出的逆过程,数据格式是一样的,均为矩阵式(二维)的数据格式,下面将以导出的模板作为Excel导入时数据填充的文件! 下面就直接进入正文,在阅读正文源码期间如果有相关问题可以加我QQ:1974544863 咨询我 或者加群:583522159 进行技术讨论.下面是我的个人公众号,感兴趣的童鞋可以关注(有干货以及项目实战分享哦) 好了,让我们进入代码实战吧! 在实战之前,介绍一下项目使用的"状