maven:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.10.0</version>
</dependency>
代码:读取26M excel 2007 xlsx,43万记录,耗时25s (jvm: -Xmx1024M)
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class XSSFProcess {
public static void main1(String[] args) throws Exception {
System.out.println();
long end, start = System.currentTimeMillis();
// Path file = Paths.get("/home/skzrorg/tmp/2007.xlsx");
Path file = Paths.get("/home/skzrorg/tmp/xlsx/IPTABLE.xlsx");
SheetDatasHandler handler = UtilPoi.read(file);
end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) / 1000f + "s");
List<List<Object>> sheet = handler.getSheetData(0);
System.out.println("sheet 大小:" + sheet.size());
System.out.println("sheet[0]" + sheet.get(0));
int i = new Random().nextInt(sheet.size());
System.out.println("sheet[" + i + "]" + sheet.get(i));
System.out.println("sheet[" + (sheet.size() - 1) + "]" + sheet.get(sheet.size() - 1));
}
private static int rowCount;
public static void main(String[] args) throws Exception {
System.out.println();
long end, start = System.currentTimeMillis();
Path file = Paths.get("/home/skzrorg/tmp/xlsx/IPTABLE.xlsx");
UtilPoi.read(file, new RowMapper() {
@Override
void mapRow(int sheetIndex, int rowIndex, List<Object> row) {
rowCount++;
}
});
end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) / 1000f + "s");
System.out.println("sheet 大小:" + rowCount);
}
}
class UtilPoi {
public static SheetDatasHandler read(Path file) throws Exception {
SheetDatasHandler handler = new SheetDatasHandler((int) (Files.size(file) / 50));
read(file, handler);
return handler;
}
public static void read(Path file, RowMapper mapper) throws Exception {
final long size = Files.size(file);
try (InputStream in = new BufferedInputStream(new FileInputStream(file.toFile()), size > Integer.MAX_VALUE ? 1024 * 1024 * 10 : (int) size)) {
read(in, mapper);
}
}
public static void read(InputStream in, RowMapper mapper) throws Exception {
XSSFReader reader = new XSSFReader(OPCPackage.open(in));
XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
mapper.setSharedStringsTable(reader.getSharedStringsTable());
parser.setContentHandler(mapper);
for (Iterator<InputStream> iter = reader.getSheetsData(); iter.hasNext();) {
try (InputStream sheetIn = iter.next()) {
parser.parse(new InputSource(sheetIn));
}
}
}
}
class SheetDatasHandler extends RowMapper {
private int bufRowSize, curSheetIndex = -1;
private List<List<List<Object>>> sheetDatas = new ArrayList<>();
private List<List<Object>> sheetData;
public List<List<List<Object>>> getSheetDatas() {
return sheetDatas;
}
public List<List<Object>> getSheetData(int sheetIndex) {
return sheetDatas.get(sheetIndex);
}
SheetDatasHandler(int bufRowSize) {
this.bufRowSize = bufRowSize;
}
@Override
void mapRow(int sheetIndex, int rowIndex, List<Object> row) {
if (curSheetIndex != sheetIndex) {
sheetData = new ArrayList<>(sheetIndex == 0 ? bufRowSize : sheetData.size() / 2);
sheetDatas.add(sheetData);
curSheetIndex = sheetIndex;
}
sheetData.add(row);
}
}
abstract class RowMapper extends DefaultHandler {
private SharedStringsTable sst;
private Map<Integer, String> strMap;
private int sheetIndex = -1, rowIndex = -1;
private List<Object> row;
private String cellS;
private String cellType;
private boolean valueFlag;
private StringBuilder value;
public void setSharedStringsTable(SharedStringsTable sst) {
this.sst = sst;
strMap = new HashMap<>(sst.getCount());
}
private void clearSheet() {
sst = null;
strMap = null;
row = null;
cellS = null;
cellType = null;
value = null;
rowIndex = 0;
}
private Object convertCellValue() {
String tmp = value.toString();
Object result = tmp;
if ("s".equals(cellType)) { //字符串
Integer key = Integer.parseInt(tmp);
result = strMap.get(key);
if (result == null) strMap.put(key, (String) (result = new XSSFRichTextString(sst.getEntryAt(key)).toString()));
} else if ("n".equals(cellType)) {
if ("2".equals(cellS)) { //日期
result = HSSFDateUtil.getJavaDate(Double.valueOf(tmp));
}
}
return result;
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if ("sheetData".equals(name)) {
sheetIndex++;
} else if ("row".equals(name)) {
rowIndex++;
row = new ArrayList<>();
} else if ("c".equals(name)) {
cellS = attributes.getValue("s");
cellType = attributes.getValue("t");
} else if ("v".equals(name)) {
valueFlag = true;
value = new StringBuilder();
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if ("sheetData".equals(name)) {
clearSheet();
} else if ("row".equals(name)) {
mapRow(sheetIndex, rowIndex, row);
} else if ("v".equals(name)) {
row.add(convertCellValue());
valueFlag = false;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (valueFlag) value.append(ch, start, length);
}
abstract void mapRow(int sheetIndex, int rowIndex, List<Object> row);
}
如果采用dom解析,需要配置2G内存
分享到:
相关推荐
标题"java读取excel之xlsl超大文件"所涉及的核心知识点是优化大量数据的读取策略。在Java中,可以使用Apache POI的SXSSF API(Streaming Usermodel API)来实现这种优化。与常规的XSSF API不同,SXSSF允许我们以流的...
### Java处理100万行超大Excel文件秒级响应 #### 一、问题背景与需求分析 在项目开发过程中,经常会遇到需要处理大量Excel数据的情况。这些数据可能包括成千上万条记录,每条记录又包含多个字段。传统的处理方式...
C# 读取加密的Excel 文件; 有源码,VS2010开发。 采用的是微软的Microsoft.Office.Interop.Excel, V14.0,来读取加密后的Excle文件。 不是采用第三方控件NPOI读取加密的Excel文件。 开始研究NPOI读取加密的Excel文件...
在Qt框架下,读取Excel文件通常涉及到使用第三方库,如QAxContainer模块或QCustomPlot等。QAxContainer允许Qt应用程序与ActiveX控件交互,而Excel文件可以通过Microsoft的COM接口来访问。以下是详细的知识点说明: ...
python读取excel数据:Python读取Excel文件Python读取Excel文件Python读取Excel文件Python读取Excel文件Python读取Excel文件Python读取Excel文件Python读取Excel文件Python读取Excel文件Python读取Excel文件Python...
以`SheetJS`为例,可以使用以下代码读取Excel文件: ```javascript var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; var workbook = XLSX.read(data, {type: 'binary...
以下是一些关键知识点,针对"excel读取超大文件java代码"的主题进行详细说明: 1. **Apache POI库**:Apache POI是一个流行的Java库,用于处理Microsoft Office格式的文件,包括Excel。它提供了API来读取、写入和...
本例中的“EXCEL VBA 读取文本文件宏”是一个专门用于读取文本文件并将其内容导入到Excel工作表的宏。下面将详细解释这个宏的工作原理和涉及的关键知识点。 1. **GetOpenFilename函数**: - 在VBA中,`Application...
Java 读取 Excel 文件 Java 读取 Excel 文件是指使用 Java 语言从 Excel 文件中读取数据,并对其进行处理的过程。下面将详细介绍 Java 读取 Excel 文件的过程和相关知识点。 Java 读取 Excel 文件的步骤 1. 导入...
在VB6(Visual Basic 6)中,读取Excel文件是一项常见的任务,特别是在处理数据导入、导出或分析时。以下是一些关于如何在VB6中读取Excel文件及其内容的关键知识点,以及如何连接到SQL数据库以读取数据。 1. **引入...
读取环境为Win10+VS2015,个人参考资料封装的excel读取模块用来读取Excel2007中的数据,文件为压缩文件,亲测可用。
"Delphi7 读取 Excel 文件" Delphi7 是一个功能强大的开发环境,它提供了多种方式来读取 Excel 文件。在本文中,我们将介绍使用 OLE 和 Excel Application 读取 Excel 文件的方法。 使用 OLE 读取 Excel 文件 ...
java读取Excel文件中多个sheet,生成xml格式的文件
### 直接读取Excel文件数据 #### 一、引言 Microsoft Excel 是一款非常流行的电子表格处理软件,被广泛应用于各种数据管理场景。Excel 文件的格式为 BIFF(Binary Interchange File Format)。BIFF 是一种二进制...
在Unity游戏开发中,有时我们需要从Excel文件中读取数据,比如角色属性、地图配置或者游戏物品信息等。为了实现这一功能,我们可以借助外部库来处理Excel文件。本篇文章将详细讲解如何在Unity中读取Excel文件,以及...
asp.net mvc 上传excel文件并读取excle内容转成DataTable(Spire.Office.3.6.0) 一个需求:将一个Excel文件中的数据导入到数据库中去。 思路:上传一个excel文件,读取该excel文件中数据,转成DataTable(或List),...
Python提供了多个库来方便地读取和写入Excel文件,其中最常用的是`pandas`库和`openpyxl`库。本例子将重点介绍如何使用Python通过`pandas`库来读取Excel文件。 首先,`pandas`是一个强大的数据处理库,它提供了...
在本文中,我们将深入探讨如何使用Microsoft Foundation Classes (MFC) 来读取Excel文件,特别是在配置文件ini中指定的目录下查找并处理所有Excel文件。MFC是Microsoft提供的一套面向对象的类库,它使得Windows应用...
//C# 读取Excel文件、C#读取xls文件、C#读取xlsx文件、C#读取csv文件 //C# 将xls文件转换为DataTable、C#将xlsx文件转换为DataTable //C#将csv文件转换为DataTable //C#将txt文件转换为DataTable(列与列之间空格隔...
AutoLISP 读取 Excel 文件 AutoLISP 是一种功能强大的编程语言,广泛应用于计算机辅助设计(CAD)领域。它可以与 Autodesk 的 AutoCAD 等软件集成,用于自动化设计和绘图过程。AutoLISP 也可以用于读取和处理 Excel...