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 ...
随机推荐
- Spark Streaming实战
1.Storm 和 SparkStreaming区别 Storm 纯实时的流式处理,来一条数据就立即进行处理 SparkStreaming 微批处理,每次处理 ...
- Spring第七弹—依赖注入之注解方式注入及编码解析@Resource原理
注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果. 手工装配依赖对象 手工装配依赖对象,在这种方式中又有两种编 ...
- Selenium2.0 Webdriver 随笔
Webdriver can't action the element when the element is out of view 1. Scroll to the element use Java ...
- sqlserver 2005/2008 导入超大sql文件
SQLCMD -E -dmaster -ic:\Scripts\create_db.sql 安装了Microsoft® SQL Server® 2008 R2 Native Client可用
- openocd shell脚本
openocd.sh #! /usr/bin/expectset timeout 30spawn suexpect "密码:"send "123456\r"se ...
- Problem I. Increasing or Decreasing MIPT-2016 Pre-Finals Workshop, Taiwan NTU Contest, Sunday, March 27, 2016
题面: Problem I. Increasing or DecreasingInput file: standard inputOutput file: standard outputTime li ...
- NGUI制作 《九宫格》 图片
什么是九宫格图片? 就是一张图片的上下左右四个角是固定的,无论X/Y被拉伸多大,图片都不会失真 效果图 ------> 那在NGUI里面怎么做到呢 1 首先你要把图片添加到NGUI图集里,点击E ...
- WebSocket使用SuperWebSocket结合WindowsService实现实时消息
SuperWebSocket在WebService中的应用 最开始使用是寄托在IIS中,发布之后测试时半个小时就会断开,所以改为WindowsService 1. 新建Windows服务项目[Test ...
- Python学习笔记之函数参数传递 传值还是传引用
在学完Python函数那一章节时,很自然的的就会想到Python中函数传参时传值呢?还是传引用?或者都不是? 在回答上面的问题之前我们先来看看下面的代码: 代码1: def foo(var): v ...
- Hive相关随笔
1).Hive中Select Top N的实现 Hive中使用 Order by + Limit 可以很容易地实现Select Top N. 但是在Hive中Order by只能使用1个Reduce, ...