“mitao”
2026-01-20 4e5beb844f03daec12f2b039365730b0683f8a9e
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
package com.estate.expert.admin.io.processor;
 
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
/**
 * 数据处理器基础类
 * 
 * 用于处理Excel文件的读取和写入
 */
public abstract class DataProcessorBase <V> {
 
    protected abstract String[] getHeaders();
 
    public abstract String getName();
 
    protected abstract V parseSheet(XSSFSheet sheet);
 
    protected abstract void writeSheet(XSSFSheet sheet, V data);
 
    public V loadFromWorkbook(String filePath) throws IOException {
        return loadFromWorkbook(new FileInputStream(filePath));
    }
 
    public V loadFromWorkbook(InputStream inputStream) throws IOException {
        var workbook = new XSSFWorkbook(inputStream);
        var sheet = workbook.getSheetAt(0);
 
        return parseSheet(sheet);
    }
 
    public void saveWorkbook(OutputStream outputStream, V data) throws IOException {
        // 从输入流中创建工作簿
        var workbook = new XSSFWorkbook();
        var sheet = workbook.createSheet(getName());
 
        var headerRow = sheet.createRow(0);
        var headers = getHeaders();
        for (int i = 0; i < headers.length; i++) {
            headerRow.createCell(i).setCellValue(headers[i]);
        }
 
        writeSheet(sheet, data);
 
        // 调整列宽以适应内容
        for (int i = 0; i < headers.length; i++) {
            sheet.autoSizeColumn(i);
        }
 
        workbook.write(outputStream);
        workbook.close();
    }
}