P15GEN2\59518
2025-10-10 9f6890646993d16260d4201d613c092132856127
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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 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.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.Check;
import foundation.io.object.Titles;
import foundation.monitor.Progressor;
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(Progressor progressor, String ioBatchId, 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;
        }
 
        progressor.newPhase("解析Sheet[" + sheetName + "]");
        
        sheetParser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");    
        
        SheetHandler handler = new SheetHandler(progressor, ioBatchId, sharedStrings, stylesTable, dataBucket, titleRowNo, dataRowNo);
        sheetParser.setContentHandler(handler);
        sheetSource = new InputSource(sheetInputStream);
        
        sheetParser.parse(sheetSource);
        
        progressor.endPhase();
        
        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();
    }
 
    @Override
    public void setMappingRuntime(MappingsRuntime mappingsRuntime) {
        // TODO Auto-generated method stub
    }
 
    @Override
    public void setCheckList(List<Check> checkList) {
        // TODO Auto-generated method stub
    }
    
    @Override
    protected void close() {
        // TODO Auto-generated method stub
        
    }
 
    public int getBatchCount() {
        return batchCount;
    }
 
    public DataIO getDataIO() {
        return dataIO;
    }
}