POI 큰 excel 파일 가져오기

5676 단어 poiExcel
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:
"); 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"); } }

좋은 웹페이지 즐겨찾기