文档章节

jeecg3.5中的导入excel文件的使用及完善

z_jordon
 z_jordon
发布于 2015/04/17 14:18
字数 1307
阅读 8082
收藏 11

jeecg中导入导出excel文件使用了jeecg团队自己开发的一个easypoi库,所以使用起来非常简单,以我项目中导入黑名单列表功能为例:

  1. 在实体中增加注解

  先增加类的注解:

@ExcelTarget("blackListEntity")
public class BlackListEntity implements java.io.Serializable {

再增加字段注解:

/**手机号码*/
	@Excel(name="手机号码")
	private Long msisdn;
	/**状态*/
	@Excel(name="状态",replace = {"启用_1","禁用_0"})
	private Integer state;

在jsp界面中使用upload标签,如下:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="/context/mytags.jsp"%>
<!DOCTYPE html>
<html>
<head>
<title>Excel导入</title>
<t:base type="jquery,easyui,tools"></t:base>
</head>
<body style="overflow-y: hidden" scroll="no">
<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
	<fieldset class="step">
	<div class="form"><t:upload name="fiels" buttonText="选择要导入的文件" uploader="blackListController.do?importExcel" extend="*.xls;*.xlsx" id="file_upload" formData="documentTitle"></t:upload></div>
	<div class="form" id="filediv" style="height: 50px"></div>
	</fieldset>
</t:formvalid>
</body>
</html>

在controller中接收上传的文件并调用easypoi的api进行文件的解析就可以了,如下:

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
		List<BlackListEntity> allRecords = new ArrayList<BlackListEntity>();
		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
			MultipartFile file = entity.getValue();// 获取上传文件对象
			ImportParams params = new ImportParams();
			params.setTitleRows(0);
			params.setHeadRows(1);
			params.setNeedSave(true);
			try {
				List<BlackListEntity> listBlackList =  ExcelImportUtil.importExcelByIs(file.getInputStream(),BlackListEntity.class,params);
				allRecords.addAll(listBlackList);
			} catch (Exception e) {
				logger.error(ExceptionUtil.getExceptionMessage(e));
			}finally{
				try {
					file.getInputStream().close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

这样一个导入excel文件的功能就做好了,easypoi会把excel文件中的数据解析成为一个List对象,接下去要怎么处理就跟具体的业务逻揖有关了。

但我们实际开发中往往会遇到这样的需求:客户希望导入失败的信息也能够查看,如这个导入黑名单功能中就要求手机号码不能重复,如果手机号码在数据库中存的话要在导入完成后让用户可以下载错误文件查看哪些号码是导重复了。

我的解决思路大概如下:

  1. 在service中保存数据时检查号码在数据库中是否已经存在,如果存在则产生一个ErrorMsg类的实例放放到List中

  2. 对这个List进行循环生成excel文件写入到磁盘中

  3. 产生一个TSAttachment的实例,也就是往jeecg的附件表中增加一条附件记录,把错误日志当作一个附件保存起来

  4. 把下载这个附件的链接返回到jsp界面

完整代码如下:

jsp

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="/context/mytags.jsp"%>
<!DOCTYPE html>
<html>
<head>
<title>Excel导入</title>
<t:base type="jquery,easyui,tools"></t:base>
</head>
<body style="overflow-y: hidden" scroll="no">
<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
	<fieldset class="step">
	<div class="form"><t:upload name="fiels" buttonText="选择要导入的文件" uploader="blackListController.do?importExcel" extend="*.xls;*.xlsx" id="file_upload" formData="documentTitle"></t:upload></div>
	<div class="form" id="filediv" style="height: 50px"></div>
	</fieldset>
</t:formvalid>
</body>
</html>

controller

@RequestMapping(params = "importExcel", method = RequestMethod.POST)
	@ResponseBody
	public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) {

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
		List<BlackListEntity> allRecords = new ArrayList<BlackListEntity>();
		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
			MultipartFile file = entity.getValue();// 获取上传文件对象
			ImportParams params = new ImportParams();
			params.setTitleRows(0);
			params.setHeadRows(1);
			params.setNeedSave(true);
			try {
				List<BlackListEntity> listBlackList =  ExcelImportUtil.importExcelByIs(file.getInputStream(),BlackListEntity.class,params);
				allRecords.addAll(listBlackList);
			} catch (Exception e) {
				logger.error(ExceptionUtil.getExceptionMessage(e));
			}finally{
				try {
					file.getInputStream().close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		AjaxJson j = this.blackListService.saveBlackLists(allRecords, request);
		return j;
	}

对应的两个service类(接口我就没贴了,只贴实现类的代码),其中用到了jeecg中的AjaxJson类用来返回json结果

BlackListServiceImpl

public AjaxJson saveBlackLists(List<BlackListEntity> listBlackList, HttpServletRequest request) {
		
		List<BlackListEntity> actualList = new ArrayList<BlackListEntity>();
		List<ErrorMsg> errorMsgList = new ArrayList<ErrorMsg>();
		long tempCount = 0;
		int idx = 0;
		for (BlackListEntity blackList : listBlackList) {
			idx++;
			//判断黑名单号码在数据库中是否存在
			tempCount = super.getCountForJdbcParam(GET_COUNT, new String[]{blackList.getMsisdn().toString()});
			if (tempCount == 0) {
				actualList.add(blackList);
			} else {
				//创建错误信息,包括行号,错误信息两个字段
				ErrorMsg errorMsg = new ErrorMsg();
				errorMsg.setNum(idx  + 1);
				errorMsg.setMsg("手机号码" + blackList.getMsisdn() + "在系统中已经存在");
				errorMsgList.add(errorMsg);
			}
		}
		if (!actualList.isEmpty()) {
			super.batchSave(actualList);
			//产生重新加载黑名单事件
			EventEntity event = new EventEntity();
			event.setEventId("ReloadBlackListEvent");
			super.save(event);
		}
		AjaxJson j = new AjaxJson();
		Map<String, Object> attributes = new HashMap<String, Object>();
		attributes.put("successNum", actualList.size());
		attributes.put("failNum", errorMsgList.size());
		if (!errorMsgList.isEmpty()) {
			String downloadHref = this.errorMsgService.saveErrorMsg(errorMsgList, request, attributes);
			StringBuilder builder = new StringBuilder("导入完成,但有一些数据导入失败,您可以");
			builder.append("<a href=\"").append(downloadHref).append("\">下载错误信息</a>进行查看");
			j.setMsg(builder.toString());
			
		} else {
			j.setMsg("导入成功");
		}
		return j;
	}

ErrorMsgServiceImpl(用来封装生成错误日志及生成附件记录并返回链接的逻揖):

/**
 * 
 */
package com.jason.ddoWeb.service.impl.common;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.poi.ss.usermodel.Workbook;
import org.jeecgframework.core.common.service.impl.CommonServiceImpl;
import org.jeecgframework.core.util.ResourceUtil;
import org.jeecgframework.poi.excel.ExcelExportUtil;
import org.jeecgframework.poi.excel.entity.TemplateExportParams;
import org.jeecgframework.web.system.pojo.base.TSAttachment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jason.ddoWeb.common.model.ErrorMsg;
import com.jason.ddoWeb.service.common.ErrorMsgServiceI;

/**
 *  生成错误信息公共service
 * @author jasonzhang
 *
 */
@Service("errorMsgService")
@Transactional
public class ErrorMsgServiceImpl extends CommonServiceImpl implements
		ErrorMsgServiceI {

	/* (non-Javadoc)
	 * @see com.jason.ddoWeb.service.common.ErrorMsgServiceI#saveErrorMsg(java.util.List, javax.servlet.http.HttpServletRequest, java.util.Map)
	 */
	@Override
	public String saveErrorMsg(List<ErrorMsg> errorMsgs,
			HttpServletRequest request, Map<String, Object> attributes) {
		//把错误信息写入文件
		TemplateExportParams params = new TemplateExportParams();
		params.setHeadingRows(1);
		params.setHeadingStartRow(0);
		params.setTemplateUrl("export/template/errormsgtemp.xls");
		Map<String,Object> map = new HashMap<String, Object>();
		Workbook book = ExcelExportUtil.exportExcel(params, ErrorMsg.class, errorMsgs, map);
		String uploadbasepath = ResourceUtil.getConfigByName("uploadpath");
		String path = uploadbasepath + "/";// 文件保存在硬盘的相对路径
		String realPath = request.getSession().getServletContext().getRealPath("/") + "/" + path;// 文件的硬盘真实路径
		File file = new File(realPath);
		if (!file.exists()) {
			file.mkdirs();// 创建根目录
		}
		String errormsgPath = realPath + "/" + ResourceUtil.getConfigByName("errormsgpath");
		file = new File(errormsgPath);
		if (!file.exists()) {
			file.mkdirs();
		}
		String fileName = System.currentTimeMillis() + ".xls";
		//String filePath = errormsgPath + "/" + fileName;
		try {
			FileOutputStream fos = new FileOutputStream(errormsgPath + "/" + fileName);
			book.write(fos);
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		TSAttachment attachment = new TSAttachment();
		attachment.setRealpath("/" + ResourceUtil.getConfigByName("uploadpath") + "/" +  ResourceUtil.getConfigByName("errormsgpath") + "/" + fileName);
		attachment.setAttachmenttitle(fileName);
		attachment.setExtend("xls");
		super.save(attachment);
		StringBuilder builder = new StringBuilder();
		builder.append("commonController.do?viewFile&fileid=").append(attachment.getId());
		return builder.toString();
	}

}


© 著作权归作者所有

共有 人打赏支持
z_jordon
粉丝 35
博文 251
码字总数 78212
作品 0
厦门
技术主管
[转]Excel导入到MySQL

参考网页+ http://www.cnblogs.com/latifrons/archive/2012/09/07/2675141.html+ http://my.oschina.net/xsh1208/blog/470245 引言 为了从 MSSQL (MS SQL server 2008r2) 转移数据库到 MySQ......

不避风云
2016/05/21
65
0
循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

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

walb呀
2017/12/04
0
0
Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)

通用excel与对象相互转换的工具类 前言:最近开发需要一个Excel批量导入或者导出的功能,之前用过poi-ooxml开发过一个导入的工具类,正好蹭着这次机会,把工具类的功能进行完善。 使用说明:...

宇的季节
02/24
0
0
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解

1、简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的、富有表现力的代码实现Excel/CSV文件的导入和 导出 。 该项目的GitHub地址是: https://gi...

杭州白小白
07/30
0
0
JeeSite|Excel导入导出

在各种管理系统中,数据的导入导出是经常用到的功能,通常导入导出以Excel、CSV格式居多。JeeSite提供了很好的Excel的导入导出功能,隐藏了底层的很多实现,通过简单的套路式步骤即可完成数据...

秋风似刀
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
14分钟前
1
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
22分钟前
0
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
32分钟前
15
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
58分钟前
1
0
区块链技术中的那些能商用的企业级应用

WEPOWER是一家立陶宛初创企业,旨在改变可再生电力项目的付费方式。WePower公司创始人Nick Martyniuk表示,政府统一收购价的存在推动了全球风能与太阳能市场的发展。因此,他的公司希望帮助那...

问题终结者
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部