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 ...
随机推荐
- C的指针疑惑:C和指针13(高级指针话题)上
int *f(); f为一个函数,返回值类型是一个指向整形的指针. int (*f)(); 两对括号,第二对括号是函数调用操作符,但第一对括号只起到聚组的作用. f为一个函数指针,它所指向的函数返回一 ...
- k近邻 KNN
KNN是通过测量对象的不同特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20 ...
- css-1,css的三种引入方式 基本选择器
<!-- (1)CSS 层叠样式表 作用:修饰网页结构 (2)css的三种引入方式 权重: 优先级高 权重大 谁在页面谁的权重大 - 行内样式 注意:行内样式的优先级是最高的 - 内接样式 - ...
- 20. Valid Parentheses(括号匹配,用桟)
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- The 15th UESTC Programming Contest Preliminary B - B0n0 Path cdoj1559
地址:http://acm.uestc.edu.cn/#/problem/show/1559 题目: B0n0 Path Time Limit: 1500/500MS (Java/Others) ...
- Winter-1-D Max Sum 解题报告及测试数据
Time Limit:1000MS Memory Limit:32768KB Description Given a sequence a[1],a[2],a[3]......a[n], your j ...
- (转载)sql注入实战 mysql篇
出现的关键名词有: UNION SELECT load_file hex 为了方便说明我们先创建两个表:hehe和heihei,很明显它们一个拥有2列属性,一个拥有3列属性 ======== ...
- PCLK怎么获得?
1.PCLK是由MCLK进行分频而来...... 2.PCLK是个时钟,通过寄存器只能调节它的频率什么的,它是控制像素输出的一个时钟: 3.在曝光时间的算法中需要知道PCLK的值,是因为在sensor ...
- 【Head First Servlets and JSP】笔记 27: web 应用安全
典型的安全问题:假冒者.窃听者.非法升级者 认证方式: Base64 .摘要认证 .客户端证书.表单认证,重点熟悉摘要算法( HASH . MD5 等) 安全机制:授权.认证.数据完整性.机密性 80 ...
- FIRST GAME.
-Doragon Kuesuto(.c) Doragon Kuesuto 1.0 Doragon Kuesuto 1.15 Doragon Kuesuto 1.6