博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POI导入大excel文件
阅读量:5970 次
发布时间:2019-06-19

本文共 4666 字,大约阅读时间需要 15 分钟。

hot3.png

package me.shanzhi.test;import java.io.InputStream;import java.util.ArrayList;import java.util.Iterator;import java.util.List;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.springframework.context.annotation.Scope;import org.springframework.stereotype.Component;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;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;/** * copy from apache.org * depends on poi*.jar, dom4j.jar, stax-api.jar,xmlbeans.jar, xerecesImpl.jar */@Scope("prototype")@Component("excel07EventUserModel")public class ExampleEventUserModel {		public void processOneSheet(String filename) 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		// Seems to either be rId# or rSheet#		InputStream sheet2 = r.getSheet("rId1");		InputSource sheetSource = new InputSource(sheet2);		parser.parse(sheetSource);		List
> sheetContent = ((SheetHandler) parser.getContentHandler()).retVal(); System.err.println(sheetContent.size()); for(List
 list : sheetContent) { System.out.println(list.get(7)); } sheet2.close(); } public void processAllSheets(String filename) throws Exception { OPCPackage pkg = OPCPackage.open(filename); XSSFReader r = new XSSFReader( pkg ); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); Iterator
 sheets = r.getSheetsData(); while(sheets.hasNext()) { System.out.println("Processing new sheet:\n"); InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); System.out.println(""); } } public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { XMLReader parser = XMLReaderFactory.createXMLReader( "org.apache.xerces.parsers.SAXParser" ); ContentHandler handler = new SheetHandler(sst); parser.setContentHandler(handler); return parser; } /**   * See org.xml.sax.helpers.DefaultHandler javadocs   */ private static class SheetHandler extends DefaultHandler { private SharedStringsTable sst; private String lastContents; private boolean nextIsString; private List
 row; private List
> sheet = new ArrayList
>(); //当前列 private int curCol = 0; //上一列 private int preCol = 0; private SheetHandler(SharedStringsTable sst) { this.sst = sst; } public List
> retVal() { return sheet; } public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { // c => cell if(name.equals("sheetData")) sheet = new ArrayList
>(); if(name.equals("row")) row = new ArrayList
(); if(name.equals("c")) { // Print the cell reference //System.out.print(attributes.getValue("r") + " - "); // Figure out if the value is an index in the SST String cellType = attributes.getValue("t"); String rowStr = attributes.getValue("r"); curCol = getRowIndex(rowStr); if(cellType != null && cellType.equals("s")) { nextIsString = true; } else { nextIsString = false; } } // Clear contents cache lastContents = ""; } public void endElement(String uri, String localName, String name) throws SAXException { // Process the last contents as required. // Do now, as characters() may be called more than once if(nextIsString) { int idx = Integer.parseInt(lastContents); lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString(); nextIsString = false; } // v => contents of a cell // Output after we've seen the string contents if(name.equals("v")) { //System.out.println(lastContents); int cols = curCol-preCol;               if (cols>1){                   for (int i = 0;i < cols-1;i++){                       row.add(preCol,"");                   }               }   row.add(curCol - 1 ,lastContents); preCol = curCol;   } if(name.equals("row")){ sheet.add(row); curCol = 0;                  preCol = 0;   } } public void characters(char[] ch, int start, int length) throws SAXException { lastContents += new String(ch, start, length); } //得到列索引,每一列c元素的r属性构成为字母加数字的形式,字母组合为列索引,数字组合为行索引,       //如AB45,表示为第(A-A+1)*26+(B-A+1)*26列,45行       public int getRowIndex(String rowStr){           rowStr = rowStr.replaceAll("[^A-Z]", "");           byte[] rowAbc = rowStr.getBytes();           int len = rowAbc.length;           float num = 0;           for (int i=0;i

转载于:https://my.oschina.net/u/1793291/blog/346808

你可能感兴趣的文章
MAXIMO 快速查找实现
查看>>
Oracle——条件控制语句
查看>>
[Linux][Redis][05]Benchmark
查看>>
第一次作业-准备篇
查看>>
HDU1848 Fibonacci again and again
查看>>
HTML思维导图
查看>>
git改密码出现授权问题
查看>>
ORA-02266: 表中的唯一/主键被启用的外键引用
查看>>
Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法
查看>>
day-6 and day-7:面向对象
查看>>
CSU Double Shortest Paths 湖南省第十届省赛
查看>>
webgl像机世界
查看>>
php正则怎么使用(最全最细致)
查看>>
javascript数学运算符
查看>>
LC.155. Min Stack(非优化,两个stack 同步 + -)
查看>>
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
Android创建启动画面
查看>>
Linux中date命令的各种实用方法--转载
查看>>
mysqld -install命令时出现install/remove of the service denied错误的原因和解决办法
查看>>