WriteContextImpl.java 18.2 KB
Newer Older
clevertension's avatar
clevertension 已提交
1 2
package com.alibaba.excel.context;

庄家钜's avatar
庄家钜 已提交
3
import java.io.File;
H
huaiyu 已提交
4
import java.io.FileOutputStream;
5
import java.io.OutputStream;
Z
zhuangjiaju 已提交
6
import java.util.Map;
庄家钜's avatar
庄家钜 已提交
7
import java.util.UUID;
clevertension's avatar
clevertension 已提交
8

庄家钜's avatar
庄家钜 已提交
9
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
H
huaiyu 已提交
10 11 12 13 14 15
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
clevertension's avatar
clevertension 已提交
16 17 18
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
19
import org.apache.poi.ss.usermodel.Workbook;
clevertension's avatar
clevertension 已提交
20
import org.apache.poi.ss.util.CellRangeAddress;
庄家钜's avatar
庄家钜 已提交
21
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
Z
zhuangjiaju 已提交
22 23
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
clevertension's avatar
clevertension 已提交
24

庄家钜's avatar
庄家钜 已提交
25
import com.alibaba.excel.enums.WriteTypeEnum;
Z
zhuangjiaju 已提交
26
import com.alibaba.excel.exception.ExcelGenerateException;
庄家钜's avatar
庄家钜 已提交
27
import com.alibaba.excel.metadata.CellData;
Z
zhuangjiaju 已提交
28
import com.alibaba.excel.metadata.Head;
29
import com.alibaba.excel.support.ExcelTypeEnum;
30
import com.alibaba.excel.util.DateUtils;
31
import com.alibaba.excel.util.FileUtils;
32
import com.alibaba.excel.util.NumberDataFormatterUtils;
33
import com.alibaba.excel.util.StringUtils;
clevertension's avatar
clevertension 已提交
34
import com.alibaba.excel.util.WorkBookUtil;
庄家钜's avatar
庄家钜 已提交
35
import com.alibaba.excel.util.WriteHandlerUtils;
36 37 38 39 40 41 42 43
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.WriteWorkbook;
import com.alibaba.excel.write.metadata.holder.WriteHolder;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.alibaba.excel.write.property.ExcelWriteHeadProperty;
clevertension's avatar
clevertension 已提交
44 45 46 47 48 49 50

/**
 * A context is the main anchorage point of a excel writer.
 *
 * @author jipengfei
 */
public class WriteContextImpl implements WriteContext {
Z
zhuangjiaju 已提交
51 52 53

    private static final Logger LOGGER = LoggerFactory.getLogger(WriteContextImpl.class);

clevertension's avatar
clevertension 已提交
54
    /**
Z
zhuangjiaju 已提交
55
     * The Workbook currently written
clevertension's avatar
clevertension 已提交
56
     */
57
    private WriteWorkbookHolder writeWorkbookHolder;
clevertension's avatar
clevertension 已提交
58
    /**
Z
zhuangjiaju 已提交
59
     * Current sheet holder
clevertension's avatar
clevertension 已提交
60
     */
61
    private WriteSheetHolder writeSheetHolder;
clevertension's avatar
clevertension 已提交
62
    /**
Z
zhuangjiaju 已提交
63
     * The table currently written
clevertension's avatar
clevertension 已提交
64
     */
65
    private WriteTableHolder writeTableHolder;
clevertension's avatar
clevertension 已提交
66
    /**
Z
zhuangjiaju 已提交
67
     * Configuration of currently operated cell
clevertension's avatar
clevertension 已提交
68
     */
69
    private WriteHolder currentWriteHolder;
70 71 72 73
    /**
     * Prevent multiple shutdowns
     */
    private boolean finished = false;
Z
zhuangjiaju 已提交
74

75 76
    public WriteContextImpl(WriteWorkbook writeWorkbook) {
        if (writeWorkbook == null) {
Z
zhuangjiaju 已提交
77 78
            throw new IllegalArgumentException("Workbook argument cannot be null");
        }
Z
zhuangjiaju 已提交
79 80 81
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Begin to Initialization 'WriteContextImpl'");
        }
82
        initCurrentWorkbookHolder(writeWorkbook);
庄家钜's avatar
庄家钜 已提交
83
        WriteHandlerUtils.beforeWorkbookCreate(this);
Z
zhuangjiaju 已提交
84
        try {
庄家钜's avatar
庄家钜 已提交
85
            WorkBookUtil.createWorkBook(writeWorkbookHolder);
Z
zhuangjiaju 已提交
86
        } catch (Exception e) {
Z
zhuangjiaju 已提交
87 88
            throw new ExcelGenerateException("Create workbook failure", e);
        }
庄家钜's avatar
庄家钜 已提交
89
        WriteHandlerUtils.afterWorkbookCreate(this);
Z
zhuangjiaju 已提交
90 91 92 93 94
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Initialization 'WriteContextImpl' complete");
        }
    }

95 96 97
    private void initCurrentWorkbookHolder(WriteWorkbook writeWorkbook) {
        writeWorkbookHolder = new WriteWorkbookHolder(writeWorkbook);
        currentWriteHolder = writeWorkbookHolder;
Z
zhuangjiaju 已提交
98
        if (LOGGER.isDebugEnabled()) {
99
            LOGGER.debug("CurrentConfiguration is writeWorkbookHolder");
Z
zhuangjiaju 已提交
100 101
        }
    }
clevertension's avatar
clevertension 已提交
102 103

    /**
104
     * @param writeSheet
clevertension's avatar
clevertension 已提交
105 106
     */
    @Override
庄家钜's avatar
庄家钜 已提交
107
    public void currentSheet(WriteSheet writeSheet, WriteTypeEnum writeType) {
108
        if (writeSheet == null) {
Z
zhuangjiaju 已提交
109 110
            throw new IllegalArgumentException("Sheet argument cannot be null");
        }
111
        if (selectSheetFromCache(writeSheet)) {
Z
zhuangjiaju 已提交
112
            return;
clevertension's avatar
clevertension 已提交
113
        }
114 115


116
        initCurrentSheetHolder(writeSheet);
117 118 119 120 121

        // Workbook handler need to supplementary execution
        WriteHandlerUtils.beforeWorkbookCreate(this, true);
        WriteHandlerUtils.afterWorkbookCreate(this, true);

Z
zhuangjiaju 已提交
122
        // Initialization current sheet
庄家钜's avatar
庄家钜 已提交
123
        initSheet(writeType);
Z
zhuangjiaju 已提交
124
    }
clevertension's avatar
clevertension 已提交
125

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
    private boolean selectSheetFromCache(WriteSheet writeSheet) {
        writeSheetHolder = null;
        if (writeSheet.getSheetNo() != null) {
            writeSheetHolder = writeWorkbookHolder.getHasBeenInitializedSheetIndexMap().get(writeSheet.getSheetNo());
        }
        if (writeSheetHolder == null && !StringUtils.isEmpty(writeSheet.getSheetName())) {
            writeSheetHolder = writeWorkbookHolder.getHasBeenInitializedSheetNameMap().get(writeSheet.getSheetName());
        }
        if (writeSheetHolder == null) {
            return false;
        }
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Sheet:{} is already existed", writeSheet.getSheetNo());
        }
        writeSheetHolder.setNewInitialization(Boolean.FALSE);
        writeTableHolder = null;
        currentWriteHolder = writeSheetHolder;
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("CurrentConfiguration is writeSheetHolder");
        }
        return true;
    }

149 150 151 152
    private void initCurrentSheetHolder(WriteSheet writeSheet) {
        writeSheetHolder = new WriteSheetHolder(writeSheet, writeWorkbookHolder);
        writeTableHolder = null;
        currentWriteHolder = writeSheetHolder;
Z
zhuangjiaju 已提交
153
        if (LOGGER.isDebugEnabled()) {
154
            LOGGER.debug("CurrentConfiguration is writeSheetHolder");
Z
zhuangjiaju 已提交
155
        }
clevertension's avatar
clevertension 已提交
156 157
    }

庄家钜's avatar
庄家钜 已提交
158
    private void initSheet(WriteTypeEnum writeType) {
159
        WriteHandlerUtils.beforeSheetCreate(this);
Z
zhuangjiaju 已提交
160 161
        Sheet currentSheet;
        try {
162 163 164 165 166 167 168 169 170
            if (writeSheetHolder.getSheetNo() != null) {
                currentSheet = writeWorkbookHolder.getWorkbook().getSheetAt(writeSheetHolder.getSheetNo());
                writeSheetHolder
                    .setCachedSheet(writeWorkbookHolder.getCachedWorkbook().getSheetAt(writeSheetHolder.getSheetNo()));
            } else {
                // sheet name must not null
                currentSheet = writeWorkbookHolder.getWorkbook().getSheet(writeSheetHolder.getSheetName());
                writeSheetHolder
                    .setCachedSheet(writeWorkbookHolder.getCachedWorkbook().getSheet(writeSheetHolder.getSheetName()));
Z
zhuangjiaju 已提交
171 172
            }
        } catch (Exception e) {
173 174 175 176
            currentSheet = createSheet();
        }
        if (currentSheet == null) {
            currentSheet = createSheet();
Z
zhuangjiaju 已提交
177
        }
178
        writeSheetHolder.setSheet(currentSheet);
庄家钜's avatar
庄家钜 已提交
179
        WriteHandlerUtils.afterSheetCreate(this);
庄家钜's avatar
庄家钜 已提交
180 181 182 183
        if (WriteTypeEnum.ADD.equals(writeType)) {
            // Initialization head
            initHead(writeSheetHolder.excelWriteHeadProperty());
        }
184 185
        writeWorkbookHolder.getHasBeenInitializedSheetIndexMap().put(writeSheetHolder.getSheetNo(), writeSheetHolder);
        writeWorkbookHolder.getHasBeenInitializedSheetNameMap().put(writeSheetHolder.getSheetName(), writeSheetHolder);
clevertension's avatar
clevertension 已提交
186 187
    }

188 189 190 191 192 193 194 195 196 197 198
    private Sheet createSheet() {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Can not find sheet:{} ,now create it", writeSheetHolder.getSheetNo());
        }
        if (StringUtils.isEmpty(writeSheetHolder.getSheetName())) {
            writeSheetHolder.setSheetName(writeSheetHolder.getSheetNo().toString());
        }
        Sheet currentSheet =
            WorkBookUtil.createSheet(writeWorkbookHolder.getWorkbook(), writeSheetHolder.getSheetName());
        writeSheetHolder.setCachedSheet(currentSheet);
        return currentSheet;
clevertension's avatar
clevertension 已提交
199 200
    }

201 202
    public void initHead(ExcelWriteHeadProperty excelWriteHeadProperty) {
        if (!currentWriteHolder.needHead() || !currentWriteHolder.excelWriteHeadProperty().hasHead()) {
Z
zhuangjiaju 已提交
203 204
            return;
        }
Z
zhuangjiaju 已提交
205 206
        int newRowIndex = writeSheetHolder.getNewRowIndexAndStartDoWrite();
        newRowIndex += currentWriteHolder.relativeHeadRowIndex();
Z
zhuangjiaju 已提交
207
        // Combined head
庄家钜's avatar
庄家钜 已提交
208 209 210
        if (currentWriteHolder.automaticMergeHead()) {
            addMergedRegionToCurrentSheet(excelWriteHeadProperty, newRowIndex);
        }
211 212
        for (int relativeRowIndex = 0, i = newRowIndex; i < excelWriteHeadProperty.getHeadRowNumber()
            + newRowIndex; i++, relativeRowIndex++) {
庄家钜's avatar
庄家钜 已提交
213
            WriteHandlerUtils.beforeRowCreate(this, newRowIndex, relativeRowIndex, Boolean.TRUE);
214
            Row row = WorkBookUtil.createRow(writeSheetHolder.getSheet(), i);
庄家钜's avatar
庄家钜 已提交
215
            WriteHandlerUtils.afterRowCreate(this, row, relativeRowIndex, Boolean.TRUE);
216
            addOneRowOfHeadDataToExcel(row, excelWriteHeadProperty.getHeadMap(), relativeRowIndex);
217
            WriteHandlerUtils.afterRowDispose(this, row, relativeRowIndex, Boolean.TRUE);
218 219 220
        }
    }

221 222
    private void addMergedRegionToCurrentSheet(ExcelWriteHeadProperty excelWriteHeadProperty, int rowIndex) {
        for (com.alibaba.excel.metadata.CellRange cellRangeModel : excelWriteHeadProperty.headCellRangeList()) {
庄家钜's avatar
庄家钜 已提交
223 224 225
            writeSheetHolder.getSheet()
                .addMergedRegionUnsafe(new CellRangeAddress(cellRangeModel.getFirstRow() + rowIndex,
                    cellRangeModel.getLastRow() + rowIndex, cellRangeModel.getFirstCol(), cellRangeModel.getLastCol()));
clevertension's avatar
clevertension 已提交
226 227 228
        }
    }

Z
zhuangjiaju 已提交
229 230 231
    private void addOneRowOfHeadDataToExcel(Row row, Map<Integer, Head> headMap, int relativeRowIndex) {
        for (Map.Entry<Integer, Head> entry : headMap.entrySet()) {
            Head head = entry.getValue();
庄家钜's avatar
庄家钜 已提交
232 233 234 235 236
            int columnIndex = entry.getKey();
            WriteHandlerUtils.beforeCellCreate(this, row, head, columnIndex, relativeRowIndex, Boolean.TRUE);
            Cell cell = row.createCell(columnIndex);
            WriteHandlerUtils.afterCellCreate(this, cell, head, relativeRowIndex, Boolean.TRUE);
            cell.setCellValue(head.getHeadNameList().get(relativeRowIndex));
237
            WriteHandlerUtils.afterCellDispose(this, (CellData) null, cell, head, relativeRowIndex, Boolean.TRUE);
clevertension's avatar
clevertension 已提交
238 239 240 241
        }
    }

    @Override
242 243
    public void currentTable(WriteTable writeTable) {
        if (writeTable == null) {
Z
zhuangjiaju 已提交
244 245
            return;
        }
246 247
        if (writeTable.getTableNo() == null || writeTable.getTableNo() <= 0) {
            writeTable.setTableNo(0);
Z
zhuangjiaju 已提交
248
        }
249
        if (writeSheetHolder.getHasBeenInitializedTable().containsKey(writeTable.getTableNo())) {
Z
zhuangjiaju 已提交
250
            if (LOGGER.isDebugEnabled()) {
251
                LOGGER.debug("Table:{} is already existed", writeTable.getTableNo());
Z
zhuangjiaju 已提交
252
            }
253 254 255
            writeTableHolder = writeSheetHolder.getHasBeenInitializedTable().get(writeTable.getTableNo());
            writeTableHolder.setNewInitialization(Boolean.FALSE);
            currentWriteHolder = writeTableHolder;
Z
zhuangjiaju 已提交
256
            if (LOGGER.isDebugEnabled()) {
257
                LOGGER.debug("CurrentConfiguration is writeTableHolder");
Z
zhuangjiaju 已提交
258
            }
Z
zhuangjiaju 已提交
259 260
            return;
        }
261

262
        initCurrentTableHolder(writeTable);
263 264 265 266 267 268 269

        // Workbook and sheet handler need to supplementary execution
        WriteHandlerUtils.beforeWorkbookCreate(this, true);
        WriteHandlerUtils.afterWorkbookCreate(this, true);
        WriteHandlerUtils.beforeSheetCreate(this, true);
        WriteHandlerUtils.afterSheetCreate(this, true);

270
        initHead(writeTableHolder.excelWriteHeadProperty());
Z
zhuangjiaju 已提交
271
    }
Z
zhuangjiaju 已提交
272

273 274 275 276
    private void initCurrentTableHolder(WriteTable writeTable) {
        writeTableHolder = new WriteTableHolder(writeTable, writeSheetHolder, writeWorkbookHolder);
        writeSheetHolder.getHasBeenInitializedTable().put(writeTable.getTableNo(), writeTableHolder);
        currentWriteHolder = writeTableHolder;
Z
zhuangjiaju 已提交
277
        if (LOGGER.isDebugEnabled()) {
278
            LOGGER.debug("CurrentConfiguration is writeTableHolder");
clevertension's avatar
clevertension 已提交
279 280 281
        }
    }

Z
zhuangjiaju 已提交
282
    @Override
283 284
    public WriteWorkbookHolder writeWorkbookHolder() {
        return writeWorkbookHolder;
clevertension's avatar
clevertension 已提交
285 286 287
    }

    @Override
288 289
    public WriteSheetHolder writeSheetHolder() {
        return writeSheetHolder;
clevertension's avatar
clevertension 已提交
290 291 292
    }

    @Override
293 294
    public WriteTableHolder writeTableHolder() {
        return writeTableHolder;
clevertension's avatar
clevertension 已提交
295 296 297
    }

    @Override
298 299
    public WriteHolder currentWriteHolder() {
        return currentWriteHolder;
clevertension's avatar
clevertension 已提交
300
    }
Z
zhuangjiaju 已提交
301 302

    @Override
303 304 305 306 307
    public void finish(boolean onException) {
        if (finished) {
            return;
        }
        finished = true;
庄家钜's avatar
庄家钜 已提交
308
        WriteHandlerUtils.afterWorkbookDispose(this);
309 310 311
        if (writeWorkbookHolder == null) {
            return;
        }
312
        Throwable throwable = null;
庄家钜's avatar
庄家钜 已提交
313
        boolean isOutputStreamEncrypt = false;
314 315 316 317 318 319 320 321 322 323 324 325
        // Determine if you need to write excel
        boolean writeExcel = !onException;
        if (writeWorkbookHolder.getWriteExcelOnException()) {
            writeExcel = Boolean.TRUE;
        }
        // No data is written if an exception is thrown
        if (writeExcel) {
            try {
                isOutputStreamEncrypt = doOutputStreamEncrypt07();
            } catch (Throwable t) {
                throwable = t;
            }
庄家钜's avatar
庄家钜 已提交
326
        }
庄家钜's avatar
庄家钜 已提交
327 328
        if (!isOutputStreamEncrypt) {
            try {
329 330 331
                if (writeExcel) {
                    writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream());
                }
庄家钜's avatar
庄家钜 已提交
332 333
                writeWorkbookHolder.getWorkbook().close();
            } catch (Throwable t) {
334
                throwable = t;
庄家钜's avatar
庄家钜 已提交
335 336
            }
        }
庄家钜's avatar
庄家钜 已提交
337 338 339
        try {
            Workbook workbook = writeWorkbookHolder.getWorkbook();
            if (workbook instanceof SXSSFWorkbook) {
340
                ((SXSSFWorkbook) workbook).dispose();
庄家钜's avatar
庄家钜 已提交
341 342
            }
        } catch (Throwable t) {
343
            throwable = t;
Z
zhuangjiaju 已提交
344 345
        }
        try {
罗成 已提交
346 347
            if (writeWorkbookHolder.getAutoCloseStream() && writeWorkbookHolder.getOutputStream() != null) {
                writeWorkbookHolder.getOutputStream().close();
Z
zhuangjiaju 已提交
348
            }
庄家钜's avatar
庄家钜 已提交
349
        } catch (Throwable t) {
350
            throwable = t;
Z
zhuangjiaju 已提交
351
        }
352
        if (writeExcel && !isOutputStreamEncrypt) {
庄家钜's avatar
庄家钜 已提交
353 354 355
            try {
                doFileEncrypt07();
            } catch (Throwable t) {
356
                throwable = t;
庄家钜's avatar
庄家钜 已提交
357 358
            }
        }
Z
zhuangjiaju 已提交
359
        try {
庄家钜's avatar
庄家钜 已提交
360 361
            if (writeWorkbookHolder.getTempTemplateInputStream() != null) {
                writeWorkbookHolder.getTempTemplateInputStream().close();
Z
zhuangjiaju 已提交
362
            }
庄家钜's avatar
庄家钜 已提交
363
        } catch (Throwable t) {
364
            throwable = t;
Z
zhuangjiaju 已提交
365
        }
庄家钜's avatar
庄家钜 已提交
366
        clearEncrypt03();
367
        removeThreadLocalCache();
368
        if (throwable != null) {
庄家钜's avatar
庄家钜 已提交
369
            throw new ExcelGenerateException("Can not close IO.", throwable);
370
        }
371 372 373
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Finished write.");
        }
Z
zhuangjiaju 已提交
374
    }
375

376 377 378 379 380
    private void removeThreadLocalCache() {
        NumberDataFormatterUtils.removeThreadLocalCache();
        DateUtils.removeThreadLocalCache();
    }

381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
    @Override
    public Sheet getCurrentSheet() {
        return writeSheetHolder.getSheet();
    }

    @Override
    public boolean needHead() {
        return writeSheetHolder.needHead();
    }

    @Override
    public OutputStream getOutputStream() {
        return writeWorkbookHolder.getOutputStream();
    }

    @Override
    public Workbook getWorkbook() {
        return writeWorkbookHolder.getWorkbook();
    }
H
huaiyu 已提交
400

庄家钜's avatar
庄家钜 已提交
401 402 403 404 405 406 407 408
    private void clearEncrypt03() {
        if (StringUtils.isEmpty(writeWorkbookHolder.getPassword())
            || !ExcelTypeEnum.XLS.equals(writeWorkbookHolder.getExcelType())) {
            return;
        }
        Biff8EncryptionKey.setCurrentUserPassword(null);
    }

H
huaiyu 已提交
409
    /**
庄家钜's avatar
庄家钜 已提交
410
     * To encrypt
H
huaiyu 已提交
411
     */
庄家钜's avatar
庄家钜 已提交
412 413 414 415 416 417 418 419 420 421
    private boolean doOutputStreamEncrypt07() throws Exception {
        if (StringUtils.isEmpty(writeWorkbookHolder.getPassword())
            || !ExcelTypeEnum.XLSX.equals(writeWorkbookHolder.getExcelType())) {
            return false;
        }
        if (writeWorkbookHolder.getFile() != null) {
            return false;
        }
        File tempXlsx = FileUtils.createTmpFile(UUID.randomUUID().toString() + ".xlsx");
        FileOutputStream tempFileOutputStream = new FileOutputStream(tempXlsx);
H
huaiyu 已提交
422
        try {
庄家钜's avatar
庄家钜 已提交
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
            writeWorkbookHolder.getWorkbook().write(tempFileOutputStream);
        } finally {
            try {
                writeWorkbookHolder.getWorkbook().close();
                tempFileOutputStream.close();
            } catch (Exception e) {
                if (!tempXlsx.delete()) {
                    throw new ExcelGenerateException("Can not delete temp File!");
                }
                throw e;
            }
        }
        POIFSFileSystem fileSystem = null;
        try {
            fileSystem = openFileSystemAndEncrypt(tempXlsx);
            fileSystem.writeFilesystem(writeWorkbookHolder.getOutputStream());
        } finally {
            if (fileSystem != null) {
                fileSystem.close();
            }
            if (!tempXlsx.delete()) {
                throw new ExcelGenerateException("Can not delete temp File!");
            }
        }
        return true;
    }

    /**
     * To encrypt
     */
    private void doFileEncrypt07() throws Exception {
        if (StringUtils.isEmpty(writeWorkbookHolder.getPassword())
            || !ExcelTypeEnum.XLSX.equals(writeWorkbookHolder.getExcelType())) {
            return;
        }
        if (writeWorkbookHolder.getFile() == null) {
            return;
        }
        FileOutputStream fileOutputStream = null;
        POIFSFileSystem fileSystem = null;
        try {
            fileSystem = openFileSystemAndEncrypt(writeWorkbookHolder.getFile());
            fileOutputStream = new FileOutputStream(writeWorkbookHolder.getFile());
            fileSystem.writeFilesystem(fileOutputStream);
        } finally {
            if (fileOutputStream != null) {
                fileOutputStream.close();
            }
            if (fileSystem != null) {
                fileSystem.close();
            }
        }
    }

    private POIFSFileSystem openFileSystemAndEncrypt(File file) throws Exception {
        POIFSFileSystem fileSystem = new POIFSFileSystem();
        Encryptor encryptor = new EncryptionInfo(EncryptionMode.standard).getEncryptor();
        encryptor.confirmPassword(writeWorkbookHolder.getPassword());
        OPCPackage opcPackage = null;
        try {
            opcPackage = OPCPackage.open(file, PackageAccess.READ_WRITE);
            OutputStream outputStream = encryptor.getDataStream(fileSystem);
            opcPackage.save(outputStream);
        } finally {
487 488 489
            if (opcPackage != null) {
                opcPackage.close();
            }
H
huaiyu 已提交
490
        }
庄家钜's avatar
庄家钜 已提交
491
        return fileSystem;
H
huaiyu 已提交
492
    }
clevertension's avatar
clevertension 已提交
493
}