diff --git a/src/main/java/com/alibaba/excel/ExcelWriter.java b/src/main/java/com/alibaba/excel/ExcelWriter.java index 65a99fe5..3a2dde55 100644 --- a/src/main/java/com/alibaba/excel/ExcelWriter.java +++ b/src/main/java/com/alibaba/excel/ExcelWriter.java @@ -331,4 +331,12 @@ public class ExcelWriter { public WriteContext writeContext() { return excelBuilder.writeContext(); } + + /** + * doEncrypt + * @param password + */ + public void doEncrypt(String password){ + excelBuilder.setPassword(password); + } } diff --git a/src/main/java/com/alibaba/excel/context/WriteContext.java b/src/main/java/com/alibaba/excel/context/WriteContext.java index e5613196..a5e6d585 100644 --- a/src/main/java/com/alibaba/excel/context/WriteContext.java +++ b/src/main/java/com/alibaba/excel/context/WriteContext.java @@ -69,6 +69,19 @@ public interface WriteContext { */ void finish(); + /** + * isEncrypt + * @return + */ + boolean isEncrypt(); + + /** + * setPassword + * @param password + * @return + */ + void setPassword(String password); + /** * Current sheet * diff --git a/src/main/java/com/alibaba/excel/context/WriteContextImpl.java b/src/main/java/com/alibaba/excel/context/WriteContextImpl.java index c71d08d7..8972424b 100644 --- a/src/main/java/com/alibaba/excel/context/WriteContextImpl.java +++ b/src/main/java/com/alibaba/excel/context/WriteContextImpl.java @@ -1,8 +1,16 @@ package com.alibaba.excel.context; +import com.alibaba.excel.util.StringUtils; +import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Map; +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; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -243,6 +251,12 @@ public class WriteContextImpl implements WriteContext { } try { writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream()); + if (isEncrypt()){ + LOGGER.debug("start encrypt"); + encrypt(writeWorkbookHolder); + LOGGER.debug("finish encrypt"); + + } writeWorkbookHolder.getWorkbook().close(); } catch (Throwable t) { throwCanNotCloseIo(t); @@ -274,6 +288,16 @@ public class WriteContextImpl implements WriteContext { } } + @Override + public boolean isEncrypt() { + return !StringUtils.isEmpty(writeWorkbookHolder.getPassword()); + } + + @Override + public void setPassword(String password) { + writeWorkbookHolder.setPassword(password); + } + private void throwCanNotCloseIo(Throwable t) { throw new ExcelGenerateException("Can not close IO", t); } @@ -297,4 +321,29 @@ public class WriteContextImpl implements WriteContext { public Workbook getWorkbook() { return writeWorkbookHolder.getWorkbook(); } + + /** + * do encrypt + * @param writeWorkbookHolder + */ + private void encrypt(WriteWorkbookHolder writeWorkbookHolder){ + try { + POIFSFileSystem fs = new POIFSFileSystem(); + EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard); + + Encryptor enc = info.getEncryptor(); + enc.confirmPassword(writeWorkbookHolder.getPassword()); + + OPCPackage opc = OPCPackage.open(writeWorkbookHolder.getFile(), PackageAccess.READ_WRITE); + OutputStream os = enc.getDataStream(fs); + opc.save(os); + opc.close(); + //write the encrypted file back to the stream + FileOutputStream fos = new FileOutputStream(writeWorkbookHolder.getFile()); + fs.writeFilesystem(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java b/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java index 3d8067a8..27f65905 100644 --- a/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java +++ b/src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java @@ -88,6 +88,11 @@ public class ExcelBuilderImpl implements ExcelBuilder { } } + @Override + public void setPassword(String password) { + context.setPassword(password); + } + @Override public void finish() { if (context != null) { diff --git a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java index 8a9e0c66..893d2180 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java @@ -148,6 +148,20 @@ public class ExcelWriterSheetBuilder { excelWriter.finish(); } + /** + * write with password + * @param data + * @param password + */ + public void doWrite(List data,String password) { + if (excelWriter == null) { + throw new ExcelGenerateException("Must use 'EasyExcelFactory.write().sheet()' to call this method"); + } + excelWriter.write(data, build()); + excelWriter.doEncrypt(password); + excelWriter.finish(); + } + public ExcelWriterTableBuilder table() { return table(null); } diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java index ec364fb9..931a4502 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java @@ -97,6 +97,11 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { */ private Map hasBeenInitializedSheet; + /** + * password + */ + private String password; + public WriteWorkbookHolder(WriteWorkbook writeWorkbook) { super(writeWorkbook, null, writeWorkbook.getConvertAllFiled()); this.writeWorkbook = writeWorkbook; diff --git a/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java b/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java index 76c3c716..a86f4e52 100644 --- a/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java @@ -58,6 +58,8 @@ public class WriteTest { ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); excelWriter.write(data(), writeSheet); + // doEncrypt 进行加密 + //excelWriter.doEncrypt("123456"); /// 千万别忘记finish 会帮忙关闭流 excelWriter.finish(); }