前言

在做后台管理的时候经常会用到excel导入的问题,就是将excel中的内容批量导入到数据库中,正好在新项目中我也做了excel导入的功能,来分享给大家,也给自己做个记录。

核心思想

excel导入的核心思想很简单,就是读取单元格里的内容然后塞到JavaBean中,把每一个JavaBean再添加到list中再循环insert就可以了。

具体实现

前台怎么上传文件我就不在这里赘述了,我只讲后台的实现。这里我们使用poi来进行导入操作

文件导入

导入判断

上传到后台肯定得需要一系列的判断,例如文件或者其内容是否为空,上传文件格式是否正确等等

	/**
* 导入判断
*
* @param mfile
* @return map
*/
public Map<String, Object> lockExcelImport(MultipartFile mfile) {
Map<String, Object> result = new HashMap<String, Object>();
//判断文件是否为空
if (mfile == null) {
result.put("result", "error");
result.put("msg", "文件不能为空!");
return result;
} //获取文件名
String fileName = mfile.getOriginalFilename(); //验证文件名是否合格
if (!ExcelImportUtils.validateExcel(fileName)) {
result.put("result", "error");
result.put("msg", "文件必须是excel格式!");
return result;
} //进一步判断文件内容是否为空(即判断其大小是否为0或其名称是否为null)
long size = mfile.getSize();
if (StringUtils.isEmpty(fileName) || size == 0) {
result.put("result", "error");
result.put("msg", "文件不能为空!");
return result;
} try {
File uploadDir = new File("E:\\fileupload");
//创建一个目录 (它的路径名由当前 File 对象指定,包括任一必须的父路径。)
if (!uploadDir.exists()) uploadDir.mkdirs();
//新建一个文件
File tempFile = new File("E:\\fileupload\\" + new Date().getTime() + ".xlsx");
//初始化输入流
InputStream is = null; //将上传的文件写入新建的文件中 mfile.transferTo(tempFile); //根据新建的文件实例化输入流
is = new FileInputStream(tempFile); //根据版本选择创建Workbook的方式
Workbook wb = null;
//根据文件名判断文件是2003版本还是2007版本
if (ExcelImportUtils.isExcel2007(fileName)) {
wb = new XSSFWorkbook(is);
} else {
wb = new HSSFWorkbook(is);
}
//根据excel里面的内容读取知识库信息
result.put("result", "success");
result.put("msg", readExcelValue(wb, tempFile));
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

读取excel内容

进行完文件判断之后我们来进行读取excel中的内容,并将数据塞到JavaBean中,里面的每行代码我都注释的很详细,大概就是先获取到当前sheet页,之后获取行数来循环行,因为一般第一行是标题所以我们从第二行开始循环,之后获取每行的单元格,因为这里每个单元格内容都是特定的,所以我们直接获取指定单元格的值塞到对象中,再将每一个对象添加到list中去,这就是我们用来导入的数据。这里我返回的是封装好的map集合,大家直接返回map就可以

/**
* 解析Excel里面的数据
*
* @param wb
* @param tempFile
* @param userId
* @return
*/
private Map<String, Object> readExcelValue(Workbook wb, File tempFile, Integer userId) {
//返回结果
int reslutNum = 0;
//对象
List<LockHistoryEntity> lockImportList = new ArrayList<>();
//获取sheet页数
int pages = wb.getNumberOfSheets();
// 循环Excel的sheet页数,获取每个sheet表
for (int i = 0; i < pages; i++) {
// 取得工作表
Sheet sheet = wb.getSheetAt(i);
// 获取行数
int rows = sheet.getPhysicalNumberOfRows();
//循环Excel的行数,从第二行开始
for (int r = 1; r < rows; r++) {
LockHistoryEntity lockImport = new LockHistoryEntity();
//获得每一行
Row row = sheet.getRow(r);
//判断每个单元格是否为空
if (row.getCell(0) != null || row.getCell(1) != null || row.getCell(2) != null || row.getCell(3) != null) {
// 客户卡号
lockImport.setCustCode(row.getCell(0).getStringCellValue().trim());
// 客户姓名
lockImport.setCustName(row.getCell(1).getStringCellValue().trim());
}
//进行一下判断,防止将空对象添加到了list中,当然每个业务的判断条件肯定不同,因情景而仪
if (!StringUtils.isEmpty(lockImport.getCustCode())) {
// 加入数据队列
lockImportList.add(lockImport);
}
// 没有明细数据时,直接结束程序
if (lockImportList.size() == 0) {
return ServiceUtil.generateResponseMap(null, Constants.STATE_FAILED);
}
}
reslutNum = impLockHistory(lockImportList);
}
//删除上传的临时文件
if (tempFile.exists()) {
tempFile.delete();
}
return ServiceUtil.generateResponseMap(null, reslutNum > 0 ? Constants.STATE_SUCCESS : Constants.STATE_FAILED);
}

数据DB插入更新

已经到了最后一步数据插入,这里我用的是mybatis的foreach插入,直接将数据集合传过去就

POI导入excel的更多相关文章

  1. poi导入Excel,数字科学记数法转换

    在这里分享一下使用poi 导入Excel时 把数字转换为科学记数法的解决方法: 就是使用DecimalFormat对 i 进行了格式化 结果为:

  2. Java 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包)

    ava 使用poi导入excel,结合xml文件进行数据验证的例子(增加了jar包) 假设现在要做一个通用的导入方法: 要求: 1.xml的只定义数据库表中的column字段,字段类型,是否非空等条件 ...

  3. 在java poi导入Excel通用工具类示例详解

    转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36   作者:daochuwenziyao   我要评论   这篇文章主要给大家介绍了关于在j ...

  4. 友好解决POI导入Excel文件行是不是为空

    继 解决POI读取Excel如何判断行是不是为空 后发现了一个问题.这个是一个银行的需求,有20万个客户的资料要导入系统,但有的资料是有问题的(不能正常导入),但也有能正常导入的.现在的问题是怎么知道 ...

  5. java poi 导入excel

    最近项目需要导入excel,网上有很多例子,自己整合记录下,兼容2003和2007,暂时没有添加图片处理功能. 所需jar包  http://pan.baidu.com/s/1sjPuWDR pack ...

  6. 使用POI 导入excel

    引言:最近一直在接触excel的问题,网页也有很多关于POI解析excel的资料,我也简单的整理了下,有不对地方的还望及时指正,渴望与大家交流并学习. public int importExcel(F ...

  7. 纳税服务系统【用户模块之使用POI导入excel、导出excel】

    前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...

  8. 使用POI导入EXCEL报java.lang.IncompatibleClassChangeError

    使用POI导入xls格式的excel报java.lang.IncompatibleClassChangeError异常,而导入xlsx正常. oracle.apps.fnd.framework.OAE ...

  9. POI导入excel文件2

    POI上传到服务器读取excel文件1中已经介绍了上传文件和导入excel所有的内容http://www.cnblogs.com/fxwl/p/5896893.html , 本文中只是单单读取本地文件 ...

  10. 使用POI导入Excel异常Cannot get a text value from a numeric cell 解决

    POI操作Excel时因为Excel数据Cell有不同的类型,会出现Cannot get a text value from a numeric cell的异常错误. 异常原因:Excel数据Cell ...

随机推荐

  1. 最方便分布式爬虫管理框架--Gerapy

    Gerapy 是一款国人开发的爬虫管理软件(有中文界面) 是一个管理爬虫项目的可视化工具,把项目部署到管理的操作全部变为交互式,实现批量部署,更方便控制.管理.实时查看结果. gerapy和scrap ...

  2. 👮 Golang Gin/Ace/Iris/Echo RBAC 鉴权库

    GRBAC 项目地址: https://github.com/storyicon/grbac Grbac是一个快速,优雅和简洁的RBAC框架.它支持增强的通配符并使用Radix树匹配HTTP请求.令人 ...

  3. CSS中浮动的使用

    CSS有两个性质 第一个是 :继承性 第二个是:层叠性: 选择器的一种选择能力,谁的权重大就选谁 { 里面分两种情况: 分别是 选中和没选中. 1.选不中的情况下,走继承性,(font,color,t ...

  4. Docker入门简介(一)

    Docker 介绍 Docker是Docker.lnc公司开源的一个基于LXC技术智商构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源. Do ...

  5. Hive入门(四)查询优化

    1 本地模式 0.7版本后Hive开始支持任务执行选择本地模式(local mode). 大多数的Hadoop job是需要hadoop提供的完整的可扩展性来处理大数据的.不过,有时hive的输入数据 ...

  6. js查询checkbox已选择的值

    $("input[id^=ck]").each(function(index,e){ if($(e).is(":checked")) { userArray.p ...

  7. web前端css(一)

    一  css的引入方式: 1)    行内样式:     <p style=”color: green”>我是一个段落</p> 2)    内接样式: <style ty ...

  8. 【POJ - 1979 】Red and Black(dfs+染色)

    -->Red and Black Descriptions: 有个铺满方形瓷砖的矩形房间,每块瓷砖的颜色非红即黑.某人在一块砖上,他可以移动到相邻的四块砖上.但他只能走黑砖,不能走红砖. 敲个程 ...

  9. 数据结构-循环队列(Python实现)

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  10. [剑指offer] 1. 二维数组中的的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...