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

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

分批次导入-方法一

先介绍我一开始的写法:

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

 package oldboy;

 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 java.io.File;
import java.io.FileInputStream; /**
* Created by peng on 18/9/12.
*/
public class ExcelDemo { public static int READ_INDEX = 10;//这里设置每次读取的行数 public static void main(String[] args) throws Exception {
testImport();
} public static void testImport() throws Exception {
boolean flag = true;
//cycleNum 循环读取次数
int cycleNum = read("/Users/peng/Desktop/20180912/111.xls", 0);
while (flag) {
if (cycleNum != 0) {
cycleNum = read("/Users/peng/Desktop/20180912/111.xls", cycleNum);
} else {
flag = false;
}
}
} /**
* 读取Excel
*
* @param localPath 文件路径
* @param cycleNum 剩余的读取次数
* @return
* @throws Exception
*/
public static int read(String localPath, int cycleNum) throws Exception {
File file = new File(localPath);
FileInputStream inputStream = new FileInputStream(file);
HSSFWorkbook book = new HSSFWorkbook(inputStream);
Sheet sheet = book.getSheetAt(0); //sheet 从0开始
Row row = sheet.getRow(0); //获取第一行
int rowEndNum = getRow(); //取得最后一行的行号
//向上取整
int cycleIndex = (int) (Math.ceil((double) rowEndNum / (double) READ_INDEX));
int cycleStartNum, cycleEndNum;
if (cycleNum == 0) {//第一次循环进来
cycleNum = cycleIndex;
cycleStartNum = 1;
if (rowEndNum > READ_INDEX) {
cycleEndNum = READ_INDEX + 1;
} else {//第一次循环如果最大行数小于设定的读取行数
cycleEndNum = rowEndNum;
}
} else {
if (cycleNum == 1) {//最后一次循环的时候
cycleStartNum = READ_INDEX * (cycleIndex - cycleNum) + 1;
cycleEndNum = rowEndNum;
} else {
cycleStartNum = READ_INDEX * (cycleIndex - cycleNum) + 1;
cycleEndNum = READ_INDEX + READ_INDEX * (cycleIndex - cycleNum) + 1;
}
}
cycleNum -= 1;
//每次循环的开始行数和结束行数
System.out.println(cycleStartNum + "=======" + cycleEndNum);
//System.out.println(rowEndNum);
for (int i = cycleStartNum; i < cycleEndNum; i++) {//跳过第一行从第二行开始循环
row = sheet.getRow(i);
for (int j = 0; j < row.getLastCellNum(); j++) {//列循环开始,从第0列开始
Cell cell = row.getCell(j);
//ExcelUtils.getCellValue获取单元格内容,这里忽略
String cellValue = ExcelUtils.getCellValue(cell);
//System.out.print(cellValue.concat(" | "));
}
//System.out.println();
}
//返回剩余循环次数
return cycleNum;
} //这里获取Excel的真实行数
public static int getRow() {
return 47;
} }

执行结果:

分批次导入-方法二

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

 package oldboy;

 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 java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List; /**
* Created by peng on 18/9/12.
*/
public class ExcelDemo1 { public static int READ_INDEX = 10;//这里设置每次读取的行数 public static void main(String[] args) throws Exception {
testNewImport();
} public static void testNewImport() throws Exception {
String localPath = "/Users/peng/Desktop/20180912/111.xls";
//每次读READ_INDEX的量
File file = new File(localPath);
List<List<Object>> list = new ArrayList<>();
int i = 0;
while (true) {
//如果是读到下一行为空
//每一行的list
List<Object> rowList = readRow(file, i++);
if (rowList != null) {
list.add(rowList);
} else {
System.out.println("===================退出导入=============");
System.out.println("===================保存剩下的=============" + i);
//做保存动作
list.clear();
break;
}
if (list.size() == READ_INDEX) {
//做保存动作
System.out.println("===================保存=============" + i);
list.clear();
}
}
} public static List<Object> readRow(File file, int rowNum) throws Exception {
FileInputStream inputStream = new FileInputStream(file);
HSSFWorkbook book = new HSSFWorkbook(inputStream);
Sheet sheet = book.getSheetAt(0);//sheet 从0开始
List<Object> list = new ArrayList<>();
Row row = sheet.getRow(rowNum);
if (!isRowEmpty(row)) {
for (int j = 0; j < row.getLastCellNum(); j++) {//列循环开始,从第0列开始
Cell cell = row.getCell(j);
if (cell == null) {
continue;
}
String cellValue;
if (ExcelUtils.isMergedRegion(sheet, cell)) {
cellValue = ExcelUtils.getMergedRegionValue(sheet, cell);
} else {
cellValue = ExcelUtils.getCellValue(cell);
}
list.add(cellValue);
//System.out.print(cellValue.concat(" | "));
}
//System.out.println();
} else {
return null;
} return list;
} /**
* 判断是否为空行
*
* @param row
* @return
*/
public static boolean isRowEmpty(Row row) {
if (row == null) {
return true;
}
for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
Cell cell = row.getCell(c);
if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK)
return false;
}
return true;
} }

运行结果:

至于为什么一个是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. Yii2 教程 - yii2-redis 扩展详解

    该教程已被合并到<Yii2 权威指南中文版>中!Yiichina 教程地址为<yii2-redis 扩展详解>! 一.简介 yii2-redis 扩展为 Yii2 框架提供了 ...

  2. SpringMVC-SimpleDEMO

    本博文主要将如何配置一个简单的SpringMVC的DEMO,由上一讲的SpringMVC工作流程来看,配置一个SpringMVC的步骤是简单而清晰的. 一.引入SpringMVC所需依赖   < ...

  3. HMM、MEMM、CRF模型比较和标注偏置问题(Label Bias Problem)

    本文转自:http://www.cnblogs.com/syx-1987/p/4077325.html 路径1-1-1-1的概率:0.4*0.45*0.5=0.09 路径2-2-2-2的概率:0.01 ...

  4. DataGird 相关

    DataGird控件          DataGirdView 控件    DataGird类  他们之间是什么关系??????? DataGridView 控件是替换 DataGrid 控件的新控 ...

  5. python全栈开发从入门到放弃之socket网络编程基础

    网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...

  6. C++必知必会

    C++ Common knowledge Essential Intermediate Programming C++必知必会 [美] StephenC.Dewhurst 著  荣耀 译  人民邮电出 ...

  7. 【VS2015】未能创建 Visual C# 2015编译器

    今天在安装完成Visual Studio 2015后,在执行update 3时出错,导致再次打开VS2015时提示错误:“未能创建 Visual C# 2015编译器”和“未能正确加载CSharpPa ...

  8. 在eclipse搭建python开发环境

    在一次看别人帖子的时候发现,别人是用eclipse来写python代码的,所以好奇也想尝试一番,之前一直在用Pycharm,这个也确实是最好的开发python的IDE了,但是有时候也会有卡顿的情况,主 ...

  9. Eclipse安装zylin[转]

    本文转载自:https://blog.csdn.net/dns888222/article/details/9263485 Eclipse安装zylin 在网上搜的是安装页为http://www.zy ...

  10. [BZOJ1722]Milk Team Select 产奶比赛

    Description Farmer John's N (1 <= N <= 500) cows are trying to select the milking team for the ...