POI导入大excel文件

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<List<String>> sheetContent = ((SheetHandler) parser.getContentHandler()).retVal();
		System.err.println(sheetContent.size());
		for(List<String> 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<InputStream> 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<String> row;
		
		private List<List<String>> sheet = new ArrayList<List<String>>();
		
		//当前列
		private int curCol = 0;
		//上一列
		private int preCol = 0;
		
		private SheetHandler(SharedStringsTable sst) {
			this.sst = sst;
		}
		
		public List<List<String>> 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<List<String>>();
			if(name.equals("row")) row = new ArrayList<String>();
			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<len;i++){  
	            num += (rowAbc[i]-'A'+1)*Math.pow(26,len-i-1 );  
	        }  
	        return (int) num;  
	    }  
	}

	public static void main(String[] args) throws Exception {
		ExampleEventUserModel example = new ExampleEventUserModel();
		example.processOneSheet("D:\\Users\\1月.xlsx");
	}
}


你可能感兴趣的:(poi,Excel)