最近换了新工作,公司要求导入Excel要分批次导入,并且是多线程的情况下执行导入,查了很多资料,没看到比较复合的,就打算自己写一个吧,可能有不足,希望指出。

上面说到多线程,这边就不贴出代码了,具体思路就是一个导入开辟一个线程,下面主要写一下我的分批次的代码思路:

分批次导入-方法一

先介绍我一开始的写法:

通过一个(最大行数/设置读取的行数)的 余数向上取整 来控制循环次数。

  1. package oldboy;
  2.  
  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.  
  8. import java.io.File;
  9. import java.io.FileInputStream;
  10.  
  11. /**
  12. * Created by peng on 18/9/12.
  13. */
  14. public class ExcelDemo {
  15.  
  16. public static int READ_INDEX = 10;//这里设置每次读取的行数
  17.  
  18. public static void main(String[] args) throws Exception {
  19. testImport();
  20. }
  21.  
  22. public static void testImport() throws Exception {
  23. boolean flag = true;
  24. //cycleNum 循环读取次数
  25. int cycleNum = read("/Users/peng/Desktop/20180912/111.xls", 0);
  26. while (flag) {
  27. if (cycleNum != 0) {
  28. cycleNum = read("/Users/peng/Desktop/20180912/111.xls", cycleNum);
  29. } else {
  30. flag = false;
  31. }
  32. }
  33. }
  34.  
  35. /**
  36. * 读取Excel
  37. *
  38. * @param localPath 文件路径
  39. * @param cycleNum 剩余的读取次数
  40. * @return
  41. * @throws Exception
  42. */
  43. public static int read(String localPath, int cycleNum) throws Exception {
  44. File file = new File(localPath);
  45. FileInputStream inputStream = new FileInputStream(file);
  46. HSSFWorkbook book = new HSSFWorkbook(inputStream);
  47. Sheet sheet = book.getSheetAt(0); //sheet 从0开始
  48. Row row = sheet.getRow(0); //获取第一行
  49. int rowEndNum = getRow(); //取得最后一行的行号
  50. //向上取整
  51. int cycleIndex = (int) (Math.ceil((double) rowEndNum / (double) READ_INDEX));
  52. int cycleStartNum, cycleEndNum;
  53. if (cycleNum == 0) {//第一次循环进来
  54. cycleNum = cycleIndex;
  55. cycleStartNum = 1;
  56. if (rowEndNum > READ_INDEX) {
  57. cycleEndNum = READ_INDEX + 1;
  58. } else {//第一次循环如果最大行数小于设定的读取行数
  59. cycleEndNum = rowEndNum;
  60. }
  61. } else {
  62. if (cycleNum == 1) {//最后一次循环的时候
  63. cycleStartNum = READ_INDEX * (cycleIndex - cycleNum) + 1;
  64. cycleEndNum = rowEndNum;
  65. } else {
  66. cycleStartNum = READ_INDEX * (cycleIndex - cycleNum) + 1;
  67. cycleEndNum = READ_INDEX + READ_INDEX * (cycleIndex - cycleNum) + 1;
  68. }
  69. }
  70. cycleNum -= 1;
  71. //每次循环的开始行数和结束行数
  72. System.out.println(cycleStartNum + "=======" + cycleEndNum);
  73. //System.out.println(rowEndNum);
  74. for (int i = cycleStartNum; i < cycleEndNum; i++) {//跳过第一行从第二行开始循环
  75. row = sheet.getRow(i);
  76. for (int j = 0; j < row.getLastCellNum(); j++) {//列循环开始,从第0列开始
  77. Cell cell = row.getCell(j);
  78. //ExcelUtils.getCellValue获取单元格内容,这里忽略
  79. String cellValue = ExcelUtils.getCellValue(cell);
  80. //System.out.print(cellValue.concat(" | "));
  81. }
  82. //System.out.println();
  83. }
  84. //返回剩余循环次数
  85. return cycleNum;
  86. }
  87.  
  88. //这里获取Excel的真实行数
  89. public static int getRow() {
  90. return 47;
  91. }
  92.  
  93. }

执行结果:

分批次导入-方法二

这个方法是我比较推荐的,最后我也是采用这种写法,一次读一行,每次读到设定的行数就保存一次,读到空行停止。

  1. package oldboy;
  2.  
  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.  
  8. import java.io.File;
  9. import java.io.FileInputStream;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12.  
  13. /**
  14. * Created by peng on 18/9/12.
  15. */
  16. public class ExcelDemo1 {
  17.  
  18. public static int READ_INDEX = 10;//这里设置每次读取的行数
  19.  
  20. public static void main(String[] args) throws Exception {
  21. testNewImport();
  22. }
  23.  
  24. public static void testNewImport() throws Exception {
  25. String localPath = "/Users/peng/Desktop/20180912/111.xls";
  26. //每次读READ_INDEX的量
  27. File file = new File(localPath);
  28. List<List<Object>> list = new ArrayList<>();
  29. int i = 0;
  30. while (true) {
  31. //如果是读到下一行为空
  32. //每一行的list
  33. List<Object> rowList = readRow(file, i++);
  34. if (rowList != null) {
  35. list.add(rowList);
  36. } else {
  37. System.out.println("===================退出导入=============");
  38. System.out.println("===================保存剩下的=============" + i);
  39. //做保存动作
  40. list.clear();
  41. break;
  42. }
  43. if (list.size() == READ_INDEX) {
  44. //做保存动作
  45. System.out.println("===================保存=============" + i);
  46. list.clear();
  47. }
  48. }
  49. }
  50.  
  51. public static List<Object> readRow(File file, int rowNum) throws Exception {
  52. FileInputStream inputStream = new FileInputStream(file);
  53. HSSFWorkbook book = new HSSFWorkbook(inputStream);
  54. Sheet sheet = book.getSheetAt(0);//sheet 从0开始
  55. List<Object> list = new ArrayList<>();
  56. Row row = sheet.getRow(rowNum);
  57. if (!isRowEmpty(row)) {
  58. for (int j = 0; j < row.getLastCellNum(); j++) {//列循环开始,从第0列开始
  59. Cell cell = row.getCell(j);
  60. if (cell == null) {
  61. continue;
  62. }
  63. String cellValue;
  64. if (ExcelUtils.isMergedRegion(sheet, cell)) {
  65. cellValue = ExcelUtils.getMergedRegionValue(sheet, cell);
  66. } else {
  67. cellValue = ExcelUtils.getCellValue(cell);
  68. }
  69. list.add(cellValue);
  70. //System.out.print(cellValue.concat(" | "));
  71. }
  72. //System.out.println();
  73. } else {
  74. return null;
  75. }
  76.  
  77. return list;
  78. }
  79.  
  80. /**
  81. * 判断是否为空行
  82. *
  83. * @param row
  84. * @return
  85. */
  86. public static boolean isRowEmpty(Row row) {
  87. if (row == null) {
  88. return true;
  89. }
  90. for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
  91. Cell cell = row.getCell(c);
  92. if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK)
  93. return false;
  94. }
  95. return true;
  96. }
  97.  
  98. }

运行结果:

至于为什么一个是47一个是48大家自己控制一下就好了,很简单,希望对大家有帮助,有不助的地方可以提出来交流一下,转载注明出处,谢谢。

java poi分批次导入Excel的更多相关文章

  1. Java将数据库数据导入EXCEL

    一般的数据库数据怎么导入excel中呢??这让人非常疑惑,今天我找到了一个方法能够实现 须要导入一个第三方包下载地址 详细内容例如以下: 里面含有指导文档,index.html里面含有怎样读取数据库文 ...

  2. poi将图片导入excel(Java代码)

    package com.fh.util;import java.awt.image.BufferedImage;  import java.io.ByteArrayOutputStream;  imp ...

  3. java的jxl技术导入Excel

    项目结构: http://www.cnblogs.com/hongten/gallery/image/112177.html 在项目中我们看到Reference Libraries中的jxl.jar包 ...

  4. 在java中实现数据导入excel表格中

    1.首先前端代码如下: 一个导出按钮:<input id="export" class="btn btn-primary" type="butt ...

  5. Java POI 3.17导出EXCEL并下载(带进度条提示)

    导出数据 共4590条 只需要 5 秒左右,性能还算可以 我们再来测试一下 50000 条的性能...

  6. java poi技术读取到数据库

    https://www.cnblogs.com/hongten/p/java_poi_excel.html java的poi技术读取Excel数据到MySQL 这篇blog是介绍java中的poi技术 ...

  7. java用XSSFWorkbook实现读写Excel

    /** * 读取Excel文件的内容 * @param inputStream excel文件,以InputStream的形式传入 * @param sheetName sheet名字 * @retu ...

  8. java的poi技术读取和导入Excel

    项目结构: http://www.cnblogs.com/hongten/gallery/image/111987.html  用到的Excel文件: http://www.cnblogs.com/h ...

  9. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

随机推荐

  1. Found multiple occurrences of org.json.JSONObject on the class path:

    Question: Found multiple occurrences of org.json.JSONObject on the class path: jar:file:/C:/Users/nm ...

  2. IOS自动化定位方式

    原文地址http://blog.csdn.net/wuyepiaoxue789/article/details/77885136 元素属性的介绍 type:元素类型,与className作用一致,如: ...

  3. XVII Open Cup named after E.V. Pankratiev Grand Prix of Moscow Workshops, Sunday, April 23, 2017 Problem K. Piecemaking

    题目:Problem K. PiecemakingInput file: standard inputOutput file: standard outputTime limit: 1 secondM ...

  4. spark[源码]-sparkContext详解[一]

    spark简述 sparkContext在Spark应用程序的执行过程中起着主导作用,它负责与程序和spark集群进行交互,包括申请集群资源.创建RDD.accumulators及广播变量等.spar ...

  5. 使用IDEA 创建Servlet 的时候,找不到javax.servlet

    使用IDEA 开发工具,创建Servlet 文件的时候,出现了下面的这种错误, 解决步骤如下: 第一步:点击 File 第二步:找到Project Structure,点击,然后按照下图顺序操作,添加 ...

  6. JS正则表达式从入门到入土(9)—— test方法以及它的那些坑

    test方法 test方法介绍 RegExp.prototype.test(str) test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串 test方法的使用 let reg = /\w ...

  7. Apache httpd服务部署

    1. yum安装 yum install httpd yum install httpd-devel yum install httpd-manual 2. 配置 vim /etc/httpd/con ...

  8. 20145328 《Java程序设计》第9周学习总结

    20145328 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 16.1JDBC 16.1.1JDBC简介 JDBC(Java DataBase Connec ...

  9. strcpy、sprintf、memcpy的区别

    char*strcpy(char *dest, const char *src); 其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作会出 ...

  10. linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解

    1.特权级         Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...