- 浏览: 167320 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
xiangyufangai:
很好很强大膜拜中哈哈!!
VB 两个字符串处理函数(类似Left/Mid/Right/Split的结合) -
hellohank:
这个……叫摘要算法,不叫加密算法~
Java实现的加密工具类(支持MD5和SHA) -
NIUCH1029291561:
接口有问题奥
网银在线支付接口和应用 -
yeuego:
能幫你就行了
MySQL索引分析 -
ForgiDaved:
很给力的介绍。记得前段时间给一个系统加功能,设计的表没有 ...
MySQL索引分析
excel2007文件格式与之前版本不同,之前版本采用的是微软自己的存储格式。07版内容的存储采用XML格式,所以,理所当然的,对大数据量的 xlsx文件的读取采用的也是XML的处理方式SAX。
同之前的版本一样,大数据量文件的读取采用的是事件模型eventusermodel。usermodel模式需要将文件一次性全部读到内存中,07版的既然采用的存储模式是xml,解析用的DOM方式也是如此,这种模式操作简单,容易上手,但是对于大量数据占用的内存也是相当可观,在Eclipse中经常出现内存溢出。
下面就是采用eventusermodel对07excel文件读取。
同上篇,我将当前行的单元格数据存储到List中,抽象出 optRows 方法,该方法会在每行末尾时调用,方法参数为当前行索引curRow(int型)及存有行内单元格数据的List。继承类只需实现该行级方法即可。
经测试,对12万条数据,7M大小的文件也能正常运行。无需设置vm的内存空间。
excel读取采用的API为POI3.6,使用前先下载此包,若运行中出现其他依赖包不存在,请下载相应依赖包。
抽象类:XxlsAbstract ,作用:遍历excel文件,提供行级操作方法 optRows
- package com.gaosheng.util.xls;
- import java.io.InputStream;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import org.apache.poi.xssf.eventusermodel.XSSFReader;
- import org.apache.poi.xssf.model.SharedStringsTable;
- import org.apache.poi.xssf.usermodel.XSSFRichTextString;
- import org.apache.poi.openxml4j.opc.OPCPackage;
- 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;
- /**
- * XSSF and SAX (Event API)
- */
- public abstract class XxlsAbstract extends DefaultHandler {
- private SharedStringsTable sst;
- private String lastContents;
- private boolean nextIsString;
- private int sheetIndex = -1;
- private List<String> rowlist = new ArrayList<String>();
- private int curRow = 0;
- private int curCol = 0;
- //excel记录行操作方法,以行索引和行元素列表为参数,对一行元素进行操作,元素为String类型
- // public abstract void optRows(int curRow, List<String> rowlist) throws SQLException ;
- //excel记录行操作方法,以sheet索引,行索引和行元素列表为参数,对sheet的一行元素进行操作,元素为String类型
- public abstract void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException;
- //只遍历一个sheet,其中sheetId为要遍历的sheet索引,从1开始,1-3
- public void processOneSheet(String filename,int sheetId) throws Exception {
- OPCPackage pkg = OPCPackage.open(filename);
- XSSFReader r = new XSSFReader(pkg);
- SharedStringsTable sst = r.getSharedStringsTable();
- XMLReader parser = fetchSheetParser(sst);
- // rId2 found by processing the Workbook
- // 根据 rId# 或 rSheet# 查找sheet
- InputStream sheet2 = r.getSheet("rId"+sheetId);
- sheetIndex++;
- InputSource sheetSource = new InputSource(sheet2);
- parser.parse(sheetSource);
- sheet2.close();
- }
- /**
- * 遍历 excel 文件
- */
- public void process(String filename) throws Exception {
- OPCPackage pkg = OPCPackage.open(filename);
- XSSFReader r = new XSSFReader(pkg);
- SharedStringsTable sst = r.getSharedStringsTable();
- XMLReader parser = fetchSheetParser(sst);
- Iterator<InputStream> sheets = r.getSheetsData();
- while (sheets.hasNext()) {
- curRow = 0;
- sheetIndex++;
- InputStream sheet = sheets.next();
- InputSource sheetSource = new InputSource(sheet);
- parser.parse(sheetSource);
- sheet.close();
- }
- }
- public XMLReader fetchSheetParser(SharedStringsTable sst)
- throws SAXException {
- XMLReader parser = XMLReaderFactory
- .createXMLReader("org.apache.xerces.parsers.SAXParser");
- this.sst = sst;
- parser.setContentHandler(this);
- return parser;
- }
- public void startElement(String uri, String localName, String name,
- Attributes attributes) throws SAXException {
- // c => 单元格
- if (name.equals("c")) {
- // 如果下一个元素是 SST 的索引,则将nextIsString标记为true
- String cellType = attributes.getValue("t");
- if (cellType != null && cellType.equals("s")) {
- nextIsString = true;
- } else {
- nextIsString = false;
- }
- }
- // 置空
- lastContents = "";
- }
- public void endElement(String uri, String localName, String name)
- throws SAXException {
- // 根据SST的索引值的到单元格的真正要存储的字符串
- // 这时characters()方法可能会被调用多次
- if (nextIsString) {
- try {
- int idx = Integer.parseInt(lastContents);
- lastContents = new XSSFRichTextString(sst.getEntryAt(idx))
- .toString();
- } catch (Exception e) {
- }
- }
- // v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引
- // 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符
- if (name.equals("v")) {
- String value = lastContents.trim();
- value = value.equals("")?" ":value;
- rowlist.add(curCol, value);
- curCol++;
- }else {
- //如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法
- if (name.equals("row")) {
- try {
- optRows(sheetIndex,curRow,rowlist);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- rowlist.clear();
- curRow++;
- curCol = 0;
- }
- }
- }
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- //得到单元格内容的值
- lastContents += new String(ch, start, length);
- }
- }
package com.gaosheng.util.xls; import java.io.InputStream; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.apache.poi.openxml4j.opc.OPCPackage; 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; /** * XSSF and SAX (Event API) */ public abstract class XxlsAbstract extends DefaultHandler { private SharedStringsTable sst; private String lastContents; private boolean nextIsString; private int sheetIndex = -1; private List<String> rowlist = new ArrayList<String>(); private int curRow = 0; private int curCol = 0; //excel记录行操作方法,以行索引和行元素列表为参数,对一行元素进行操作,元素为String类型 // public abstract void optRows(int curRow, List<String> rowlist) throws SQLException ; //excel记录行操作方法,以sheet索引,行索引和行元素列表为参数,对sheet的一行元素进行操作,元素为String类型 public abstract void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException; //只遍历一个sheet,其中sheetId为要遍历的sheet索引,从1开始,1-3 public void processOneSheet(String filename,int sheetId) throws Exception { OPCPackage pkg = OPCPackage.open(filename); XSSFReader r = new XSSFReader(pkg); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); // rId2 found by processing the Workbook // 根据 rId# 或 rSheet# 查找sheet InputStream sheet2 = r.getSheet("rId"+sheetId); sheetIndex++; InputSource sheetSource = new InputSource(sheet2); parser.parse(sheetSource); sheet2.close(); } /** * 遍历 excel 文件 */ public void process(String filename) throws Exception { OPCPackage pkg = OPCPackage.open(filename); XSSFReader r = new XSSFReader(pkg); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); Iterator<InputStream> sheets = r.getSheetsData(); while (sheets.hasNext()) { curRow = 0; sheetIndex++; InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); } } public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { XMLReader parser = XMLReaderFactory .createXMLReader("org.apache.xerces.parsers.SAXParser"); this.sst = sst; parser.setContentHandler(this); return parser; } public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // c => 单元格 if (name.equals("c")) { // 如果下一个元素是 SST 的索引,则将nextIsString标记为true String cellType = attributes.getValue("t"); if (cellType != null && cellType.equals("s")) { nextIsString = true; } else { nextIsString = false; } } // 置空 lastContents = ""; } public void endElement(String uri, String localName, String name) throws SAXException { // 根据SST的索引值的到单元格的真正要存储的字符串 // 这时characters()方法可能会被调用多次 if (nextIsString) { try { int idx = Integer.parseInt(lastContents); lastContents = new XSSFRichTextString(sst.getEntryAt(idx)) .toString(); } catch (Exception e) { } } // v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引 // 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符 if (name.equals("v")) { String value = lastContents.trim(); value = value.equals("")?" ":value; rowlist.add(curCol, value); curCol++; }else { //如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法 if (name.equals("row")) { try { optRows(sheetIndex,curRow,rowlist); } catch (SQLException e) { e.printStackTrace(); } rowlist.clear(); curRow++; curCol = 0; } } } public void characters(char[] ch, int start, int length) throws SAXException { //得到单元格内容的值 lastContents += new String(ch, start, length); } }
继承类:XxlsBig,作用:将数据转出到数据库临时表
- package com.gaosheng.util.examples.xls;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.util.List;
- import java.util.Properties;
- import com.gaosheng.util.xls.XxlsAbstract;
- public class XxlsBig extends XxlsAbstract {
- public static void main(String[] args) throws Exception {
- XxlsBig howto = new XxlsBig("temp_table");
- howto.processOneSheet("F:/new.xlsx",1);
- howto.process("F:/new.xlsx");
- howto.close();
- }
- public XxlsBig(String tableName) throws SQLException{
- this.conn = getNew_Conn();
- this.statement = conn.createStatement();
- this.tableName = tableName;
- }
- private Connection conn = null;
- private Statement statement = null;
- private PreparedStatement newStatement = null;
- private String tableName = "temp_table";
- private boolean create = true;
- public void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException {
- if (sheetIndex == 0 && curRow == 0) {
- StringBuffer preSql = new StringBuffer("insert into " + tableName
- + " values(");
- StringBuffer table = new StringBuffer("create table " + tableName
- + "(");
- int c = rowlist.size();
- for (int i = 0; i < c; i++) {
- preSql.append("?,");
- table.append(rowlist.get(i));
- table.append(" varchar2(100) ,");
- }
- table.deleteCharAt(table.length() - 1);
- preSql.deleteCharAt(preSql.length() - 1);
- table.append(")");
- preSql.append(")");
- if (create) {
- statement = conn.createStatement();
- try{
- statement.execute("drop table "+tableName);
- }catch(Exception e){
- }finally{
- System.out.println("表 "+tableName+" 删除成功");
- }
- if (!statement.execute(table.toString())) {
- System.out.println("创建表 "+tableName+" 成功");
- // return;
- } else {
- System.out.println("创建表 "+tableName+" 失败");
- return;
- }
- }
- conn.setAutoCommit(false);
- newStatement = conn.prepareStatement(preSql.toString());
- } else if(curRow>0) {
- // 一般行
- int col = rowlist.size();
- for (int i = 0; i < col; i++) {
- newStatement.setString(i + 1, rowlist.get(i).toString());
- }
- newStatement.addBatch();
- if (curRow % 1000 == 0) {
- newStatement.executeBatch();
- conn.commit();
- }
- }
- }
- private static Connection getNew_Conn() {
- Connection conn = null;
- Properties props = new Properties();
- FileInputStream fis = null;
- try {
- fis = new FileInputStream("D:/database.properties");
- props.load(fis);
- DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
- // String jdbcURLString =
- // "jdbc:oracle:thin:@192.168.0.28:1521:orcl";
- StringBuffer jdbcURLString = new StringBuffer();
- jdbcURLString.append("jdbc:oracle:thin:@");
- jdbcURLString.append(props.getProperty("host"));
- jdbcURLString.append(":");
- jdbcURLString.append(props.getProperty("port"));
- jdbcURLString.append(":");
- jdbcURLString.append(props.getProperty("database"));
- conn = DriverManager.getConnection(jdbcURLString.toString(), props
- .getProperty("user"), props.getProperty("password"));
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- fis.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return conn;
- }
- public int close() {
- try {
- newStatement.executeBatch();
- conn.commit();
- System.out.println("数据写入完毕");
- this.newStatement.close();
- this.statement.close();
- this.conn.close();
- return 1;
- } catch (SQLException e) {
- return 0;
- }
- }
- }
package com.gaosheng.util.examples.xls; import java.io.FileInputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.Properties; import com.gaosheng.util.xls.XxlsAbstract; public class XxlsBig extends XxlsAbstract { public static void main(String[] args) throws Exception { XxlsBig howto = new XxlsBig("temp_table"); howto.processOneSheet("F:/new.xlsx",1); howto.process("F:/new.xlsx"); howto.close(); } public XxlsBig(String tableName) throws SQLException{ this.conn = getNew_Conn(); this.statement = conn.createStatement(); this.tableName = tableName; } private Connection conn = null; private Statement statement = null; private PreparedStatement newStatement = null; private String tableName = "temp_table"; private boolean create = true; public void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException { if (sheetIndex == 0 && curRow == 0) { StringBuffer preSql = new StringBuffer("insert into " + tableName + " values("); StringBuffer table = new StringBuffer("create table " + tableName + "("); int c = rowlist.size(); for (int i = 0; i < c; i++) { preSql.append("?,"); table.append(rowlist.get(i)); table.append(" varchar2(100) ,"); } table.deleteCharAt(table.length() - 1); preSql.deleteCharAt(preSql.length() - 1); table.append(")"); preSql.append(")"); if (create) { statement = conn.createStatement(); try{ statement.execute("drop table "+tableName); }catch(Exception e){ }finally{ System.out.println("表 "+tableName+" 删除成功"); } if (!statement.execute(table.toString())) { System.out.println("创建表 "+tableName+" 成功"); // return; } else { System.out.println("创建表 "+tableName+" 失败"); return; } } conn.setAutoCommit(false); newStatement = conn.prepareStatement(preSql.toString()); } else if(curRow>0) { // 一般行 int col = rowlist.size(); for (int i = 0; i < col; i++) { newStatement.setString(i + 1, rowlist.get(i).toString()); } newStatement.addBatch(); if (curRow % 1000 == 0) { newStatement.executeBatch(); conn.commit(); } } } private static Connection getNew_Conn() { Connection conn = null; Properties props = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream("D:/database.properties"); props.load(fis); DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); // String jdbcURLString = // "jdbc:oracle:thin:@192.168.0.28:1521:orcl"; StringBuffer jdbcURLString = new StringBuffer(); jdbcURLString.append("jdbc:oracle:thin:@"); jdbcURLString.append(props.getProperty("host")); jdbcURLString.append(":"); jdbcURLString.append(props.getProperty("port")); jdbcURLString.append(":"); jdbcURLString.append(props.getProperty("database")); conn = DriverManager.getConnection(jdbcURLString.toString(), props .getProperty("user"), props.getProperty("password")); } catch (Exception e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } return conn; } public int close() { try { newStatement.executeBatch(); conn.commit(); System.out.println("数据写入完毕"); this.newStatement.close(); this.statement.close(); this.conn.close(); return 1; } catch (SQLException e) { return 0; } } }
继承类:XxlsPrint,作用:将数据输出到控制台
- package com.gaosheng.util.examples.xls;
- import java.sql.SQLException;
- import java.util.List;
- import com.gaosheng.util.xls.XxlsAbstract;
- public class XxlsPrint extends XxlsAbstract {
- @Override
- public void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException {
- for (int i = 0; i < rowlist.size(); i++) {
- System.out.print("'" + rowlist.get(i) + "',");
- }
- System.out.println();
- }
- public static void main(String[] args) throws Exception {
- XxlsPrint howto = new XxlsPrint();
- howto.processOneSheet("F:/new.xlsx",1);
- // howto.processAllSheets("F:/new.xlsx");
- }
- }
package com.gaosheng.util.examples.xls; import java.sql.SQLException; import java.util.List; import com.gaosheng.util.xls.XxlsAbstract; public class XxlsPrint extends XxlsAbstract { @Override public void optRows(int sheetIndex,int curRow, List<String> rowlist) throws SQLException { for (int i = 0; i < rowlist.size(); i++) { System.out.print("'" + rowlist.get(i) + "',"); } System.out.println(); } public static void main(String[] args) throws Exception { XxlsPrint howto = new XxlsPrint(); howto.processOneSheet("F:/new.xlsx",1); // howto.processAllSheets("F:/new.xlsx"); } }
源代码在附件中,还包含了说明文件、数据库配置文件、以及整合xls文件和xlsx文件读取的类:Xls2Do。
- src.rar (9.7 KB)
- 下载次数: 361
相关推荐
NULL 博文链接:https://dpn525.iteye.com/blog/850998
NULL 博文链接:https://gaosheng08.iteye.com/blog/624758
usermodel模式对excel操作前需要将文件全部转入内存,对较大文件来说内存开销很大。但是其使用简单。 eventusermodel模式采用事件模型,对文件边读取边处理,内存消耗较低,效率高,因为不用等待文件全部装入内存。...
使用Poi读取大数据量excel的方法 支持2003和2007的版本
1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....
该代码可以处理100万数据量的excel文件,xlsx文件数据量太大,用普通的读法会报内存溢出错误,所以用官网提供的方法,一条一条的读取大excel文件,本例子从这点出发,组装excel里读取的单条数据为list,在根据需求...
poi读取大数据量excel文件,避免内存溢出,行级操作 根据本网站的资源修改的。 将一些类路径错误全部进行了修正。 另外,需要自己在类路径里,放spring-context.jar和spring-beans.jar包。
NULL 博文链接:https://javaedge-yc.iteye.com/blog/1308714
此工具类是基于Apache POI的用于读取大数据量Excel 07版后的表格文件,从而高效地读取到表格数据并以集合形式保存下来。 使用方式: List[]> list = new ArrayList[]>(); ExcelXlsxParser parser = new ...
读取环境为Win10+VS2015,个人参考资料封装的excel读取模块用来读取Excel2007中的数据,文件为压缩文件,亲测可用。
C# 读取加密的Excel 文件; 有源码,VS2010开发。 采用的是微软的Microsoft.Office.Interop.Excel, V14.0,来读取加密后的Excle文件。...若有那位大牛研究出NPOI读取加密的Excel文件,希望能共享出源码来。 谢谢
Android开发时,需要把数据存储在Excel文件中,并且用时还可以读取。支持大数据的存储和读取。
java读取数据量大的excel文件(包括2003版及2007版)
Visual Basic读取EXCEL文件含完整源代码,可以读取Excel文件的内容并显示出来
1、Java导出动态数据为Excel文件,具体示例可以参考:https://img-blog.csdnimg.cn/1cc86ee5dffa48669e2b97283585fad2.png 2、项目使用SpringBoot,Ali3.0.5版本的easyexcel框架。 3、资源内有具体的使用说明和易...
本文实例讲述了Python实现读取txt文件并转换为excel的方法。分享给大家供大家参考,具体如下: 这里的txt文件内容格式为: 892天平天国定都在?A开封B南京C北京(B) Python代码如下: # coding=utf-8 ''''' main...
EXCEL VBA 读取文本文件宏EXCEL VBA 读取文本文件宏EXCEL VBA 读取文本文件宏
本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了减少用户的下载量,减少用户的下载资源分,我已经将代码整合好了,运行类为:com.telesound.dataimport.excel.TestReadExcel...
Java解析大数据量Excel,支持解析百万行excel数据,十万数据基本上十来秒就解析完毕,亲测过最大excel1048576行数据用时219秒,硬件好点的PC估计跑起来更快。
使用VFP读取EXCEL中的数据示例 *!* *****数据导入程序,由“学生基本基本情况表模板.xls”导入数据 *!* ***使用VFP控制EXCEL表,计取中指定列的内容*********** *!* "学生基本基本情况表模板.xls"的数据布局 *!* ...