Сейчас использую
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
вот такой класс-читальщик, который нашел на просторах инета
import org.apache.poi.ss.usermodel.*;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by bvn13 on 01.07.2017.
*/
public class ExcelReader {
public static List<List<String>> readSpreadSheet(InputStream inputStream, Integer sheetNum) {
Workbook workBook = null;
try {
workBook = WorkbookFactory.create(inputStream);
} catch (Exception e) {
throw new RuntimeException(e);
}
Sheet sheet = workBook.getSheetAt(sheetNum);
List<List<String>> rowHolder = new ArrayList<List<String>>();
int cellNum = sheet.getRow(1).getLastCellNum();
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
List<String> cellHolder = new ArrayList<String>();
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
String cellValue = parseCellValue(workBook, cell);
cellHolder.add(cellValue);
}
//add empty cells to the end if required
while (cellHolder.size() < cellNum) {
cellHolder.add(null);
}
rowHolder.add(cellHolder);
}
return rowHolder;
}
private static String parseCellValue(Workbook workBook, Cell cell) {
FormulaEvaluator evaluator = workBook.getCreationHelper().createFormulaEvaluator();
String cellValue = null;
if (cell != null) {
switch (cell.getCellTypeEnum()) {
case STRING:
cellValue = cell.getRichStringCellValue().getString();
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
cellValue = cell.getDateCellValue().toString();
} else {
cellValue = new Double(cell.getNumericCellValue()).toString();
}
break;
case BOOLEAN:
cellValue = new Boolean(cell.getBooleanCellValue()).toString();
break;
case FORMULA:
cellValue = evaluator.evaluate(cell).formatAsString();
break;
}
}
return cellValue;
}
public static List<List<String>> readSpreadSheetWOnull(InputStream inputStream, Integer sheetNumber) {
Workbook workBook = null;
try {
workBook = WorkbookFactory.create(inputStream);
Sheet sheet = workBook.getSheetAt(sheetNumber);
Iterator<Row> rowIter = sheet.rowIterator();
List<List<String>> rowHolder = new ArrayList<List<String>>();
while (rowIter.hasNext()) {
Row row = (Row) rowIter.next();
Iterator<Cell> cellIter = row.cellIterator();
List<String> cellHolder = new ArrayList<String>();
while (cellIter.hasNext()) {
Cell cell = (Cell) cellIter.next();
String cellValue = parseCellValue(workBook, cell);
cellHolder.add(cellValue);
}
rowHolder.add(cellHolder);
}
return rowHolder;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static List<List<String>> readSpreadSheetWOnull(InputStream inputStream) {
return readSpreadSheetWOnull(inputStream, 0);
}
public static List<List<String>> readSpreadSheet(InputStream inputStream) {
return readSpreadSheet(inputStream, 0);
}
}
Если подсунуть 10-меговый файл, то даже на моем i7 8Gb вылетает с ошибкой:
Exception in thread "ru.bvn13.priceprocessor.workers.PriceLoaderFromFileWorker" java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.getNodeObject(DeferredDocumentImpl.java:1017)
at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.synchronizeChildren(DeferredDocumentImpl.java:1755)
at com.sun.org.apache.xerces.internal.dom.DeferredElementNSImpl.synchronizeChildren(DeferredElementNSImpl.java:158)
at com.sun.org.apache.xerces.internal.dom.ParentNode.getFirstChild(ParentNode.java:229)
at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1402)
at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1445)
at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1403)
at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1445)
at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1403)
at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1445)
at org.apache.xmlbeans.impl.store.Locale.loadNodeChildren(Locale.java:1403)
at org.apache.xmlbeans.impl.store.Locale.loadNode(Locale.java:1445)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1385)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1370)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:370)
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:144)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:183)
at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:175)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.parseSheet(XSSFWorkbook.java:438)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:403)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:266)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:185)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:144)
at ru.bvn13.priceprocessor.utils.ExcelReader.readSpreadSheet(ExcelReader.java:18)
at ru.bvn13.priceprocessor.utils.ExcelReader.readSpreadSheet(ExcelReader.java:102)
at ru.bvn13.priceprocessor.workers.PriceLoaderFromFileWorker.readFileNewExcelFormat(PriceLoaderFromFileWorker.java:409)
at ru.bvn13.priceprocessor.workers.PriceLoaderFromFileWorker.loadFile(PriceLoaderFromFileWorker.java:294)
at ru.bvn13.priceprocessor.workers.PriceLoaderFromFileWorker.startLoadingFile(PriceLoaderFromFileWorker.java:206)
at ru.bvn13.priceprocessor.workers.PriceLoaderFromFileWorker.job(PriceLoaderFromFileWorker.java:96)
at ru.bvn13.priceprocessor.workers.AbstractWorker.run(AbstractWorker.java:52)
А есть что-то менее прожорливое, чтобы читать?