P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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;
    }
    
    
 
}