WriteContextImpl.java 17.3 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 30 31
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.StringUtils;
clevertension's avatar
clevertension 已提交
32
import com.alibaba.excel.util.WorkBookUtil;
庄家钜's avatar
庄家钜 已提交
33
import com.alibaba.excel.util.WriteHandlerUtils;
34 35 36 37 38 39 40 41
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 已提交
42 43 44 45 46 47 48

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

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

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

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

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

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

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
    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;
    }

140 141 142 143
    private void initCurrentSheetHolder(WriteSheet writeSheet) {
        writeSheetHolder = new WriteSheetHolder(writeSheet, writeWorkbookHolder);
        writeTableHolder = null;
        currentWriteHolder = writeSheetHolder;
Z
zhuangjiaju 已提交
144
        if (LOGGER.isDebugEnabled()) {
145
            LOGGER.debug("CurrentConfiguration is writeSheetHolder");
Z
zhuangjiaju 已提交
146
        }
clevertension's avatar
clevertension 已提交
147 148
    }

庄家钜's avatar
庄家钜 已提交
149
    private void initSheet(WriteTypeEnum writeType) {
150
        WriteHandlerUtils.beforeSheetCreate(this);
Z
zhuangjiaju 已提交
151 152
        Sheet currentSheet;
        try {
153 154 155 156 157 158 159 160 161 162
            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 已提交
163 164
        } catch (Exception e) {
            if (LOGGER.isDebugEnabled()) {
165
                LOGGER.debug("Can not find sheet:{} ,now create it", writeSheetHolder.getSheetNo());
Z
zhuangjiaju 已提交
166
            }
167 168 169
            if (StringUtils.isEmpty(writeSheetHolder.getSheetName())) {
                writeSheetHolder.setSheetName(writeSheetHolder.getSheetNo().toString());
            }
170
            currentSheet = WorkBookUtil.createSheet(writeWorkbookHolder.getWorkbook(), writeSheetHolder.getSheetName());
庄家钜's avatar
庄家钜 已提交
171
            writeSheetHolder.setCachedSheet(currentSheet);
Z
zhuangjiaju 已提交
172
        }
173
        writeSheetHolder.setSheet(currentSheet);
庄家钜's avatar
庄家钜 已提交
174
        WriteHandlerUtils.afterSheetCreate(this);
庄家钜's avatar
庄家钜 已提交
175 176 177 178
        if (WriteTypeEnum.ADD.equals(writeType)) {
            // Initialization head
            initHead(writeSheetHolder.excelWriteHeadProperty());
        }
179 180
        writeWorkbookHolder.getHasBeenInitializedSheetIndexMap().put(writeSheetHolder.getSheetNo(), writeSheetHolder);
        writeWorkbookHolder.getHasBeenInitializedSheetNameMap().put(writeSheetHolder.getSheetName(), writeSheetHolder);
clevertension's avatar
clevertension 已提交
181 182
    }

183 184
    public void initHead(ExcelWriteHeadProperty excelWriteHeadProperty) {
        if (!currentWriteHolder.needHead() || !currentWriteHolder.excelWriteHeadProperty().hasHead()) {
Z
zhuangjiaju 已提交
185 186
            return;
        }
Z
zhuangjiaju 已提交
187 188
        int newRowIndex = writeSheetHolder.getNewRowIndexAndStartDoWrite();
        newRowIndex += currentWriteHolder.relativeHeadRowIndex();
Z
zhuangjiaju 已提交
189
        // Combined head
庄家钜's avatar
庄家钜 已提交
190 191 192
        if (currentWriteHolder.automaticMergeHead()) {
            addMergedRegionToCurrentSheet(excelWriteHeadProperty, newRowIndex);
        }
Z
zhuangjiaju 已提交
193
        for (int relativeRowIndex = 0, i = newRowIndex; i < excelWriteHeadProperty.getHeadRowNumber() + newRowIndex;
庄家钜's avatar
庄家钜 已提交
194
            i++, relativeRowIndex++) {
庄家钜's avatar
庄家钜 已提交
195
            WriteHandlerUtils.beforeRowCreate(this, newRowIndex, relativeRowIndex, Boolean.TRUE);
196
            Row row = WorkBookUtil.createRow(writeSheetHolder.getSheet(), i);
庄家钜's avatar
庄家钜 已提交
197
            WriteHandlerUtils.afterRowCreate(this, row, relativeRowIndex, Boolean.TRUE);
198
            addOneRowOfHeadDataToExcel(row, excelWriteHeadProperty.getHeadMap(), relativeRowIndex);
199
            WriteHandlerUtils.afterRowDispose(this, row, relativeRowIndex, Boolean.TRUE);
200 201 202
        }
    }

203 204
    private void addMergedRegionToCurrentSheet(ExcelWriteHeadProperty excelWriteHeadProperty, int rowIndex) {
        for (com.alibaba.excel.metadata.CellRange cellRangeModel : excelWriteHeadProperty.headCellRangeList()) {
庄家钜's avatar
庄家钜 已提交
205 206 207
            writeSheetHolder.getSheet()
                .addMergedRegionUnsafe(new CellRangeAddress(cellRangeModel.getFirstRow() + rowIndex,
                    cellRangeModel.getLastRow() + rowIndex, cellRangeModel.getFirstCol(), cellRangeModel.getLastCol()));
clevertension's avatar
clevertension 已提交
208 209 210
        }
    }

Z
zhuangjiaju 已提交
211 212 213
    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
庄家钜 已提交
214 215 216 217 218
            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));
219
            WriteHandlerUtils.afterCellDispose(this, (CellData)null, cell, head, relativeRowIndex, Boolean.TRUE);
clevertension's avatar
clevertension 已提交
220 221 222 223
        }
    }

    @Override
224 225
    public void currentTable(WriteTable writeTable) {
        if (writeTable == null) {
Z
zhuangjiaju 已提交
226 227
            return;
        }
228 229
        if (writeTable.getTableNo() == null || writeTable.getTableNo() <= 0) {
            writeTable.setTableNo(0);
Z
zhuangjiaju 已提交
230
        }
231
        if (writeSheetHolder.getHasBeenInitializedTable().containsKey(writeTable.getTableNo())) {
Z
zhuangjiaju 已提交
232
            if (LOGGER.isDebugEnabled()) {
233
                LOGGER.debug("Table:{} is already existed", writeTable.getTableNo());
Z
zhuangjiaju 已提交
234
            }
235 236 237
            writeTableHolder = writeSheetHolder.getHasBeenInitializedTable().get(writeTable.getTableNo());
            writeTableHolder.setNewInitialization(Boolean.FALSE);
            currentWriteHolder = writeTableHolder;
Z
zhuangjiaju 已提交
238
            if (LOGGER.isDebugEnabled()) {
239
                LOGGER.debug("CurrentConfiguration is writeTableHolder");
Z
zhuangjiaju 已提交
240
            }
Z
zhuangjiaju 已提交
241 242
            return;
        }
243 244
        initCurrentTableHolder(writeTable);
        initHead(writeTableHolder.excelWriteHeadProperty());
Z
zhuangjiaju 已提交
245
    }
Z
zhuangjiaju 已提交
246

247 248 249 250
    private void initCurrentTableHolder(WriteTable writeTable) {
        writeTableHolder = new WriteTableHolder(writeTable, writeSheetHolder, writeWorkbookHolder);
        writeSheetHolder.getHasBeenInitializedTable().put(writeTable.getTableNo(), writeTableHolder);
        currentWriteHolder = writeTableHolder;
Z
zhuangjiaju 已提交
251
        if (LOGGER.isDebugEnabled()) {
252
            LOGGER.debug("CurrentConfiguration is writeTableHolder");
clevertension's avatar
clevertension 已提交
253 254 255
        }
    }

Z
zhuangjiaju 已提交
256
    @Override
257 258
    public WriteWorkbookHolder writeWorkbookHolder() {
        return writeWorkbookHolder;
clevertension's avatar
clevertension 已提交
259 260 261
    }

    @Override
262 263
    public WriteSheetHolder writeSheetHolder() {
        return writeSheetHolder;
clevertension's avatar
clevertension 已提交
264 265 266
    }

    @Override
267 268
    public WriteTableHolder writeTableHolder() {
        return writeTableHolder;
clevertension's avatar
clevertension 已提交
269 270 271
    }

    @Override
272 273
    public WriteHolder currentWriteHolder() {
        return currentWriteHolder;
clevertension's avatar
clevertension 已提交
274
    }
Z
zhuangjiaju 已提交
275 276

    @Override
277 278 279 280 281
    public void finish(boolean onException) {
        if (finished) {
            return;
        }
        finished = true;
庄家钜's avatar
庄家钜 已提交
282
        WriteHandlerUtils.afterWorkbookDispose(this);
283 284 285
        if (writeWorkbookHolder == null) {
            return;
        }
286
        Throwable throwable = null;
庄家钜's avatar
庄家钜 已提交
287
        boolean isOutputStreamEncrypt = false;
288 289 290 291 292 293 294 295 296 297 298 299
        // 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
庄家钜 已提交
300
        }
庄家钜's avatar
庄家钜 已提交
301 302 303

        if (!isOutputStreamEncrypt) {
            try {
304 305 306
                if (writeExcel) {
                    writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream());
                }
庄家钜's avatar
庄家钜 已提交
307 308
                writeWorkbookHolder.getWorkbook().close();
            } catch (Throwable t) {
309
                throwable = t;
庄家钜's avatar
庄家钜 已提交
310 311 312
            }
        }

庄家钜's avatar
庄家钜 已提交
313 314 315
        try {
            Workbook workbook = writeWorkbookHolder.getWorkbook();
            if (workbook instanceof SXSSFWorkbook) {
庄家钜's avatar
庄家钜 已提交
316
                ((SXSSFWorkbook)workbook).dispose();
庄家钜's avatar
庄家钜 已提交
317 318
            }
        } catch (Throwable t) {
319
            throwable = t;
Z
zhuangjiaju 已提交
320
        }
庄家钜's avatar
庄家钜 已提交
321

Z
zhuangjiaju 已提交
322
        try {
罗成 已提交
323 324
            if (writeWorkbookHolder.getAutoCloseStream() && writeWorkbookHolder.getOutputStream() != null) {
                writeWorkbookHolder.getOutputStream().close();
Z
zhuangjiaju 已提交
325
            }
庄家钜's avatar
庄家钜 已提交
326
        } catch (Throwable t) {
327
            throwable = t;
Z
zhuangjiaju 已提交
328
        }
庄家钜's avatar
庄家钜 已提交
329

330
        if (writeExcel && !isOutputStreamEncrypt) {
庄家钜's avatar
庄家钜 已提交
331 332 333
            try {
                doFileEncrypt07();
            } catch (Throwable t) {
334
                throwable = t;
庄家钜's avatar
庄家钜 已提交
335 336 337
            }
        }

Z
zhuangjiaju 已提交
338
        try {
庄家钜's avatar
庄家钜 已提交
339 340
            if (writeWorkbookHolder.getTempTemplateInputStream() != null) {
                writeWorkbookHolder.getTempTemplateInputStream().close();
Z
zhuangjiaju 已提交
341
            }
庄家钜's avatar
庄家钜 已提交
342
        } catch (Throwable t) {
343
            throwable = t;
Z
zhuangjiaju 已提交
344
        }
庄家钜's avatar
庄家钜 已提交
345 346 347

        clearEncrypt03();

348
        if (throwable != null) {
庄家钜's avatar
庄家钜 已提交
349
            throw new ExcelGenerateException("Can not close IO.", throwable);
350 351
        }

352 353 354
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Finished write.");
        }
Z
zhuangjiaju 已提交
355
    }
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375

    @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 已提交
376

庄家钜's avatar
庄家钜 已提交
377 378 379 380 381 382 383 384
    private void clearEncrypt03() {
        if (StringUtils.isEmpty(writeWorkbookHolder.getPassword())
            || !ExcelTypeEnum.XLS.equals(writeWorkbookHolder.getExcelType())) {
            return;
        }
        Biff8EncryptionKey.setCurrentUserPassword(null);
    }

H
huaiyu 已提交
385
    /**
庄家钜's avatar
庄家钜 已提交
386
     * To encrypt
H
huaiyu 已提交
387
     */
庄家钜's avatar
庄家钜 已提交
388 389 390 391 392 393 394 395 396 397
    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 已提交
398
        try {
庄家钜's avatar
庄家钜 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 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
            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 {
463 464 465
            if (opcPackage != null) {
                opcPackage.close();
            }
H
huaiyu 已提交
466
        }
庄家钜's avatar
庄家钜 已提交
467
        return fileSystem;
H
huaiyu 已提交
468
    }
clevertension's avatar
clevertension 已提交
469
}