package foundation.io.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; 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.model.StylesTable; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import foundation.data.entity.EntitySet; import foundation.io.define.DataIO; import foundation.io.engine.IReadDataListener; import foundation.io.engine.ISheetReader; import foundation.io.engine.IWorkBookReader; import foundation.io.file.pull.DataBucket; import foundation.io.file.pull.SheetHandler; import foundation.io.mapping.MappingsRuntime; import foundation.io.object.Titles; import foundation.util.MapList; public class BookSAXReader extends IWorkBookReader implements ISheetReader { private int batchCount; private FileInputStream inputStream; private OPCPackage excelPackage; private SharedStringsTable sharedStrings; private StylesTable stylesTable; private MapList sheetList; private DataIO dataIO; private XMLReader sheetParser; private InputSource sheetSource; private int titleRowNo; private int dataRowNo; private DataBucket dataBucket; public BookSAXReader(File file, int batchCount) throws FileNotFoundException { this.batchCount = batchCount; inputStream = new FileInputStream(file); dataBucket = new DataBucket(batchCount); } public void open() throws Exception { //1. open file excelPackage = OPCPackage.open(inputStream); XSSFReader reader = new XSSFReader(excelPackage); //2. get style table and shared string stylesTable = reader.getStylesTable(); sharedStrings = reader.getSharedStringsTable(); //3. get sheet list XSSFReader.SheetIterator sheetIterator = (XSSFReader.SheetIterator) reader.getSheetsData(); while (sheetIterator.hasNext()) { String sheetName = sheetIterator.getSheetName(); InputStream sheetStream = sheetIterator.next(); sheetList.add(sheetName, sheetStream); } } @Override public ISheetReader openSheetReader(DataIO dataIO) throws Exception { this.dataIO = dataIO; this.titleRowNo = dataIO.getFromTitleRowNo(); this.dataRowNo = dataIO.getFromDataRowNo(); dataBucket.setDataObject(dataIO.getToTempDataObject()); String sheetName = dataIO.getFromName(); InputStream sheetInputStream = sheetList.get(sheetName); if (sheetInputStream == null) { sheetInputStream = sheetList.get(0); } if (sheetInputStream == null) { return null; } sheetParser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); SheetHandler handler = new SheetHandler(sharedStrings, stylesTable, dataBucket, titleRowNo, dataRowNo); sheetParser.setContentHandler(handler); sheetSource = new InputSource(sheetInputStream); sheetParser.parse(sheetSource); return this; } public void parse() throws IOException, SAXException { sheetParser.parse(sheetSource); } @Override public Titles readTitles() { return dataBucket.getTitles(); } @Override public EntitySet readData(MappingsRuntime mappingsRuntime, int batch_Read, IReadDataListener dataListener) throws Exception { return dataBucket.getNext(); } public static void main(String[] args) throws Exception { FileInputStream fileInputStream = new FileInputStream("F:/00-瀚潮/2. 项目/74. 远大/6. 开发/7. 测试/test.xlsx"); try { System.out.println("1"); OPCPackage excelPackage = OPCPackage.open(fileInputStream); try { System.out.println("2"); XSSFReader reader = new XSSFReader(excelPackage); StylesTable stylesTable = reader.getStylesTable(); SharedStringsTable sharedStrings = reader.getSharedStringsTable(); XSSFReader.SheetIterator iterator = (XSSFReader.SheetIterator) reader.getSheetsData(); DataBucket dataBucket = new DataBucket(5); InputStream sheetInputStream = iterator.next(); try { XMLReader sheetParser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); SheetHandler handler = new SheetHandler(sharedStrings, stylesTable, dataBucket, 1, 2); sheetParser.setContentHandler(handler); InputSource sheetSource = new InputSource(sheetInputStream); sheetParser.parse(sheetSource); } finally { sheetInputStream.close(); } } finally { excelPackage.close(); } } finally { fileInputStream.close(); } } @Override public void setMappingRuntime(MappingsRuntime mappingsRuntime) { // TODO Auto-generated method stub } @Override protected void close() { // TODO Auto-generated method stub } public int getBatchCount() { return batchCount; } public DataIO getDataIO() { return dataIO; } }