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 ...
随机推荐
- 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 ...
- IOS自动化定位方式
原文地址http://blog.csdn.net/wuyepiaoxue789/article/details/77885136 元素属性的介绍 type:元素类型,与className作用一致,如: ...
- 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 ...
- spark[源码]-sparkContext详解[一]
spark简述 sparkContext在Spark应用程序的执行过程中起着主导作用,它负责与程序和spark集群进行交互,包括申请集群资源.创建RDD.accumulators及广播变量等.spar ...
- 使用IDEA 创建Servlet 的时候,找不到javax.servlet
使用IDEA 开发工具,创建Servlet 文件的时候,出现了下面的这种错误, 解决步骤如下: 第一步:点击 File 第二步:找到Project Structure,点击,然后按照下图顺序操作,添加 ...
- JS正则表达式从入门到入土(9)—— test方法以及它的那些坑
test方法 test方法介绍 RegExp.prototype.test(str) test方法用于测试字符串参数中是否存在匹配正则表达式模式的字符串 test方法的使用 let reg = /\w ...
- Apache httpd服务部署
1. yum安装 yum install httpd yum install httpd-devel yum install httpd-manual 2. 配置 vim /etc/httpd/con ...
- 20145328 《Java程序设计》第9周学习总结
20145328 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 16.1JDBC 16.1.1JDBC简介 JDBC(Java DataBase Connec ...
- strcpy、sprintf、memcpy的区别
char*strcpy(char *dest, const char *src); 其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作会出 ...
- linux 用户态和内核态以及进程上下文、中断上下文 内核空间用户空间理解
1.特权级 Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,ARM架构也有不同的特权级,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提 ...