POI Excel 파일 읽기

6401 단어 Excel
POI가 Excel 파일을 읽는 데는 두 가지 방식이 있는데 하나는usermodel 방식으로 읽는 것이다. 이런 방식의 장점은 통일된 인터페이스 개발, 읽는 것이다.xls 파일의 HSSFWorkbook 및 읽기.xlsx 파일의 XSSFWorkbook 두 클래스는 모두 Workbook 인터페이스를 구현합니다.또 하나는 이벤트 모델링 방식으로 읽는 것이다. 이런 방식은 앞의 방식보다 훨씬 복잡하고 2003버전과 2007버전의 엑셀 처리와 통일된 인터페이스가 없기 때문에 엑셀의 내부 파일 조직 원리를 이해해야 하지만 효율은 첫 번째 방식보다 훨씬 빠르고 대량의 데이터의 엑셀 파일을 쉽게 읽을 수 있어 메모리가 넘치지 않는다.본고는 이벤트usermodel 방식으로 2007 버전의 Excel 파일을 읽는 것을 소개한다.
Eventusermodel은 사실 XML의 파일 형식을 사용하여 Excel을 읽습니다. 왜냐하면 Excel 내부 조직도 XML을 통해 이루어졌기 때문입니다. (접두사 이름을.zip으로 바꿀 수 있습니다.)
xl\worksheets\sheet1.xml - 첫 번째 sheet 내용
 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"><dimension ref="A1:D1"/>
<sheetViews><sheetView workbookViewId="0"><selection sqref="A1:XFD1"/></sheetView></sheetViews>
<sheetFormatPr defaultRowHeight="13.5" x14ac:dyDescent="0.15"/>
	<sheetData>
		<row r="1" spans="1:4" x14ac:dyDescent="0.15">
			<c r="A1" t="s"><v>0</v></c>
			<c r="B1" t="s"><v>1</v></c>
			<c r="C1" t="s"><v>2</v></c>
			<c r="D1" t="s"><v>15</v></c>
		</row>
	</sheetData>
<phoneticPr fontId="1" type="noConversion"/><pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/><pageSetup paperSize="0" orientation="portrait" horizontalDpi="0" verticalDpi="0" copies="0"/></worksheet>

라벨은 칸을 나타냅니다. t='s'는 현재 칸의 형식이 문자열임을 나타냅니다. 그러면 0, 0은sharedStrings입니다.xml의 색인 값 라벨 번호입니다. 
 
xl\sharedStrings.xml - Excel 파일의 문자열 값(예: 내용 세션)
 
<si>
	<t>col1</t><phoneticPr fontId="1" type="noConversion"/>
</si>
<si>
	<t>col2</t><phoneticPr fontId="1" type="noConversion"/>
</si>

POI의 이벤트 모델도 이러한 원리를 통해 Excel 파일을 읽는다.
먼저 Excel 파일을 읽고 XSSFReader 인스턴스를 가져옵니다.
 
XSSFReader reader =  new XSSFReader(OPCPackage.open(file));
XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");

// sharedStrings.xml 
SharedStringsTable table = reader.getSharedStringsTable();

xmlReader.setContentHandler(new ContentHandler()// );

InputStream sheet = reader.getSheet("rId"+sheetId);

InputSourcesheetSource  =  new InputSource(sheet )

xmlReader.parse(sheetSource);
 
package net.bingosoft.import4excel.common;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class TestContentHandler extends DefaultHandler{

	private SharedStringsTable table;
	
	private boolean isString;
	
	private String value;
	
	private FileWriter writer;
	
	public TestContentHandler(SharedStringsTable table){
		this.table = table;
	}

	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
	 */
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		value = new String(ch,start,length);
	}

	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#endDocument()
	 */
	@Override
	public void endDocument() throws SAXException {
		try {
			writer.flush();
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		try {
			if(qName.equals("v")){
				if(isString) value = table.getEntryAt(Integer.valueOf(value.trim())).getT();
				writer.write(value+",");
			}
			if(qName.equals("row")){
				writer.write("\r
"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#startDocument() */ @Override public void startDocument() throws SAXException { try { File file = new File("D:/test.txt"); if(file.exists()) file.delete(); writer = new FileWriter(file); } catch (IOException e) { e.printStackTrace(); } } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("c")){ String type = attributes.getValue("t"); if(StringUtils.isNotBlank(type) && type.equals("s")){ isString = true; }else{ isString = false; } } value = ""; } }

좋은 웹페이지 즐겨찾기