maven依赖

  1. <!--excel相关依赖-->
  2. <dependency>
  3. <groupId>org.apache.poi</groupId>
  4. <artifactId>poi</artifactId>
  5. <version>3.8</version>
  6. </dependency>
  7.  
  8. <dependency>
  9. <groupId>org.apache.poi</groupId>
  10. <artifactId>poi-scratchpad</artifactId>
  11. <version>3.8-beta4</version>
  12. </dependency>
  13.  
  14. <dependency>
  15. <groupId>org.apache.poi</groupId>
  16. <artifactId>poi-ooxml</artifactId>
  17. <version>3.8</version>
  18. </dependency>

工具类

  1. package com.yangche.utils;
  2. import org.apache.poi.hssf.usermodel.HSSFDateUtil;
  3. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  4. import org.apache.poi.ss.usermodel.Cell;
  5. import org.apache.poi.ss.usermodel.Row;
  6. import org.apache.poi.ss.usermodel.Sheet;
  7. import org.apache.poi.ss.usermodel.Workbook;
  8. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  9. import java.io.IOException;
  10. import java.io.InputStream;
  11. import java.math.BigDecimal;
  12. import java.text.SimpleDateFormat;
  13. import java.util.ArrayList;
  14. import java.util.Date;
  15. import java.util.List;
  16.  
  17. public class ExcelUtil {
  18. private final static String excel2003L =".xls"; //2003- 版本的excel
  19. private final static String excel2007U =".xlsx"; //2007+ 版本的excel
  20. /**
  21. * 描述:获取IO流中的数据,组装成List<List<Object>>对象
  22. * @param in,fileName
  23. * @return
  24. * @throws IOException
  25. */
  26. public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
  27. List<List<Object>> list = null;
  28. //创建Excel工作薄
  29. Workbook work = this.getWorkbook(in,fileName);
  30. if(null == work){
  31. throw new Exception("创建Excel工作薄为空!");
  32. }
  33. Sheet sheet = null; //页数
  34. Row row = null; //行数
  35. Cell cell = null; //列数
  36. list = new ArrayList<List<Object>>();
  37. //遍历Excel中所有的sheet
  38. // 将最大的列数记录下来
  39. int lastCellNum = 0;
  40. for (int i = 0; i < work.getNumberOfSheets(); i++) {
  41. sheet = work.getSheetAt(i);
  42. if(sheet==null){continue;}
  43. //遍历当前sheet中的所有行
  44. for (int j = sheet.getFirstRowNum()+1; j <= sheet.getLastRowNum(); j++) {//+1是为了忽略第一行的值(表头信息的东西,就不要了)根据需要来,如果你要这个表头信息就别加1
  45. row = sheet.getRow(j);
  46. if(row==null||row.getFirstCellNum()==j){continue;}
  47. //遍历所有的列
  48. List<Object> li = new ArrayList<Object>();
  49. // 比较当前行的列数跟表的最大的列数
  50. if (j == sheet.getFirstRowNum()) {
  51. // 将第一行的列数设为最大
  52. lastCellNum = row.getLastCellNum();
  53. }else {
  54. lastCellNum = lastCellNum > row.getLastCellNum() ? lastCellNum : row.getLastCellNum();
  55. }
  56. for (int y = row.getFirstCellNum(); y < lastCellNum; y++) {
  57. cell = row.getCell(y);
  58. li.add(this.getValue(cell));
  59. }
  60. list.add(li);
  61. }
  62. }
  63. return list;
  64. }
  65.  
  66. /**
  67. * 描述:根据文件后缀,自适应上传文件的版本
  68. * @param inStr,fileName
  69. * @return
  70. * @throws Exception
  71. */
  72. public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
  73. Workbook wb = null;
  74. String fileType = fileName.substring(fileName.lastIndexOf("."));
  75. if(excel2003L.equals(fileType)){
  76. wb = new HSSFWorkbook(inStr); //2003-
  77. }else if(excel2007U.equals(fileType)){
  78. wb = new XSSFWorkbook(inStr); //2007+
  79. }else{
  80. throw new Exception("解析的文件格式有误!");
  81. }
  82. return wb;
  83. }
  84. /**
  85. * 描述:对表格中数值进行格式化
  86. * @param cell
  87. * @return
  88. */
  89. //解决excel类型问题,获得数值
  90. public String getValue(Cell cell) {
  91. String value = "";
  92. if(null==cell){
  93. return value;
  94. }
  95. switch (cell.getCellType()) {
  96. //数值型
  97. case Cell.CELL_TYPE_NUMERIC:
  98. if (HSSFDateUtil.isCellDateFormatted(cell)) {
  99. //如果是date类型则 ,获取该cell的date值
  100. Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
  101. // 根据自己的实际情况,excel表中的时间格式是yyyy-MM-dd HH:mm:ss还是yyyy-MM-dd,或者其他类型
  102. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  103. // 由于方法的返回值类型为String,这里将Date类型转为String,便于统一返回数据
  104. value = format.format(date);;
  105. }else {// 纯数字
  106. BigDecimal big=new BigDecimal(cell.getNumericCellValue());
  107. value = big.toString();
  108. //解决1234.0 去掉后面的.0
  109. if(null!=value&&!"".equals(value.trim())){
  110. String[] item = value.split("[.]");
  111. if(1<item.length&&"0".equals(item[1])){
  112. value=item[0];
  113. }
  114. }
  115. }
  116. break;
  117. //字符串类型
  118. case Cell.CELL_TYPE_STRING:
  119. value = cell.getStringCellValue().toString();
  120. break;
  121. // 公式类型
  122. case Cell.CELL_TYPE_FORMULA:
  123. //读公式计算值
  124. value = String.valueOf(cell.getNumericCellValue());
  125. if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
  126. value = cell.getStringCellValue().toString();
  127. }
  128. break;
  129. // 布尔类型
  130. case Cell.CELL_TYPE_BOOLEAN:
  131. value = " "+ cell.getBooleanCellValue();
  132. break;
  133. default:
  134. value = cell.getStringCellValue().toString();
  135. }
  136. if("null".endsWith(value.trim())){
  137. value="";
  138. }
  139. return value;
  140. }
  141. }

以下是用法:

在测试类中进行测试

  1. @Test
  2. public void excelReadTwo()throws Exception {
  3. String filepath = "C:\\Users\\Administrator\\Desktop\\haha.xlsx";
  4. FileInputStream inputStream = new FileInputStream(new File(filepath));
  5. ExcelUtil excelUtil = new ExcelUtil();
  6. List<List<Object>> bankListByExcel = excelUtil.getBankListByExcel(inputStream, "haha.xlsx");
  7. System.out.println(bankListByExcel);
  8. }

输出的信息为:

[[杨彻, 10, 男], [吴竞, , 女], [张三, 11, 女], [李四, 89, 女, ], [王五, , 女, ], [赵六, 44, 女, ]] 因为有多个sheet,所有sheet中的值都会遍历,可以灵活改变,自己改工具类中的sheet代码。

如果有空值,两个逗号中间是空的,表头的字段没有是因为忽略了sheet有值的第一行。一般会配置一个表,存和excel文件对应的字段,排序,还有和domain对应的字段,利用反射机制(通过拿到domain的变量名,获取其get或set方法并把excel中的值放进去)表的每一行都对应一个domain的实体。然后再存到数据库中。我的博客中会贴出反射机制的用法。

如果是前端页面的话,可以直接拿到io流,不需要存临时文件,直接把excel数据存到数据库(如果这个上传的文件不需要的话)

  1. public void paasCmdbHostExcelFileUpload(CommonsMultipartFile excelFile){
  2. if(excelFile==null){
  3. System.out.println("未选择任何文件");
  4. }
  5. String fileName=excelFile.getOriginalFilename();
  6. InputStream inputStream=null;
  7. try {
  8. inputStream=excelFile.getInputStream();
  9. } catch (IOException e) {
  10. System.out.println("获取文件流失败");
  11. e.printStackTrace();
  12. }
  13. //到此已经获得了需要的输入流和文件名,可以直接传到excel工具类使用,导入数据库的代码应该是非常简单的。
  14. }

Excel数据导入数据库的更多相关文章

  1. 使用python将excel数据导入数据库

    使用python将excel数据导入数据库 因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接 ...

  2. [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  3. 如何把excel数据导入数据库

    这里介绍2种把excel数据导入oracle数据库的方法. 1. 在excel中生成sql语句. 1)在数据列的右侧,第一行的任何位置输入="insert into table(xx,yyy ...

  4. C#将Excel数据导入数据库(MySQL或Sql Server)

    最近一直很忙,很久没写博客了.今天给大家讲解一下如何用C#将Excel数据导入Excel,同时在文章最后附上如何用sqlserver和mysql工具导入数据. 导入过程大致分为两步: 1.将excel ...

  5. 转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

  6. PHPExcel将Excel数据导入数据库

    <?php //PHPExcel读取导入Excel数据到数据库(2003,2007通用)使用方法: //先用excel2array()方法将excel表中的数据存储到数组,在从遍历二维数组将数据 ...

  7. 将Excel数据导入数据库

    Excel如下,这页工作表名叫“线路” 数据库表如下 using System; using System.Collections.Generic; using System.Linq; using ...

  8. ASP.NET Excel数据导入数据库

    <identity impersonate="true"/> 是指模拟IIS身份验证 導入錯誤時可刪除 protected void btnImport_Click(o ...

  9. 利用poi,jxl将Excel数据导入数据库

    需求:‘需要将本地的Excel中的数据经过验证之后导入数据库,在导入数据库之前在页面上展示出来 思路:将Excel导入存到session里面 去判断有没有不合法数据  如果有阻止提交 工具类: imp ...

随机推荐

  1. 洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)

    题目大意: 给定一个DAG,求起点到终点的路径长度期望 根据题意可以知道每一条边都有一定概率被走到 那么\(\displaystyle\begin{aligned} Ans = \sum_{e \in ...

  2. jdk 1.6.0_39 下载

    Java SE Development Kit 6u39 Product / File Description File Size Download password Linux x86 65.42 ...

  3. ExtJS 4.2.1学习笔记(二)——主题theme

    1                 UI组件基础 学习ExtJs就是学习组件的使用.ExtJs4对框架进行了重构,其中最重要的就是形成了一个结构及层次分明的组件体系,由这些组件形成了Ext的控件. E ...

  4. [POI2009]KAM-Pebbles BZOJ1115 [ 待填坑 ] 博弈

    有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. 感谢 ...

  5. Python:raw_input 和 input用法

    转自:http://blog.csdn.net/kjing/article/details/7450146 Python input和raw_input的区别 使用input和raw_input都可以 ...

  6. hdu6229 Wandering Robots 2017沈阳区域赛M题 思维加map

    题目传送门 题目大意: 给出一张n*n的图,机器人在一秒钟内任一格子上都可以有五种操作,上下左右或者停顿,(不能出边界,不能碰到障碍物).题目给出k个障碍物,但保证没有障碍物的地方是强联通的,问经过无 ...

  7. 启用NFS方案(读写分离)

  8. Ubuntu14.10:Install Apache,PHP,Mysql以及扩展库

    step 1: Apache sudo apt-get install apache2 After have apache2 installed, go to localhost by browser ...

  9. python进制转换或数据格式转换

    以下是部分进制转换的,都是python内置函数 int(x [,base ])         将x转换为一个整数    long(x [,base ])        将x转换为一个长整数    f ...

  10. Web开发中FormData对象的使用

    参考: FormData 对象的使用 - Web API 接口 | MDN