文档章节

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

z_jordon
 z_jordon
发布于 2015/04/17 14:18
字数 1307
阅读 8337
收藏 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
粉丝 36
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

day02:管道符、shell及环境变量

1、管道符:"|" 用于将前一个指令的输出作为后一个指令的输入,且管道符后面跟的是命令(针对文档的操作):cat less head tail grep cut sort wc uniq tee tr split sed awk等) [root@localho...

芬野de博客
刚刚
0
0
Kubernetes系列——Kubernetes 组件、对象(二)

一、Kubernetes 组件 介绍了Kubernetes集群所需的各种二进制组件。 Master 组件 Master组件提供集群的管理控制中心。Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一...

吴伟祥
10分钟前
0
0
Flink-数据流编程模型

1、抽象等级 Flink提供了不同级别的抽象来开发流/批处理应用程序。 1) 低层级的抽象 最低层次的抽象仅仅提供有状态流。它通过Process函数嵌入到DataStream API中。它允许用户自由地处理来自一...

liwei2000
28分钟前
1
0
Java开发Swing实战JFrame和JTabbedPane容器的用法详细解析

概述: 项目是一个桌面程序,涉及标签和按钮组件、布局管理器组件、面板组件、列表框和下拉框组件等组件,以及Swing事件处理机制。 下面先从最基础的界面开始。 /** * @author: lishuai * @...

金铭鼎IT教育
33分钟前
10
0
flask 之旅

环境 为了正确地跑起来,你的应用需要依赖许多不同的软件。 就算是再怎么否认这一点的人,也无法否认至少需要依赖Flask本身。 你的应用的运行环境,在当你想要让它跑起来时,是至关重要的。 ...

hblt-j
33分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部