ExcelBuilderImpl.java 4.3 KB
Newer Older
J
update  
jipengfei.jpf 已提交
1 2
package com.alibaba.excel.write;

clevertension's avatar
clevertension 已提交
3 4 5 6
import java.util.List;

import org.apache.poi.ss.util.CellRangeAddress;

7
import com.alibaba.excel.context.WriteContext;
clevertension's avatar
clevertension 已提交
8
import com.alibaba.excel.context.WriteContextImpl;
庄家钜's avatar
庄家钜 已提交
9
import com.alibaba.excel.enums.WriteTypeEnum;
10
import com.alibaba.excel.exception.ExcelGenerateException;
11
import com.alibaba.excel.util.FileUtils;
庄家钜's avatar
庄家钜 已提交
12 13
import com.alibaba.excel.write.executor.ExcelWriteAddExecutor;
import com.alibaba.excel.write.executor.ExcelWriteFillExecutor;
14 15 16
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.WriteWorkbook;
庄家钜's avatar
庄家钜 已提交
17
import com.alibaba.excel.write.metadata.fill.FillConfig;
18

J
update  
jipengfei.jpf 已提交
19 20 21
/**
 * @author jipengfei
 */
Z
zhuangjiaju 已提交
22
public class ExcelBuilderImpl implements ExcelBuilder {
Z
zhuangjiaju 已提交
23

24
    private WriteContext context;
庄家钜's avatar
庄家钜 已提交
25 26
    private ExcelWriteFillExecutor excelWriteFillExecutor;
    private ExcelWriteAddExecutor excelWriteAddExecutor;
Z
zhuangjiaju 已提交
27

28
    public ExcelBuilderImpl(WriteWorkbook writeWorkbook) {
29 30 31 32 33
        try {
            // Create temporary cache directory at initialization time to avoid POI concurrent write bugs
            FileUtils.createPoiFilesDirectory();
            context = new WriteContextImpl(writeWorkbook);
        } catch (RuntimeException e) {
34
            finishOnException();
35
            throw e;
Z
zhuangjiaju 已提交
36
        } catch (Throwable e) {
37
            finishOnException();
38 39
            throw new ExcelGenerateException(e);
        }
J
update  
jipengfei.jpf 已提交
40 41
    }

42
    @Override
43 44
    public void addContent(List data, WriteSheet writeSheet) {
        addContent(data, writeSheet, null);
J
update  
jipengfei.jpf 已提交
45 46
    }

47
    @Override
48
    public void addContent(List data, WriteSheet writeSheet, WriteTable writeTable) {
49
        try {
庄家钜's avatar
庄家钜 已提交
50 51 52 53
            if (data == null) {
                return;
            }
            context.currentSheet(writeSheet, WriteTypeEnum.ADD);
54
            context.currentTable(writeTable);
庄家钜's avatar
庄家钜 已提交
55 56 57 58
            if (excelWriteAddExecutor == null) {
                excelWriteAddExecutor = new ExcelWriteAddExecutor(context);
            }
            excelWriteAddExecutor.add(data);
59
        } catch (RuntimeException e) {
60
            finishOnException();
61
            throw e;
Z
zhuangjiaju 已提交
62
        } catch (Throwable e) {
63
            finishOnException();
64 65
            throw new ExcelGenerateException(e);
        }
J
update  
jipengfei.jpf 已提交
66 67
    }

庄家钜's avatar
庄家钜 已提交
68
    @Override
庄家钜's avatar
庄家钜 已提交
69
    public void fill(Object data, FillConfig fillConfig, WriteSheet writeSheet) {
庄家钜's avatar
庄家钜 已提交
70
        try {
庄家钜's avatar
庄家钜 已提交
71 72 73 74
            if (data == null) {
                return;
            }
            if (context.writeWorkbookHolder().getTempTemplateInputStream() == null) {
庄家钜's avatar
庄家钜 已提交
75 76
                throw new ExcelGenerateException("Calling the 'fill' method must use a template.");
            }
庄家钜's avatar
庄家钜 已提交
77 78 79 80 81
            context.currentSheet(writeSheet, WriteTypeEnum.FILL);
            if (excelWriteFillExecutor == null) {
                excelWriteFillExecutor = new ExcelWriteFillExecutor(context);
            }
            excelWriteFillExecutor.fill(data, fillConfig);
庄家钜's avatar
庄家钜 已提交
82
        } catch (RuntimeException e) {
83
            finishOnException();
庄家钜's avatar
庄家钜 已提交
84 85
            throw e;
        } catch (Throwable e) {
86
            finishOnException();
庄家钜's avatar
庄家钜 已提交
87 88 89 90
            throw new ExcelGenerateException(e);
        }
    }

91 92 93 94
    private void finishOnException() {
        finish(true);
    }

95
    @Override
96
    public void finish(boolean onException) {
Z
zhuangjiaju 已提交
97
        if (context != null) {
98
            context.finish(onException);
Z
zhuangjiaju 已提交
99
        }
100 101
    }

H
huaiyu 已提交
102 103 104
    @Override
    public void addContent(List data, WriteSheet writeSheet, WriteTable writeTable, String password) {
        try {
H
huaiyu 已提交
105 106 107 108
            if (data == null) {
                return;
            }
            context.currentSheet(writeSheet, WriteTypeEnum.ADD);
H
huaiyu 已提交
109
            context.currentTable(writeTable);
H
huaiyu 已提交
110 111 112 113
            if (excelWriteAddExecutor == null) {
                excelWriteAddExecutor = new ExcelWriteAddExecutor(context);
            }
            excelWriteAddExecutor.add(data);
H
huaiyu 已提交
114
        } catch (RuntimeException e) {
115
            finishOnException();
H
huaiyu 已提交
116 117
            throw e;
        } catch (Throwable e) {
118
            finishOnException();
H
huaiyu 已提交
119 120 121 122
            throw new ExcelGenerateException(e);
        }
    }

123
    @Override
Z
zhuangjiaju 已提交
124 125
    public void merge(int firstRow, int lastRow, int firstCol, int lastCol) {
        CellRangeAddress cra = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
126
        context.writeSheetHolder().getSheet().addMergedRegion(cra);
Z
zhuangjiaju 已提交
127 128
    }

129 130 131 132
    @Override
    public WriteContext writeContext() {
        return context;
    }
J
update  
jipengfei.jpf 已提交
133
}