java poi分批次导入Excel
最近换了新工作,公司要求导入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的更多相关文章
- Java将数据库数据导入EXCEL
一般的数据库数据怎么导入excel中呢??这让人非常疑惑,今天我找到了一个方法能够实现 须要导入一个第三方包下载地址 详细内容例如以下: 里面含有指导文档,index.html里面含有怎样读取数据库文 ...
- poi将图片导入excel(Java代码)
package com.fh.util;import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; imp ...
- java的jxl技术导入Excel
项目结构: http://www.cnblogs.com/hongten/gallery/image/112177.html 在项目中我们看到Reference Libraries中的jxl.jar包 ...
- 在java中实现数据导入excel表格中
1.首先前端代码如下: 一个导出按钮:<input id="export" class="btn btn-primary" type="butt ...
- Java POI 3.17导出EXCEL并下载(带进度条提示)
导出数据 共4590条 只需要 5 秒左右,性能还算可以 我们再来测试一下 50000 条的性能...
- java poi技术读取到数据库
https://www.cnblogs.com/hongten/p/java_poi_excel.html java的poi技术读取Excel数据到MySQL 这篇blog是介绍java中的poi技术 ...
- java用XSSFWorkbook实现读写Excel
/** * 读取Excel文件的内容 * @param inputStream excel文件,以InputStream的形式传入 * @param sheetName sheet名字 * @retu ...
- java的poi技术读取和导入Excel
项目结构: http://www.cnblogs.com/hongten/gallery/image/111987.html 用到的Excel文件: http://www.cnblogs.com/h ...
- Java POI导入导出Excel
1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...
随机推荐
- 模块讲解----os
os:跟操作系统相关的信息 os模块的增删改查 一.cd进入: windowd: os.chdir("D:/软件/pychar/data/s13") print('获取当前位置:' ...
- windows安装redis, php5.5
全套安装包地址 http://download.csdn.net/detail/whellote/9572797 解压 redis-2.2.5-win32-win64, 将里面的内容拷贝到j:/r ...
- 下载.iso类型的软件如何安装
法一:这种类型的文件为镜像文件,一般默认在虚拟光驱上运行.通常的做法为: 安装Daemon Tools 虚拟光驱,可以打开CUE.ISO.CCD等这些虚拟光驱的镜像文件,并且将文件虚拟到光盘上使用.运 ...
- BZOJ 5427: 最长上升子序列
$f[i] 表示长度为i的最长上升子序列的最后一位的最小值是多少$ 对于普通的$LIS我们可以二分确定位置去更新$ 再来考虑对于这个,如果有某一位没有确定的话 那么这一位是可以随便取的,也就是说,所有 ...
- XVII Open Cup named after E.V. Pankratiev Grand Prix of Moscow Workshops, Sunday, April 23, 2017 Problem D. Great Again
题目: Problem D. Great AgainInput file: standard inputOutput file: standard outputTime limit: 2 second ...
- POJ - 3308 Paratroopers (最小点权覆盖)
题意:N*M个格点,K个位置会有敌人.每行每列都有一门炮,能打掉这一行(列)上所有的敌人.每门炮都有其使用价值.总花费是所有使用炮的权值的乘积.求最小的总花费. 若每门炮的权值都是1,就是求最小点覆盖 ...
- IDEA 程序直接运行分析
今天用IDEA运行SpringBoot程序,启动时始终报错说读取不到datasource的url配置. 分析代码的resources目录,是有配置文件的,配置也是正常的.如下图: 后来经人指点,是因为 ...
- 无密码ssh操作步骤备忘
需求:A机器无密码登陆到B机器 1.A机器执行 ssh-keygen -t rsa ,在~/.ssh/下生成id_rsa 和 id_rsa.pub两个文件,其中id_rsa.pub是公匙 2. ...
- C++ vector 用法
转自http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html#undefined 在c++中,vector是一个十分有用的容器,下面对这 ...
- win 7 64 安装 tensorflow
1:安装 python 3.5 2. 安装 pip 3: 安装 tensorflow 4,demo