Excel数据导入数据库
maven依赖
- <!--excel相关依赖-->
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi</artifactId>
- <version>3.8</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-scratchpad</artifactId>
- <version>3.8-beta4</version>
- </dependency>
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-ooxml</artifactId>
- <version>3.8</version>
- </dependency>
工具类
- package com.yangche.utils;
- import org.apache.poi.hssf.usermodel.HSSFDateUtil;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
- import org.apache.poi.ss.usermodel.Cell;
- import org.apache.poi.ss.usermodel.Row;
- import org.apache.poi.ss.usermodel.Sheet;
- import org.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- import java.io.IOException;
- import java.io.InputStream;
- import java.math.BigDecimal;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- public class ExcelUtil {
- private final static String excel2003L =".xls"; //2003- 版本的excel
- private final static String excel2007U =".xlsx"; //2007+ 版本的excel
- /**
- * 描述:获取IO流中的数据,组装成List<List<Object>>对象
- * @param in,fileName
- * @return
- * @throws IOException
- */
- public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
- List<List<Object>> list = null;
- //创建Excel工作薄
- Workbook work = this.getWorkbook(in,fileName);
- if(null == work){
- throw new Exception("创建Excel工作薄为空!");
- }
- Sheet sheet = null; //页数
- Row row = null; //行数
- Cell cell = null; //列数
- list = new ArrayList<List<Object>>();
- //遍历Excel中所有的sheet
- // 将最大的列数记录下来
- int lastCellNum = 0;
- for (int i = 0; i < work.getNumberOfSheets(); i++) {
- sheet = work.getSheetAt(i);
- if(sheet==null){continue;}
- //遍历当前sheet中的所有行
- for (int j = sheet.getFirstRowNum()+1; j <= sheet.getLastRowNum(); j++) {//+1是为了忽略第一行的值(表头信息的东西,就不要了)根据需要来,如果你要这个表头信息就别加1
- row = sheet.getRow(j);
- if(row==null||row.getFirstCellNum()==j){continue;}
- //遍历所有的列
- List<Object> li = new ArrayList<Object>();
- // 比较当前行的列数跟表的最大的列数
- if (j == sheet.getFirstRowNum()) {
- // 将第一行的列数设为最大
- lastCellNum = row.getLastCellNum();
- }else {
- lastCellNum = lastCellNum > row.getLastCellNum() ? lastCellNum : row.getLastCellNum();
- }
- for (int y = row.getFirstCellNum(); y < lastCellNum; y++) {
- cell = row.getCell(y);
- li.add(this.getValue(cell));
- }
- list.add(li);
- }
- }
- return list;
- }
- /**
- * 描述:根据文件后缀,自适应上传文件的版本
- * @param inStr,fileName
- * @return
- * @throws Exception
- */
- public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
- Workbook wb = null;
- String fileType = fileName.substring(fileName.lastIndexOf("."));
- if(excel2003L.equals(fileType)){
- wb = new HSSFWorkbook(inStr); //2003-
- }else if(excel2007U.equals(fileType)){
- wb = new XSSFWorkbook(inStr); //2007+
- }else{
- throw new Exception("解析的文件格式有误!");
- }
- return wb;
- }
- /**
- * 描述:对表格中数值进行格式化
- * @param cell
- * @return
- */
- //解决excel类型问题,获得数值
- public String getValue(Cell cell) {
- String value = "";
- if(null==cell){
- return value;
- }
- switch (cell.getCellType()) {
- //数值型
- case Cell.CELL_TYPE_NUMERIC:
- if (HSSFDateUtil.isCellDateFormatted(cell)) {
- //如果是date类型则 ,获取该cell的date值
- Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
- // 根据自己的实际情况,excel表中的时间格式是yyyy-MM-dd HH:mm:ss还是yyyy-MM-dd,或者其他类型
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- // 由于方法的返回值类型为String,这里将Date类型转为String,便于统一返回数据
- value = format.format(date);;
- }else {// 纯数字
- BigDecimal big=new BigDecimal(cell.getNumericCellValue());
- value = big.toString();
- //解决1234.0 去掉后面的.0
- if(null!=value&&!"".equals(value.trim())){
- String[] item = value.split("[.]");
- if(1<item.length&&"0".equals(item[1])){
- value=item[0];
- }
- }
- }
- break;
- //字符串类型
- case Cell.CELL_TYPE_STRING:
- value = cell.getStringCellValue().toString();
- break;
- // 公式类型
- case Cell.CELL_TYPE_FORMULA:
- //读公式计算值
- value = String.valueOf(cell.getNumericCellValue());
- if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
- value = cell.getStringCellValue().toString();
- }
- break;
- // 布尔类型
- case Cell.CELL_TYPE_BOOLEAN:
- value = " "+ cell.getBooleanCellValue();
- break;
- default:
- value = cell.getStringCellValue().toString();
- }
- if("null".endsWith(value.trim())){
- value="";
- }
- return value;
- }
- }
以下是用法:
在测试类中进行测试
- @Test
- public void excelReadTwo()throws Exception {
- String filepath = "C:\\Users\\Administrator\\Desktop\\haha.xlsx";
- FileInputStream inputStream = new FileInputStream(new File(filepath));
- ExcelUtil excelUtil = new ExcelUtil();
- List<List<Object>> bankListByExcel = excelUtil.getBankListByExcel(inputStream, "haha.xlsx");
- System.out.println(bankListByExcel);
- }
输出的信息为:
[[杨彻, 10, 男], [吴竞, , 女], [张三, 11, 女], [李四, 89, 女, ], [王五, , 女, ], [赵六, 44, 女, ]] 因为有多个sheet,所有sheet中的值都会遍历,可以灵活改变,自己改工具类中的sheet代码。
如果有空值,两个逗号中间是空的,表头的字段没有是因为忽略了sheet有值的第一行。一般会配置一个表,存和excel文件对应的字段,排序,还有和domain对应的字段,利用反射机制(通过拿到domain的变量名,获取其get或set方法并把excel中的值放进去)表的每一行都对应一个domain的实体。然后再存到数据库中。我的博客中会贴出反射机制的用法。
如果是前端页面的话,可以直接拿到io流,不需要存临时文件,直接把excel数据存到数据库(如果这个上传的文件不需要的话)
- public void paasCmdbHostExcelFileUpload(CommonsMultipartFile excelFile){
- if(excelFile==null){
- System.out.println("未选择任何文件");
- }
- String fileName=excelFile.getOriginalFilename();
- InputStream inputStream=null;
- try {
- inputStream=excelFile.getInputStream();
- } catch (IOException e) {
- System.out.println("获取文件流失败");
- e.printStackTrace();
- }
- //到此已经获得了需要的输入流和文件名,可以直接传到excel工具类使用,导入数据库的代码应该是非常简单的。
- }
Excel数据导入数据库的更多相关文章
- 使用python将excel数据导入数据库
使用python将excel数据导入数据库 因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接 ...
- [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- 如何把excel数据导入数据库
这里介绍2种把excel数据导入oracle数据库的方法. 1. 在excel中生成sql语句. 1)在数据列的右侧,第一行的任何位置输入="insert into table(xx,yyy ...
- C#将Excel数据导入数据库(MySQL或Sql Server)
最近一直很忙,很久没写博客了.今天给大家讲解一下如何用C#将Excel数据导入Excel,同时在文章最后附上如何用sqlserver和mysql工具导入数据. 导入过程大致分为两步: 1.将excel ...
- 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- PHPExcel将Excel数据导入数据库
<?php //PHPExcel读取导入Excel数据到数据库(2003,2007通用)使用方法: //先用excel2array()方法将excel表中的数据存储到数组,在从遍历二维数组将数据 ...
- 将Excel数据导入数据库
Excel如下,这页工作表名叫“线路” 数据库表如下 using System; using System.Collections.Generic; using System.Linq; using ...
- ASP.NET Excel数据导入数据库
<identity impersonate="true"/> 是指模拟IIS身份验证 導入錯誤時可刪除 protected void btnImport_Click(o ...
- 利用poi,jxl将Excel数据导入数据库
需求:‘需要将本地的Excel中的数据经过验证之后导入数据库,在导入数据库之前在页面上展示出来 思路:将Excel导入存到session里面 去判断有没有不合法数据 如果有阻止提交 工具类: imp ...
随机推荐
- Wet Shark and Bishops(思维)
Today, Wet Shark is given n bishops on a 1000 by 1000 grid. Both rows and columns of the grid are nu ...
- 【图灵学院10】高并发之java线程池源码分析
1. 提纲 1)线程池的模块结构 2)示例&原理解析 2. 问题 1)线程池包含哪些东西 2)线程池的运作原理 3)调度线程池的运作原理 4)线程池怎么实现FixRate,FixDelay,他 ...
- 洛谷P3648 [APIO2014]序列分割(斜率优化)
传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...
- P2900 [USACO08MAR]土地征用Land Acquisition
\(\color{#0066ff}{ 题目描述 }\) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些 ...
- javascript小菜单—demo
<!DOCTYPE html><html><head> <title></title></head><body>&l ...
- jeesite 框架的简单应用
个人觉得比较完善的一个讲解jeesite的网站 https://www.w3cschool.cn/jeesite/ jeesite官网 http://jeesite.com/ 公司项目都是基于jees ...
- 网络流EdmondsKarp算法模板理解
先推荐一个讲网络流的博客,我的网络流知识均吸收于此 传送门 EdmondsKarp算法基本思想:从起点到终点进行bfs,只要存在路,说明存在增广路径,则取这部分路 权值最小的一部分,即为增广路径( ...
- 江西财经大学第一届程序设计竞赛 G
链接:https://www.nowcoder.com/acm/contest/115/G来源:牛客网 题目描述 周末,小Q喜欢在PU口袋校园上参加各种活动刷绩点,体验丰富多彩的大学生活. 但是每个活 ...
- 删除重复数据,保留一条ID最小的
SELECT * from TBCITY_Temp where code in ( select code from TBCITY_Temp group by code hav ...
- TXT文件导入到ORACLE数据库中
--创建表 (sqlplus执行) drop table cjw; ),phone ),city ),born ),adressJob ),mail )); ### txt导入到oracle cat ...