Browse Source

新增写文件加密功能

developing
huaiyu 5 years ago
parent
commit
2fb107577b
  1. 8
      src/main/java/com/alibaba/excel/ExcelWriter.java
  2. 13
      src/main/java/com/alibaba/excel/context/WriteContext.java
  3. 49
      src/main/java/com/alibaba/excel/context/WriteContextImpl.java
  4. 5
      src/main/java/com/alibaba/excel/write/ExcelBuilderImpl.java
  5. 14
      src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java
  6. 5
      src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java
  7. 2
      src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

8
src/main/java/com/alibaba/excel/ExcelWriter.java

@ -331,4 +331,12 @@ public class ExcelWriter {
public WriteContext writeContext() { public WriteContext writeContext() {
return excelBuilder.writeContext(); return excelBuilder.writeContext();
} }
/**
* doEncrypt
* @param password
*/
public void doEncrypt(String password){
excelBuilder.setPassword(password);
}
} }

13
src/main/java/com/alibaba/excel/context/WriteContext.java

@ -69,6 +69,19 @@ public interface WriteContext {
*/ */
void finish(); void finish();
/**
* isEncrypt
* @return
*/
boolean isEncrypt();
/**
* setPassword
* @param password
* @return
*/
void setPassword(String password);
/** /**
* Current sheet * Current sheet
* *

49
src/main/java/com/alibaba/excel/context/WriteContextImpl.java

@ -1,8 +1,16 @@
package com.alibaba.excel.context; package com.alibaba.excel.context;
import com.alibaba.excel.util.StringUtils;
import java.io.FileOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Map; 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.Cell;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
@ -243,6 +251,12 @@ public class WriteContextImpl implements WriteContext {
} }
try { try {
writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream()); writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream());
if (isEncrypt()){
LOGGER.debug("start encrypt");
encrypt(writeWorkbookHolder);
LOGGER.debug("finish encrypt");
}
writeWorkbookHolder.getWorkbook().close(); writeWorkbookHolder.getWorkbook().close();
} catch (Throwable t) { } catch (Throwable t) {
throwCanNotCloseIo(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) { private void throwCanNotCloseIo(Throwable t) {
throw new ExcelGenerateException("Can not close IO", t); throw new ExcelGenerateException("Can not close IO", t);
} }
@ -297,4 +321,29 @@ public class WriteContextImpl implements WriteContext {
public Workbook getWorkbook() { public Workbook getWorkbook() {
return writeWorkbookHolder.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();
}
}
} }

5
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 @Override
public void finish() { public void finish() {
if (context != null) { if (context != null) {

14
src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java

@ -148,6 +148,20 @@ public class ExcelWriterSheetBuilder {
excelWriter.finish(); 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() { public ExcelWriterTableBuilder table() {
return table(null); return table(null);
} }

5
src/main/java/com/alibaba/excel/write/metadata/holder/WriteWorkbookHolder.java

@ -97,6 +97,11 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
*/ */
private Map<Integer, WriteSheetHolder> hasBeenInitializedSheet; private Map<Integer, WriteSheetHolder> hasBeenInitializedSheet;
/**
* password
*/
private String password;
public WriteWorkbookHolder(WriteWorkbook writeWorkbook) { public WriteWorkbookHolder(WriteWorkbook writeWorkbook) {
super(writeWorkbook, null, writeWorkbook.getConvertAllFiled()); super(writeWorkbook, null, writeWorkbook.getConvertAllFiled());
this.writeWorkbook = writeWorkbook; this.writeWorkbook = writeWorkbook;

2
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(); ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
excelWriter.write(data(), writeSheet); excelWriter.write(data(), writeSheet);
// doEncrypt 进行加密
//excelWriter.doEncrypt("123456");
/// 千万别忘记finish 会帮忙关闭流 /// 千万别忘记finish 会帮忙关闭流
excelWriter.finish(); excelWriter.finish();
} }

Loading…
Cancel
Save