写道
最近做一个小程序中间要求读取execel数据,数据量在w级以上,然而原来使用poi读取,1w左右poi还可以但是1200以上就挂了,原因是内存不足,所以换了jxl,及fastexcel就速度而言fastexcel较快,但fastexcel功能不过强大,相比之下
poi较好,但最终选择了jxl性能也不错的,但是数据量也是只读到了2.3w而已,再往上就又挂了,如果数据量再大就要求客户分割excel来插入数据了,自己感觉不爽,客户估计也快哭了,但不知道有没更好的办法,来解决大数据量问题!
下面简单的贴一些代码!希望大家指导
jxl代码
package com.reader;
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
public class Jxltest {
public static void main(String[] args) throws Exception {
String strPath="F:/12.xls";
int rowNum = 0;
String cellValue = "";
File file=new File(strPath);
Workbook wb = null;
//构造Workbook(工作薄)对象
wb = Workbook.getWorkbook(file);
if(wb!=null)
{
Sheet[] sheet = wb.getSheets();
if(sheet!=null){
//对每个工作表进行循环
for(int i=0;i<sheet.length;i++)
{
//得到当前工作表的行数
rowNum = sheet[i].getRows();
for(int j=0;j<rowNum;j++){
Cell[] cells = sheet[i].getRow(j);
if(cells != null && cells.length>0){
//获取单元格
for(int k=0;k<cells.length;k++){
cellValue = cells[k].getContents();
System.out.println(cellValue);
//单元格的值
}
}
}
}
}
}
}
}
fastexcel代码
package com.reader;
import java.io.File;
import edu.npu.fastexcel.FastExcel;
import edu.npu.fastexcel.Sheet;
import edu.npu.fastexcel.Workbook;
public class TestFastExcel {
public static void main(String[] args) throws Exception {
String strPath="F:/上海.xls";
Workbook workBook = FastExcel.createReadableWorkbook(new File(strPath));
workBook.open();
Sheet s = workBook.getSheet(0);
String[] row;
String cell;
//按照第一行及最后一行来取单元格
for (int i = s.getFirstRow(); i <= s.getLastRow(); i++) {
row = s.getRow(i);
for (int j = s.getFirstColumn(); j <= s.getLastColumn(); j++) {
cell = s.getCell(i, j);
System.out.println(cell);
}
}
workBook.close();
}
}
poi代码
public boolean readExcel(String filePath) throws IOException {
FileInputStream fis = new FileInputStream(filePath); // 根据excel文件路径创建文件流
POIFSFileSystem fs = new POIFSFileSystem(fis); // 利用poi读取excel文件流
HSSFWorkbook wb = new HSSFWorkbook(fs); // 读取excel工作簿
HSSFSheet sheet = wb.getSheetAt(0); // 读取excel的sheet,0表示读取第一个、1表示第二个.....
String account="";
// 获取sheet中总共有多少行数据sheet.getPhysicalNumberOfRows()
for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
HSSFRow row = sheet.getRow(i + 1); // 取出sheet中的某一行数据
if (row != null) {
// 获取该行中总共有多少列数据row.getLastCellNum()
for (int j = 0; j < row.getLastCellNum(); j++) {
HSSFCell cell = row.getCell((short) j); // 获取该行中的一个单元格对象
// 判断单元格数据类型,这个地方值得注意:当取某一行中的数据的时候,需要判断数据类型,否则会报错
// java.lang.NumberFormatException: You cannot get a string
// value from a numeric cell等等错误
if (cell==null) {
continue;
}
else {
String m=cell.getStringCellValue();
String mm=m.replace(",","");
}
}
}
}
//然后添加数据到数据库
}