【Javaweb】poi实现通过上传excel表格批量导入数据到数据库
1.导入poi相关jar包
对于只操作2003及以前版本的excel,只需要导入poi-XXX.jar ,如果还需要对2007及以后版本进行操作,则需要导入
poi-ooxml-XXX.jar
poi-ooxml-schemas-XXX.jar
Maven方式
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency> <dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
2.读取excel文件
ImportExcel工具类
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ImportExcel {
// abc.xls
public static boolean isXls(String fileName){
// (?i)忽略大小写
if(fileName.matches("^.+\\.(?i)(xls)$")){
return true;
}else if(fileName.matches("^.+\\.(?i)(xlsx)$")){
return false;
}else{
throw new RuntimeException("格式不对");
}
} public static List<Map<String, Object>> readExcel(String fileName, InputStream inputStream) throws Exception{ boolean ret = isXls(fileName);
Workbook workbook = null;
// 根据后缀创建不同的对象
if(ret){
workbook = new HSSFWorkbook(inputStream);
}else{
workbook = new XSSFWorkbook(inputStream);
}
Sheet sheet = workbook.getSheetAt(0);
// 得到标题行
Row titleRow = sheet.getRow(0); int lastRowNum = sheet.getLastRowNum();
int lastCellNum = titleRow.getLastCellNum(); List<Map<String, Object>> list = new ArrayList<>(); for(int i = 1; i <= lastRowNum; i++ ){
Map<String, Object> map = new HashMap<>();
Row row = sheet.getRow(i);
for(int j = 0; j < lastCellNum; j++){
// 得到列名
String key = titleRow.getCell(j).getStringCellValue();
Cell cell = row.getCell(j);
cell.setCellType(CellType.STRING); map.put(key, cell.getStringCellValue());
}
list.add(map);
}
workbook.close();
return list; }
}
前端:给出上传链接
<div class="layui-form-item">
<label class="layui-form-label">选择文件</label>
<div class="layui-input-block">
<input type="file" name="mFile" id="no1" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<input class="layui-btn" style="margin-left: 10%" id="btn1" type="submit" value="确认导入">
</div>
后台controller层处理接收的excel文件
@RequestMapping("/staff/import.do")
@ResponseBody
public JsonBean importExcel(@RequestParam MultipartFile mFile){
try {
String fileName = mFile.getOriginalFilename();
// 获取上传文件的输入流
InputStream inputStream = mFile.getInputStream();
// 调用工具类中方法,读取excel文件中数据
List<Map<String, Object>> sourceList = ImportExcel.readExcel(fileName, inputStream);
// 将对象先转为json格式字符串,然后再转为List<SysUser> 对象
ObjectMapper objMapper = new ObjectMapper();
String infos = objMapper.writeValueAsString(sourceList);
// json字符串转对象
List<Staff> list = objMapper.readValue(infos, new TypeReference<List<Staff>>() {});
// 批量添加
staffService.addStaffBatch(list);
return JsonUtils.createJsonBean(1, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return JsonUtils.createJsonBean(0, e.getMessage());
}
}
注意:还要配置spring-bean.xml
<!-- 文件上传的解析器 id的值不能改-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件的最大大小 ,单位字节 ,比如 1024 * 1024 = 1M-->
<property name="maxUploadSize" value="1048576"></property> </bean>
【注意】excel每个列名要和数据库字段名一致!!
对于有date类型的数据,excel输入2019-12-12会变为日期格式数据,日期类型传到后台时会转成字符串,其格式会出错,就无法转换Date类型,
所以Excel表格一定要将时间相关数据用文本格式存储!!!
数据库对应实体类与时间相关属性要添加@DateTimeFormat(pattern="yyyy-MM-dd")注解
【Javaweb】poi实现通过上传excel表格批量导入数据到数据库的更多相关文章
- Django上传excel表格并将数据写入数据库
前言: 最近公司领导要统计技术部门在各个业务条线花费的工时百分比,而 jira 当前的 Tempo 插件只能统计个人工时.于是就写了个报表工具,将 jira 中导出的个人工时excel表格 导入数据库 ...
- 通过POI实现上传EXCEL的批量读取数据写入数据库
最近公司新增功能要求导入excel,并读取其中数据批量写入数据库.于是就开始了这个事情,之前的文章,记录了上传文件,本篇记录如何通过POI读取excel数据并封装为对象上传. 上代码: 1.首先这是一 ...
- 最近开发的项目,遇到用户上传excel文件并导入数据到系统这个需求,而有excel中有的单元格是日期格式,本文介绍怎么从excel中读取日期格式的数据。
可以先判断单元格的类型,有的日期是字符串存储的,有的是按日期存储的(单元格按数字解析),代码如下: Cell cell = row.getCell(); Date date = null; if (c ...
- 微信公众平台上如何上传excel表格?
微信公众平台上如何上传excel表格? 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. ...
- mvc4 强大的导出和不需要上传文件的批量导入EXCEL--SNF快速开发平台3.1
数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,但在Web上我们应该如何实现呢?本文主要介绍利用MVC4+EasyUI的特点,并结合文件上传控件,实现文 ...
- 使用ocupload和POI一键上传Excel并解析导入数据库
使用的工具如下: JQuery ocupload jquery.ocupload-1.1.2.js Apache POI poi-3.9.jar 如果是Maven项目添加依赖如下: <depe ...
- jsp上传excel文件并导入数据库
1,excel文件的上传 需要借助jar包:commons-fileupload-1.2.1.jar以及commons-io-1.3.2.jar 前端的html文件 <form id=" ...
- 【asp.net】asp.net实现上传Excel文件并读取数据
#前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:Fil ...
- 使用postman上传excel文件测试导入excel
今日思语:城市的生活很快,有时学会让自己慢下来,慢慢来 对于做一些文件上传操作时,一般我们是直接在前端页面加入类型为file的input标签,也可以使用postman来进行文件的上传测试,如下: po ...
随机推荐
- 用 Java 解密 C# 加密的数据(DES)(转)
今天遇到java解密url的问题.我们的系统要获取外部传过来的URL,URL是采用 DES 算法对消息进行加密,再用 BASE64 编码.不过对方系统是用 C# 写的. 在网上搜了几篇文章终于找到一篇 ...
- dx.jar文件问题,有没有同学知道怎么解决呀,这一步没法解决,后面就没办法跟着做了
Java Code 123456789101112 dx.jar文件问题,有没有同学知道怎么解决呀,这一步没法解决 - test] Unknown error: Unable to build: ...
- MYSQL数据库数据拆分之分库分表总结
数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数量的 ...
- MySQL数据备份方法
MySQL的备份和还原 备份:副本 RAID1,RAID10:保证硬件损坏而不会业务中止: DROP TABLE mydb.tb1; 备份类型: 热备份.温备份和冷备 ...
- [Swift]LeetCode308. 二维区域和检索 - 可变 $ Range Sum Query 2D - Mutable
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- [Swift]LeetCode629. K个逆序对数组 | K Inverse Pairs Array
Given two integers n and k, find how many different arrays consist of numbers from 1 to n such that ...
- [Swift]LeetCode971.翻转二叉树以匹配先序遍历 | Flip Binary Tree To Match Preorder Traversal
Given a binary tree with N nodes, each node has a different value from {1, ..., N}. A node in this b ...
- python之定义参数模块argparse(一)基本使用
在shell脚本中,若脚本带参数,则在脚本中使用$1.$2...等引用, 在python中,也可以定义类似的引用参数,可以为必选项也可以可选项. 基本用法如下三种: 1.必选项(位置参数) impor ...
- MySQL查询昨天的数据
SELECT * FROM `表名` WHERE TO_DAYS(`时间字段名`) = TO_DAYS(NOW()) - 1; 需要前几天的话就在后面减几天.
- NMF学习练习:做电影推荐
NMF是很久以前学的,基本快忘没了,昨天YX提出来一个关于NMF(同音同字不同义)的问题,才又想起来. 自己的学习笔记写的比较乱,好在网上资料多,摘了一篇,补充上自己笔记的内容,留此助记. NMF概念 ...