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

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();
	}

}
时间: 2024-10-12 09:23:09

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

如何在数据库中导入excel文件内的数据

如何在数据库中轻松导入excel格式的文件 1)打开sql server,找到要导入数据的数据库,右键>>任务>>导入数据 2)按照图示选择要导入的excel 3)选择导入到哪个数据库 4)导入excel选择第一项即可,选择第二项是表与表直接内容的筛选复制 5)选择源表和源视图,可预览表中数据 6)编辑映射页面(如上一步图) 7)继续下一步,点击完成,看到传输数据完成页面 8)进入数据库刷新,查看刚刚导入的表,完成!

YII使用PHPExcel导入Excel文件的方法

1.下载phpexcel,将压缩包中的classes复制到protected/extensions下并修改为PHPExcel. 2.修改YII配置文件config/main.php [php] view plaincopy 'import'=>array( 'application.extensions.PHPExcel.PHPExcel', ), (以下处理PHPExcel autoload和YII autoload相冲突的方法任选其一,推荐第4种,最符合YII标准) 3.1.修改PHPExc

Java POI导入Excel文件

今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar poi-excelant-3.8-20120326.jar poi-ooxml-3.8-20120326.jar poi-ooxml-schemas-3.8-20120326.jar poi-scratchpad-3.8-20120326.jar xmlbeans-2.3.0.jar 附上百度云盘

django 导入Excel文件 ORM 批量操作

导入excel文件后批量插入"bulk_create"方法 1.先定义数据模型 from django.db import models from django.utils.translation import ugettext_lazy as _ ACTIVE_TYPE = ( (1, _(u"已激活")), (0, _(u"未激活")), ) class Unit(models.Model): """ 社会单位

Java导入Excel文件

package com.cme.core; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Ar

excel数据 入库mysql 和 mysql数据 导入excel文件

1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应execl文件,即可导入. 栏位名行  对应excel文件中,字段名所在的行. 第一个数据行  对应excel文件中,第一行数据所在的行. ----------------------------------------------------------------------------------

Java 导入Excel文件到数据库

原文:http://www.jb51.net/article/44021.htm 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. (注:HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx Workbook wb = null; //当excel是200

Yii 2 &mdash;&mdash; 导入Excel文件

导入Excel文件需要两个扩展:PHPOffice/PHPExcel和moonlandsoft/yii2-phpexcel,这两个扩展中,PHPOffice/PHPExcel是基础的Excel文件接口,moonlandsoft/yii2-phpexcel提供了导入和导出的功能. 引入PHPOffice/PHPExcel 官网地址: https://github.com/PHPOffice/PHPExcel 下载后解压,拷贝到vendor/PHPExcel目录下,整体目录结构如下: PHPExce

基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能

思路: 1.首先,页面前端,上传附件,提交给后台,并带一个随机性的参数(可以用时间戳): 2.后端接收附件,做一系列的逻辑处理,无误后,将对应的文件存储在上传的目录下: 3.然后前端,上传附件成功后,进行请求后端,读取数据,后端接口对应将附件数据读取出来,前端进行显示(ajax请求): 4.前端展示数据,用户对数据检测无误,点击保存(ajax请求后端保存代码的接口),当然也可以有选择性的选择某些数据记录进行保存,楼主这里做的是全部保存(后端处理接口,自动过滤重复数据): 5.拿到对应的所需有用数