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<String, InputStream> 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;
|
}
|
|
|
|
}
|