支持导入、导出加密
This commit is contained in:
parent
ba1e407758
commit
44068c94f9
@ -21,7 +21,7 @@
|
|||||||
DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/demo/read/ReadTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java)
|
DEMO代码地址:[https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/demo/read/ReadTest.java](/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java)
|
||||||
* [最简单的读](#simpleRead)
|
* [最简单的读](#simpleRead)
|
||||||
* [指定列的下标或者列名](#indexOrNameRead)
|
* [指定列的下标或者列名](#indexOrNameRead)
|
||||||
* [读多个sheet](#repeatedRead)
|
* [读多个或者全部sheet](#repeatedRead)
|
||||||
* [日期、数字或者自定义格式转换](#converterRead)
|
* [日期、数字或者自定义格式转换](#converterRead)
|
||||||
* [多行头](#complexHeaderRead)
|
* [多行头](#complexHeaderRead)
|
||||||
* [同步的返回](#synchronousRead)
|
* [同步的返回](#synchronousRead)
|
||||||
@ -180,7 +180,7 @@ public class IndexOrNameData {
|
|||||||
##### 代码
|
##### 代码
|
||||||
```java
|
```java
|
||||||
/**
|
/**
|
||||||
* 读多个sheet,这里注意一个sheet不能读取多次,多次读取需要重新读取文件
|
* 读多个或者全部sheet,这里注意一个sheet不能读取多次,多次读取需要重新读取文件
|
||||||
* <p>
|
* <p>
|
||||||
* 1. 创建excel对应的实体对象 参照{@link DemoData}
|
* 1. 创建excel对应的实体对象 参照{@link DemoData}
|
||||||
* <p>
|
* <p>
|
||||||
@ -190,24 +190,21 @@ public class IndexOrNameData {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void repeatedRead() {
|
public void repeatedRead() {
|
||||||
// 方法1 如果 sheet1 sheet2 都是同一数据 监听器和头 都写到最外层
|
|
||||||
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
||||||
ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
|
// 读取全部sheet
|
||||||
ReadSheet readSheet1 = EasyExcel.readSheet(0).build();
|
// 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写
|
||||||
ReadSheet readSheet2 = EasyExcel.readSheet(1).build();
|
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();
|
||||||
excelReader.read(readSheet1);
|
|
||||||
excelReader.read(readSheet2);
|
|
||||||
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
|
||||||
excelReader.finish();
|
|
||||||
|
|
||||||
// 方法2 如果 sheet1 sheet2 数据不一致的话
|
// 读取部分sheet
|
||||||
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
||||||
excelReader = EasyExcel.read(fileName).build();
|
ExcelReader excelReader = EasyExcel.read(fileName).build();
|
||||||
// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
|
// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
|
||||||
readSheet1 = EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
ReadSheet readSheet1 =
|
||||||
readSheet2 = EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
||||||
excelReader.read(readSheet1);
|
ReadSheet readSheet2 =
|
||||||
excelReader.read(readSheet2);
|
EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
||||||
|
// 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能
|
||||||
|
excelReader.read(readSheet1, readSheet2);
|
||||||
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
||||||
excelReader.finish();
|
excelReader.finish();
|
||||||
}
|
}
|
||||||
@ -518,6 +515,11 @@ public class DemoData {
|
|||||||
private Date date;
|
private Date date;
|
||||||
@ExcelProperty("数字标题")
|
@ExcelProperty("数字标题")
|
||||||
private Double doubleData;
|
private Double doubleData;
|
||||||
|
/**
|
||||||
|
* 忽略这个字段
|
||||||
|
*/
|
||||||
|
@ExcelIgnore
|
||||||
|
private String ignore;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
##### 代码
|
##### 代码
|
||||||
|
@ -2,6 +2,7 @@ package com.alibaba.excel;
|
|||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -147,27 +148,41 @@ public class ExcelReader {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse all sheet content by default
|
* Parse all sheet content by default
|
||||||
|
*
|
||||||
|
* @deprecated lease use {@link #readAll()}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void read() {
|
public void read() {
|
||||||
ExcelReadExecutor excelReadExecutor = excelAnalyser.excelExecutor();
|
readAll();
|
||||||
if (excelReadExecutor.sheetList().isEmpty()) {
|
}
|
||||||
LOGGER.warn("Excel doesn't have any sheets.");
|
|
||||||
return;
|
/***
|
||||||
}
|
* Parse all sheet content by default
|
||||||
for (ReadSheet readSheet : excelReadExecutor.sheetList()) {
|
*/
|
||||||
read(readSheet);
|
public void readAll() {
|
||||||
}
|
checkFinished();
|
||||||
|
excelAnalyser.analysis(null, Boolean.TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse the specified sheet,SheetNo start from 1
|
* Parse the specified sheet,SheetNo start from 0
|
||||||
*
|
*
|
||||||
* @param readSheet
|
* @param readSheet
|
||||||
* Read sheet
|
* Read sheet
|
||||||
*/
|
*/
|
||||||
public ExcelReader read(ReadSheet readSheet) {
|
public ExcelReader read(ReadSheet... readSheet) {
|
||||||
|
return read(Arrays.asList(readSheet));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read multiple sheets.
|
||||||
|
*
|
||||||
|
* @param readSheetList
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ExcelReader read(List<ReadSheet> readSheetList) {
|
||||||
checkFinished();
|
checkFinished();
|
||||||
excelAnalyser.analysis(readSheet);
|
excelAnalyser.analysis(readSheetList, Boolean.FALSE);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,17 +138,7 @@ public class ExcelWriter {
|
|||||||
* @return this current writer
|
* @return this current writer
|
||||||
*/
|
*/
|
||||||
public ExcelWriter write(List data, WriteSheet writeSheet) {
|
public ExcelWriter write(List data, WriteSheet writeSheet) {
|
||||||
return write(data, writeSheet, (WriteTable)null);
|
return write(data, writeSheet, null);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ExcelWriter write(List data, WriteSheet writeSheet, String password) {
|
|
||||||
return write(data, writeSheet, null, password);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ExcelWriter write(List data, WriteSheet writeSheet, WriteTable writeTable, String password) {
|
|
||||||
excelBuilder.addContent(data, writeSheet, writeTable, password);
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.alibaba.excel.analysis;
|
package com.alibaba.excel.analysis;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.alibaba.excel.context.AnalysisContext;
|
import com.alibaba.excel.context.AnalysisContext;
|
||||||
import com.alibaba.excel.read.metadata.ReadSheet;
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
||||||
|
|
||||||
@ -10,12 +12,14 @@ import com.alibaba.excel.read.metadata.ReadSheet;
|
|||||||
*/
|
*/
|
||||||
public interface ExcelAnalyser {
|
public interface ExcelAnalyser {
|
||||||
/**
|
/**
|
||||||
* parse one sheet
|
* parse the sheet
|
||||||
*
|
*
|
||||||
* @param readSheet
|
* @param readSheetList
|
||||||
* sheet to read
|
* Which sheets you need to read.
|
||||||
|
* @param readAll
|
||||||
|
* The <code>readSheetList</code> parameter is ignored, and all sheets are read.
|
||||||
*/
|
*/
|
||||||
void analysis(ReadSheet readSheet);
|
void analysis(List<ReadSheet> readSheetList, Boolean readAll);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Complete the entire read file.Release the cache and close stream
|
* Complete the entire read file.Release the cache and close stream
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
package com.alibaba.excel.analysis;
|
package com.alibaba.excel.analysis;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
import org.apache.poi.poifs.crypt.Decryptor;
|
import org.apache.poi.poifs.crypt.Decryptor;
|
||||||
|
import org.apache.poi.poifs.crypt.EncryptionInfo;
|
||||||
import org.apache.poi.poifs.filesystem.DocumentFactoryHelper;
|
import org.apache.poi.poifs.filesystem.DocumentFactoryHelper;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
@ -19,7 +24,9 @@ import com.alibaba.excel.read.metadata.ReadSheet;
|
|||||||
import com.alibaba.excel.read.metadata.ReadWorkbook;
|
import com.alibaba.excel.read.metadata.ReadWorkbook;
|
||||||
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
||||||
import com.alibaba.excel.support.ExcelTypeEnum;
|
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||||
|
import com.alibaba.excel.util.CollectionUtils;
|
||||||
import com.alibaba.excel.util.FileUtils;
|
import com.alibaba.excel.util.FileUtils;
|
||||||
|
import com.alibaba.excel.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author jipengfei
|
* @author jipengfei
|
||||||
@ -64,7 +71,8 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
|
|||||||
InputStream decryptedStream = null;
|
InputStream decryptedStream = null;
|
||||||
try {
|
try {
|
||||||
decryptedStream =
|
decryptedStream =
|
||||||
DocumentFactoryHelper.getDecryptedStream(poifsFileSystem.getRoot().getFileSystem(), null);
|
DocumentFactoryHelper.getDecryptedStream(poifsFileSystem.getRoot().getFileSystem(),
|
||||||
|
analysisContext.readWorkbookHolder().getPassword());
|
||||||
excelReadExecutor = new XlsxSaxAnalyser(analysisContext, decryptedStream);
|
excelReadExecutor = new XlsxSaxAnalyser(analysisContext, decryptedStream);
|
||||||
return;
|
return;
|
||||||
} finally {
|
} finally {
|
||||||
@ -74,6 +82,9 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
|
|||||||
poifsFileSystem.close();
|
poifsFileSystem.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (analysisContext.readWorkbookHolder().getPassword() != null) {
|
||||||
|
Biff8EncryptionKey.setCurrentUserPassword(analysisContext.readWorkbookHolder().getPassword());
|
||||||
|
}
|
||||||
excelReadExecutor = new XlsSaxAnalyser(analysisContext, poifsFileSystem);
|
excelReadExecutor = new XlsSaxAnalyser(analysisContext, poifsFileSystem);
|
||||||
break;
|
break;
|
||||||
case XLSX:
|
case XLSX:
|
||||||
@ -84,17 +95,24 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void analysis(ReadSheet readSheet) {
|
public void analysis(List<ReadSheet> readSheetList, Boolean readAll) {
|
||||||
try {
|
try {
|
||||||
analysisContext.currentSheet(excelReadExecutor, readSheet);
|
if (!readAll && CollectionUtils.isEmpty(readSheetList)) {
|
||||||
|
throw new IllegalArgumentException("Specify at least one read sheet.");
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
excelReadExecutor.execute();
|
excelReadExecutor.execute(readSheetList, readAll);
|
||||||
} catch (ExcelAnalysisStopException e) {
|
} catch (ExcelAnalysisStopException e) {
|
||||||
if (LOGGER.isDebugEnabled()) {
|
if (LOGGER.isDebugEnabled()) {
|
||||||
LOGGER.debug("Custom stop!");
|
LOGGER.debug("Custom stop!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext);
|
// The last sheet is read
|
||||||
|
if (excelReadExecutor instanceof XlsSaxAnalyser) {
|
||||||
|
if (analysisContext.readSheetHolder() != null) {
|
||||||
|
analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
finish();
|
finish();
|
||||||
throw e;
|
throw e;
|
||||||
@ -110,6 +128,7 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder();
|
ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (readWorkbookHolder.getReadCache() != null) {
|
if (readWorkbookHolder.getReadCache() != null) {
|
||||||
readWorkbookHolder.getReadCache().destroy();
|
readWorkbookHolder.getReadCache().destroy();
|
||||||
@ -146,6 +165,16 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
|
|||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throwCanNotCloseIo(t);
|
throwCanNotCloseIo(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearEncrypt03();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearEncrypt03() {
|
||||||
|
if (StringUtils.isEmpty(analysisContext.readWorkbookHolder().getPassword())
|
||||||
|
|| !ExcelTypeEnum.XLS.equals(analysisContext.readWorkbookHolder().getExcelType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Biff8EncryptionKey.setCurrentUserPassword(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void throwCanNotCloseIo(Throwable t) {
|
private void throwCanNotCloseIo(Throwable t) {
|
||||||
|
@ -19,8 +19,12 @@ public interface ExcelReadExecutor {
|
|||||||
List<ReadSheet> sheetList();
|
List<ReadSheet> sheetList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read sheet
|
* Read the sheet.
|
||||||
|
*
|
||||||
|
* @param readSheetList
|
||||||
|
* Which sheets you need to read.
|
||||||
|
* @param readAll
|
||||||
|
* The <code>readSheetList</code> parameter is ignored, and all sheets are read.
|
||||||
*/
|
*/
|
||||||
void execute();
|
void execute(List<ReadSheet> readSheetList, Boolean readAll);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
|
|||||||
import org.apache.poi.hssf.eventusermodel.HSSFListener;
|
import org.apache.poi.hssf.eventusermodel.HSSFListener;
|
||||||
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
|
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
|
||||||
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
|
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
|
||||||
import org.apache.poi.hssf.record.BoundSheetRecord;
|
|
||||||
import org.apache.poi.hssf.record.Record;
|
import org.apache.poi.hssf.record.Record;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
|
|
||||||
@ -27,13 +26,14 @@ import com.alibaba.excel.read.metadata.ReadSheet;
|
|||||||
public class XlsListSheetListener implements HSSFListener {
|
public class XlsListSheetListener implements HSSFListener {
|
||||||
private POIFSFileSystem poifsFileSystem;
|
private POIFSFileSystem poifsFileSystem;
|
||||||
private List<ReadSheet> sheetList;
|
private List<ReadSheet> sheetList;
|
||||||
private XlsRecordHandler bofRecordHandler;
|
private BofRecordHandler bofRecordHandler;
|
||||||
|
|
||||||
public XlsListSheetListener(AnalysisContext analysisContext, POIFSFileSystem poifsFileSystem) {
|
public XlsListSheetListener(AnalysisContext analysisContext, POIFSFileSystem poifsFileSystem) {
|
||||||
this.poifsFileSystem = poifsFileSystem;
|
this.poifsFileSystem = poifsFileSystem;
|
||||||
sheetList = new ArrayList<ReadSheet>();
|
sheetList = new ArrayList<ReadSheet>();
|
||||||
bofRecordHandler = new BofRecordHandler(analysisContext, sheetList, false);
|
bofRecordHandler = new BofRecordHandler(analysisContext, sheetList, false, false);
|
||||||
bofRecordHandler.init();
|
bofRecordHandler.init();
|
||||||
|
bofRecordHandler.init(null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -60,6 +60,8 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
|
|||||||
private static final Logger LOGGER = LoggerFactory.getLogger(XlsSaxAnalyser.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(XlsSaxAnalyser.class);
|
||||||
|
|
||||||
private POIFSFileSystem poifsFileSystem;
|
private POIFSFileSystem poifsFileSystem;
|
||||||
|
private Boolean readAll;
|
||||||
|
private List<ReadSheet> readSheetList;
|
||||||
private int lastRowNumber;
|
private int lastRowNumber;
|
||||||
private int lastColumnNumber;
|
private int lastColumnNumber;
|
||||||
/**
|
/**
|
||||||
@ -91,7 +93,9 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute(List<ReadSheet> readSheetList, Boolean readAll) {
|
||||||
|
this.readAll = readAll;
|
||||||
|
this.readSheetList = readSheetList;
|
||||||
MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
|
MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);
|
||||||
formatListener = new FormatTrackingHSSFListener(listener);
|
formatListener = new FormatTrackingHSSFListener(listener);
|
||||||
workbookBuildingListener = new EventWorkbookBuilder.SheetRecordCollectingListener(formatListener);
|
workbookBuildingListener = new EventWorkbookBuilder.SheetRecordCollectingListener(formatListener);
|
||||||
@ -195,9 +199,9 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
|
|||||||
// The table has been counted and there are no duplicate statistics
|
// The table has been counted and there are no duplicate statistics
|
||||||
if (sheets == null) {
|
if (sheets == null) {
|
||||||
sheets = new ArrayList<ReadSheet>();
|
sheets = new ArrayList<ReadSheet>();
|
||||||
recordHandlers.add(new BofRecordHandler(analysisContext, sheets, false));
|
recordHandlers.add(new BofRecordHandler(analysisContext, sheets, false, true));
|
||||||
} else {
|
} else {
|
||||||
recordHandlers.add(new BofRecordHandler(analysisContext, sheets, true));
|
recordHandlers.add(new BofRecordHandler(analysisContext, sheets, true, true));
|
||||||
}
|
}
|
||||||
recordHandlers.add(new FormulaRecordHandler(stubWorkbook, formatListener));
|
recordHandlers.add(new FormulaRecordHandler(stubWorkbook, formatListener));
|
||||||
recordHandlers.add(new LabelRecordHandler());
|
recordHandlers.add(new LabelRecordHandler());
|
||||||
@ -211,6 +215,10 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
|
|||||||
|
|
||||||
for (XlsRecordHandler x : recordHandlers) {
|
for (XlsRecordHandler x : recordHandlers) {
|
||||||
x.init();
|
x.init();
|
||||||
|
if (x instanceof BofRecordHandler) {
|
||||||
|
BofRecordHandler bofRecordHandler = (BofRecordHandler)x;
|
||||||
|
bofRecordHandler.init(readSheetList, readAll);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import org.apache.poi.hssf.record.Record;
|
|||||||
import com.alibaba.excel.analysis.v03.AbstractXlsRecordHandler;
|
import com.alibaba.excel.analysis.v03.AbstractXlsRecordHandler;
|
||||||
import com.alibaba.excel.context.AnalysisContext;
|
import com.alibaba.excel.context.AnalysisContext;
|
||||||
import com.alibaba.excel.read.metadata.ReadSheet;
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
||||||
|
import com.alibaba.excel.util.SheetUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Record handler
|
* Record handler
|
||||||
@ -21,13 +22,18 @@ public class BofRecordHandler extends AbstractXlsRecordHandler {
|
|||||||
private BoundSheetRecord[] orderedBsrs;
|
private BoundSheetRecord[] orderedBsrs;
|
||||||
private int sheetIndex;
|
private int sheetIndex;
|
||||||
private List<ReadSheet> sheets;
|
private List<ReadSheet> sheets;
|
||||||
|
private Boolean readAll;
|
||||||
|
private List<ReadSheet> readSheetList;
|
||||||
private AnalysisContext context;
|
private AnalysisContext context;
|
||||||
private boolean alreadyInit;
|
private boolean alreadyInit;
|
||||||
|
private boolean needInitSheet;
|
||||||
|
|
||||||
public BofRecordHandler(AnalysisContext context, List<ReadSheet> sheets, boolean alreadyInit) {
|
public BofRecordHandler(AnalysisContext context, List<ReadSheet> sheets, boolean alreadyInit,
|
||||||
|
boolean needInitSheet) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.sheets = sheets;
|
this.sheets = sheets;
|
||||||
this.alreadyInit = alreadyInit;
|
this.alreadyInit = alreadyInit;
|
||||||
|
this.needInitSheet = needInitSheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -45,15 +51,34 @@ public class BofRecordHandler extends AbstractXlsRecordHandler {
|
|||||||
if (orderedBsrs == null) {
|
if (orderedBsrs == null) {
|
||||||
orderedBsrs = BoundSheetRecord.orderByBofPosition(boundSheetRecords);
|
orderedBsrs = BoundSheetRecord.orderByBofPosition(boundSheetRecords);
|
||||||
}
|
}
|
||||||
|
String sheetName = orderedBsrs[sheetIndex].getSheetname();
|
||||||
|
// Find the currently read sheet
|
||||||
|
ReadSheet readSheet = null;
|
||||||
if (!alreadyInit) {
|
if (!alreadyInit) {
|
||||||
ReadSheet readSheet = new ReadSheet(sheetIndex, orderedBsrs[sheetIndex].getSheetname());
|
readSheet = new ReadSheet(sheetIndex, sheetName);
|
||||||
sheets.add(readSheet);
|
sheets.add(readSheet);
|
||||||
}
|
}
|
||||||
if (context.readSheetHolder() != null) {
|
if (needInitSheet) {
|
||||||
if (sheetIndex == context.readSheetHolder().getSheetNo()) {
|
if (readSheet == null) {
|
||||||
|
for (ReadSheet sheet : sheets) {
|
||||||
|
if (sheet.getSheetNo() == sheetIndex) {
|
||||||
|
readSheet = sheet;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert readSheet != null : "Can't find the sheet.";
|
||||||
|
context.readWorkbookHolder().setIgnoreRecord03(Boolean.TRUE);
|
||||||
|
// Copy the parameter to the current sheet
|
||||||
|
readSheet = SheetUtils.match(readSheet, readSheetList, readAll,
|
||||||
|
context.readWorkbookHolder().getGlobalConfiguration());
|
||||||
|
if (readSheet != null) {
|
||||||
|
if (readSheet.getSheetNo() != 0) {
|
||||||
|
// Prompt for the end of the previous form read
|
||||||
|
context.readSheetHolder().notifyAfterAllAnalysed(context);
|
||||||
|
}
|
||||||
|
context.currentSheet(readSheet);
|
||||||
context.readWorkbookHolder().setIgnoreRecord03(Boolean.FALSE);
|
context.readWorkbookHolder().setIgnoreRecord03(Boolean.FALSE);
|
||||||
} else {
|
|
||||||
context.readWorkbookHolder().setIgnoreRecord03(Boolean.TRUE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sheetIndex++;
|
sheetIndex++;
|
||||||
@ -71,6 +96,11 @@ public class BofRecordHandler extends AbstractXlsRecordHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void init(List<ReadSheet> readSheetList, Boolean readAll) {
|
||||||
|
this.readSheetList = readSheetList;
|
||||||
|
this.readAll = readAll;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getOrder() {
|
public int getOrder() {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -15,6 +15,7 @@ import javax.xml.parsers.SAXParserFactory;
|
|||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.openxml4j.opc.PackageAccess;
|
import org.apache.poi.openxml4j.opc.PackageAccess;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.xssf.eventusermodel.XSSFReader;
|
import org.apache.poi.xssf.eventusermodel.XSSFReader;
|
||||||
import org.apache.poi.xssf.model.StylesTable;
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
@ -33,6 +34,8 @@ import com.alibaba.excel.read.metadata.ReadSheet;
|
|||||||
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
||||||
import com.alibaba.excel.util.CollectionUtils;
|
import com.alibaba.excel.util.CollectionUtils;
|
||||||
import com.alibaba.excel.util.FileUtils;
|
import com.alibaba.excel.util.FileUtils;
|
||||||
|
import com.alibaba.excel.util.SheetUtils;
|
||||||
|
import com.alibaba.excel.util.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -172,9 +175,16 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute() {
|
public void execute(List<ReadSheet> readSheetList, Boolean readAll) {
|
||||||
parseXmlSource(sheetMap.get(analysisContext.readSheetHolder().getSheetNo()),
|
for (ReadSheet readSheet : sheetList) {
|
||||||
new XlsxRowHandler(analysisContext, stylesTable));
|
readSheet = SheetUtils.match(readSheet, readSheetList, readAll,
|
||||||
|
analysisContext.readWorkbookHolder().getGlobalConfiguration());
|
||||||
|
if (readSheet != null) {
|
||||||
|
analysisContext.currentSheet(readSheet);
|
||||||
|
parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(analysisContext, stylesTable));
|
||||||
|
// The last sheet is read
|
||||||
|
analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.alibaba.excel.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Inherited;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore all unannotated fields.
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Inherited
|
||||||
|
public @interface ExcelIgnoreUnannotated {
|
||||||
|
}
|
@ -22,12 +22,10 @@ public interface AnalysisContext {
|
|||||||
/**
|
/**
|
||||||
* Select the current table
|
* Select the current table
|
||||||
*
|
*
|
||||||
* @param excelReadExecutor
|
|
||||||
* Excel file Executor
|
|
||||||
* @param readSheet
|
* @param readSheet
|
||||||
* sheet to read
|
* sheet to read
|
||||||
*/
|
*/
|
||||||
void currentSheet(ExcelReadExecutor excelReadExecutor, ReadSheet readSheet);
|
void currentSheet(ReadSheet readSheet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All information about the workbook you are currently working on
|
* All information about the workbook you are currently working on
|
||||||
|
@ -5,8 +5,6 @@ import java.io.InputStream;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.alibaba.excel.analysis.ExcelReadExecutor;
|
|
||||||
import com.alibaba.excel.analysis.v07.XlsxSaxAnalyser;
|
|
||||||
import com.alibaba.excel.exception.ExcelAnalysisException;
|
import com.alibaba.excel.exception.ExcelAnalysisException;
|
||||||
import com.alibaba.excel.metadata.Sheet;
|
import com.alibaba.excel.metadata.Sheet;
|
||||||
import com.alibaba.excel.read.metadata.ReadSheet;
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
||||||
@ -16,7 +14,6 @@ import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
|
|||||||
import com.alibaba.excel.read.metadata.holder.ReadSheetHolder;
|
import com.alibaba.excel.read.metadata.holder.ReadSheetHolder;
|
||||||
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder;
|
||||||
import com.alibaba.excel.support.ExcelTypeEnum;
|
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||||
import com.alibaba.excel.util.StringUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -53,13 +50,9 @@ public class AnalysisContextImpl implements AnalysisContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void currentSheet(ExcelReadExecutor excelReadExecutor, ReadSheet readSheet) {
|
public void currentSheet(ReadSheet readSheet) {
|
||||||
if (readSheet == null) {
|
|
||||||
throw new IllegalArgumentException("Sheet argument cannot be null.");
|
|
||||||
}
|
|
||||||
readSheetHolder = new ReadSheetHolder(readSheet, readWorkbookHolder);
|
readSheetHolder = new ReadSheetHolder(readSheet, readWorkbookHolder);
|
||||||
currentReadHolder = readSheetHolder;
|
currentReadHolder = readSheetHolder;
|
||||||
selectSheet(excelReadExecutor);
|
|
||||||
if (readWorkbookHolder.getHasReadSheet().contains(readSheetHolder.getSheetNo())) {
|
if (readWorkbookHolder.getHasReadSheet().contains(readSheetHolder.getSheetNo())) {
|
||||||
throw new ExcelAnalysisException("Cannot read sheet repeatedly.");
|
throw new ExcelAnalysisException("Cannot read sheet repeatedly.");
|
||||||
}
|
}
|
||||||
@ -69,54 +62,6 @@ public class AnalysisContextImpl implements AnalysisContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void selectSheet(ExcelReadExecutor excelReadExecutor) {
|
|
||||||
if (excelReadExecutor instanceof XlsxSaxAnalyser) {
|
|
||||||
selectSheet07(excelReadExecutor);
|
|
||||||
} else {
|
|
||||||
selectSheet03();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void selectSheet03() {
|
|
||||||
if (readSheetHolder.getSheetNo() != null && readSheetHolder.getSheetNo() >= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!StringUtils.isEmpty(readSheetHolder.getSheetName())) {
|
|
||||||
LOGGER.warn("Excel 2003 does not support matching sheets by name, defaults to the first one.");
|
|
||||||
}
|
|
||||||
readSheetHolder.setSheetNo(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void selectSheet07(ExcelReadExecutor excelReadExecutor) {
|
|
||||||
if (readSheetHolder.getSheetNo() != null && readSheetHolder.getSheetNo() >= 0) {
|
|
||||||
for (ReadSheet readSheetExcel : excelReadExecutor.sheetList()) {
|
|
||||||
if (readSheetExcel.getSheetNo().equals(readSheetHolder.getSheetNo())) {
|
|
||||||
readSheetHolder.setSheetName(readSheetExcel.getSheetName());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new ExcelAnalysisException("Can not find sheet:" + readSheetHolder.getSheetNo());
|
|
||||||
}
|
|
||||||
if (!StringUtils.isEmpty(readSheetHolder.getSheetName())) {
|
|
||||||
for (ReadSheet readSheetExcel : excelReadExecutor.sheetList()) {
|
|
||||||
String sheetName = readSheetExcel.getSheetName();
|
|
||||||
if (sheetName == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (readSheetHolder.globalConfiguration().getAutoTrim()) {
|
|
||||||
sheetName = sheetName.trim();
|
|
||||||
}
|
|
||||||
if (sheetName.equals(readSheetHolder.getSheetName())) {
|
|
||||||
readSheetHolder.setSheetNo(readSheetExcel.getSheetNo());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ReadSheet readSheetExcel = excelReadExecutor.sheetList().get(0);
|
|
||||||
readSheetHolder.setSheetNo(readSheetExcel.getSheetNo());
|
|
||||||
readSheetHolder.setSheetName(readSheetExcel.getSheetName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ReadWorkbookHolder readWorkbookHolder() {
|
public ReadWorkbookHolder readWorkbookHolder() {
|
||||||
return readWorkbookHolder;
|
return readWorkbookHolder;
|
||||||
|
@ -69,18 +69,6 @@ public interface WriteContext {
|
|||||||
*/
|
*/
|
||||||
void finish();
|
void finish();
|
||||||
|
|
||||||
/**
|
|
||||||
* isEncrypt
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
boolean isEncrypt();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setPassword
|
|
||||||
* @param password
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
void setPassword(String password);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current sheet
|
* Current sheet
|
||||||
|
@ -1,15 +1,27 @@
|
|||||||
package com.alibaba.excel.context;
|
package com.alibaba.excel.context;
|
||||||
|
|
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||||
|
import com.alibaba.excel.util.FileUtils;
|
||||||
import com.alibaba.excel.util.StringUtils;
|
import com.alibaba.excel.util.StringUtils;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.openxml4j.opc.PackageAccess;
|
import org.apache.poi.openxml4j.opc.PackageAccess;
|
||||||
|
import org.apache.poi.poifs.crypt.Decryptor;
|
||||||
import org.apache.poi.poifs.crypt.EncryptionInfo;
|
import org.apache.poi.poifs.crypt.EncryptionInfo;
|
||||||
import org.apache.poi.poifs.crypt.EncryptionMode;
|
import org.apache.poi.poifs.crypt.EncryptionMode;
|
||||||
import org.apache.poi.poifs.crypt.Encryptor;
|
import org.apache.poi.poifs.crypt.Encryptor;
|
||||||
|
import org.apache.poi.poifs.filesystem.DocumentOutputStream;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
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;
|
||||||
@ -120,7 +132,6 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
WriteHandlerUtils.beforeSheetCreate(this);
|
WriteHandlerUtils.beforeSheetCreate(this);
|
||||||
// Initialization current sheet
|
// Initialization current sheet
|
||||||
initSheet(writeType);
|
initSheet(writeType);
|
||||||
WriteHandlerUtils.afterSheetCreate(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initCurrentSheetHolder(WriteSheet writeSheet) {
|
private void initCurrentSheetHolder(WriteSheet writeSheet) {
|
||||||
@ -147,6 +158,7 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
writeSheetHolder.setCachedSheet(currentSheet);
|
writeSheetHolder.setCachedSheet(currentSheet);
|
||||||
}
|
}
|
||||||
writeSheetHolder.setSheet(currentSheet);
|
writeSheetHolder.setSheet(currentSheet);
|
||||||
|
WriteHandlerUtils.afterSheetCreate(this);
|
||||||
if (WriteTypeEnum.ADD.equals(writeType)) {
|
if (WriteTypeEnum.ADD.equals(writeType)) {
|
||||||
// Initialization head
|
// Initialization head
|
||||||
initHead(writeSheetHolder.excelWriteHeadProperty());
|
initHead(writeSheetHolder.excelWriteHeadProperty());
|
||||||
@ -249,18 +261,23 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
if (writeWorkbookHolder == null) {
|
if (writeWorkbookHolder == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream());
|
|
||||||
if (isEncrypt()){
|
|
||||||
LOGGER.debug("start encrypt");
|
|
||||||
encrypt(writeWorkbookHolder);
|
|
||||||
LOGGER.debug("finish encrypt");
|
|
||||||
|
|
||||||
}
|
boolean isOutputStreamEncrypt = false;
|
||||||
writeWorkbookHolder.getWorkbook().close();
|
try {
|
||||||
|
isOutputStreamEncrypt = doOutputStreamEncrypt07();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throwCanNotCloseIo(t);
|
throwCanNotCloseIo(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isOutputStreamEncrypt) {
|
||||||
|
try {
|
||||||
|
writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream());
|
||||||
|
writeWorkbookHolder.getWorkbook().close();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
throwCanNotCloseIo(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Workbook workbook = writeWorkbookHolder.getWorkbook();
|
Workbook workbook = writeWorkbookHolder.getWorkbook();
|
||||||
if (workbook instanceof SXSSFWorkbook) {
|
if (workbook instanceof SXSSFWorkbook) {
|
||||||
@ -269,6 +286,7 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throwCanNotCloseIo(t);
|
throwCanNotCloseIo(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (writeWorkbookHolder.getAutoCloseStream() && writeWorkbookHolder.getOutputStream() != null) {
|
if (writeWorkbookHolder.getAutoCloseStream() && writeWorkbookHolder.getOutputStream() != null) {
|
||||||
writeWorkbookHolder.getOutputStream().close();
|
writeWorkbookHolder.getOutputStream().close();
|
||||||
@ -276,6 +294,15 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throwCanNotCloseIo(t);
|
throwCanNotCloseIo(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isOutputStreamEncrypt) {
|
||||||
|
try {
|
||||||
|
doFileEncrypt07();
|
||||||
|
} catch (Throwable t) {
|
||||||
|
throwCanNotCloseIo(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (writeWorkbookHolder.getTempTemplateInputStream() != null) {
|
if (writeWorkbookHolder.getTempTemplateInputStream() != null) {
|
||||||
writeWorkbookHolder.getTempTemplateInputStream().close();
|
writeWorkbookHolder.getTempTemplateInputStream().close();
|
||||||
@ -283,21 +310,14 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throwCanNotCloseIo(t);
|
throwCanNotCloseIo(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearEncrypt03();
|
||||||
|
|
||||||
if (LOGGER.isDebugEnabled()) {
|
if (LOGGER.isDebugEnabled()) {
|
||||||
LOGGER.debug("Finished write.");
|
LOGGER.debug("Finished write.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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);
|
||||||
}
|
}
|
||||||
@ -322,28 +342,94 @@ public class WriteContextImpl implements WriteContext {
|
|||||||
return writeWorkbookHolder.getWorkbook();
|
return writeWorkbookHolder.getWorkbook();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void clearEncrypt03() {
|
||||||
|
if (StringUtils.isEmpty(writeWorkbookHolder.getPassword())
|
||||||
|
|| !ExcelTypeEnum.XLS.equals(writeWorkbookHolder.getExcelType())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Biff8EncryptionKey.setCurrentUserPassword(null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* do encrypt
|
* To encrypt
|
||||||
* @param writeWorkbookHolder
|
|
||||||
*/
|
*/
|
||||||
private void encrypt(WriteWorkbookHolder writeWorkbookHolder){
|
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);
|
||||||
try {
|
try {
|
||||||
POIFSFileSystem fs = new POIFSFileSystem();
|
writeWorkbookHolder.getWorkbook().write(tempFileOutputStream);
|
||||||
EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);
|
} 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;
|
||||||
|
}
|
||||||
|
|
||||||
Encryptor enc = info.getEncryptor();
|
/**
|
||||||
enc.confirmPassword(writeWorkbookHolder.getPassword());
|
* To encrypt
|
||||||
|
*/
|
||||||
OPCPackage opc = OPCPackage.open(writeWorkbookHolder.getFile(), PackageAccess.READ_WRITE);
|
private void doFileEncrypt07() throws Exception {
|
||||||
OutputStream os = enc.getDataStream(fs);
|
if (StringUtils.isEmpty(writeWorkbookHolder.getPassword())
|
||||||
opc.save(os);
|
|| !ExcelTypeEnum.XLSX.equals(writeWorkbookHolder.getExcelType())) {
|
||||||
opc.close();
|
return;
|
||||||
//write the encrypted file back to the stream
|
}
|
||||||
FileOutputStream fos = new FileOutputStream(writeWorkbookHolder.getFile());
|
if (writeWorkbookHolder.getFile() == null) {
|
||||||
fs.writeFilesystem(fos);
|
return;
|
||||||
fos.close();
|
}
|
||||||
} catch (Exception e) {
|
FileOutputStream fileOutputStream = null;
|
||||||
e.printStackTrace();
|
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 {
|
||||||
|
opcPackage.close();
|
||||||
|
}
|
||||||
|
return fileSystem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,4 +74,5 @@ public class BasicParameter {
|
|||||||
public void setUse1904windowing(Boolean use1904windowing) {
|
public void setUse1904windowing(Boolean use1904windowing) {
|
||||||
this.use1904windowing = use1904windowing;
|
this.use1904windowing = use1904windowing;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,9 +13,11 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.alibaba.excel.annotation.ExcelIgnore;
|
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
import com.alibaba.excel.annotation.format.DateTimeFormat;
|
import com.alibaba.excel.annotation.format.DateTimeFormat;
|
||||||
import com.alibaba.excel.annotation.format.NumberFormat;
|
import com.alibaba.excel.annotation.format.NumberFormat;
|
||||||
|
import com.alibaba.excel.annotation.write.style.ColumnWidth;
|
||||||
import com.alibaba.excel.converters.AutoConverter;
|
import com.alibaba.excel.converters.AutoConverter;
|
||||||
import com.alibaba.excel.converters.Converter;
|
import com.alibaba.excel.converters.Converter;
|
||||||
import com.alibaba.excel.enums.HeadKindEnum;
|
import com.alibaba.excel.enums.HeadKindEnum;
|
||||||
@ -120,6 +122,8 @@ public class ExcelHeadProperty {
|
|||||||
tempClass = tempClass.getSuperclass();
|
tempClass = tempClass.getSuperclass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ExcelIgnoreUnannotated excelIgnoreUnannotated =
|
||||||
|
(ExcelIgnoreUnannotated)headClazz.getAnnotation(ExcelIgnoreUnannotated.class);
|
||||||
// Screening of field
|
// Screening of field
|
||||||
List<Field> defaultFieldList = new ArrayList<Field>();
|
List<Field> defaultFieldList = new ArrayList<Field>();
|
||||||
Map<Integer, Field> customFiledMap = new TreeMap<Integer, Field>();
|
Map<Integer, Field> customFiledMap = new TreeMap<Integer, Field>();
|
||||||
@ -130,7 +134,9 @@ public class ExcelHeadProperty {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
|
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
|
||||||
if (excelProperty == null && convertAllFiled != null && !convertAllFiled) {
|
boolean noExcelProperty = excelProperty == null
|
||||||
|
&& ((convertAllFiled != null && !convertAllFiled) || excelIgnoreUnannotated != null);
|
||||||
|
if (noExcelProperty) {
|
||||||
ignoreMap.put(field.getName(), field);
|
ignoreMap.put(field.getName(), field);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -222,10 +222,28 @@ public class ExcelReaderBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the encryption
|
||||||
|
*
|
||||||
|
* @param password
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ExcelReaderBuilder password(String password) {
|
||||||
|
readWorkbook.setPassword(password);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public ExcelReader build() {
|
public ExcelReader build() {
|
||||||
return new ExcelReader(readWorkbook);
|
return new ExcelReader(readWorkbook);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ExcelReader doReadAll() {
|
||||||
|
ExcelReader excelReader = build();
|
||||||
|
excelReader.readAll();
|
||||||
|
excelReader.finish();
|
||||||
|
return excelReader;
|
||||||
|
}
|
||||||
|
|
||||||
public ExcelReaderSheetBuilder sheet() {
|
public ExcelReaderSheetBuilder sheet() {
|
||||||
return sheet(null, null);
|
return sheet(null, null);
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,19 @@ public class ReadSheet extends ReadBasicParameter {
|
|||||||
this.sheetName = sheetName;
|
this.sheetName = sheetName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void copyBasicParameter(ReadSheet other) {
|
||||||
|
if (other == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.setHeadRowNumber(other.getHeadRowNumber());
|
||||||
|
this.setCustomReadListenerList(other.getCustomReadListenerList());
|
||||||
|
this.setHead(other.getHead());
|
||||||
|
this.setClazz(other.getClazz());
|
||||||
|
this.setCustomConverterList(other.getCustomConverterList());
|
||||||
|
this.setAutoTrim(other.getAutoTrim());
|
||||||
|
this.setUse1904windowing(other.getUse1904windowing());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "ReadSheet{" + "sheetNo=" + sheetNo + ", sheetName='" + sheetName + '\'' + "} " + super.toString();
|
return "ReadSheet{" + "sheetNo=" + sheetNo + ", sheetName='" + sheetName + '\'' + "} " + super.toString();
|
||||||
|
@ -59,6 +59,10 @@ public class ReadWorkbook extends ReadBasicParameter {
|
|||||||
* Select the cache.Default use {@link com.alibaba.excel.cache.selector.SimpleReadCacheSelector}
|
* Select the cache.Default use {@link com.alibaba.excel.cache.selector.SimpleReadCacheSelector}
|
||||||
*/
|
*/
|
||||||
private ReadCacheSelector readCacheSelector;
|
private ReadCacheSelector readCacheSelector;
|
||||||
|
/**
|
||||||
|
* Whether the encryption
|
||||||
|
*/
|
||||||
|
private String password;
|
||||||
/**
|
/**
|
||||||
* The default is all excel objects.Default is true.
|
* The default is all excel objects.Default is true.
|
||||||
* <p>
|
* <p>
|
||||||
@ -164,4 +168,12 @@ public class ReadWorkbook extends ReadBasicParameter {
|
|||||||
public void setReadCacheSelector(ReadCacheSelector readCacheSelector) {
|
public void setReadCacheSelector(ReadCacheSelector readCacheSelector) {
|
||||||
this.readCacheSelector = readCacheSelector;
|
this.readCacheSelector = readCacheSelector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,6 @@ import java.util.Set;
|
|||||||
|
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import com.alibaba.excel.cache.ReadCache;
|
import com.alibaba.excel.cache.ReadCache;
|
||||||
import com.alibaba.excel.cache.selector.EternalReadCacheSelector;
|
import com.alibaba.excel.cache.selector.EternalReadCacheSelector;
|
||||||
@ -28,7 +26,6 @@ import com.alibaba.excel.support.ExcelTypeEnum;
|
|||||||
* @author Jiaju Zhuang
|
* @author Jiaju Zhuang
|
||||||
*/
|
*/
|
||||||
public class ReadWorkbookHolder extends AbstractReadHolder {
|
public class ReadWorkbookHolder extends AbstractReadHolder {
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(ReadWorkbookHolder.class);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* current param
|
* current param
|
||||||
@ -82,7 +79,10 @@ public class ReadWorkbookHolder extends AbstractReadHolder {
|
|||||||
* Temporary files when reading excel
|
* Temporary files when reading excel
|
||||||
*/
|
*/
|
||||||
private File tempFile;
|
private File tempFile;
|
||||||
|
/**
|
||||||
|
* Whether the encryption
|
||||||
|
*/
|
||||||
|
private String password;
|
||||||
/**
|
/**
|
||||||
* The default is all excel objects.if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a
|
* The default is all excel objects.if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a
|
||||||
* field. if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed.
|
* field. if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed.
|
||||||
@ -174,6 +174,7 @@ public class ReadWorkbookHolder extends AbstractReadHolder {
|
|||||||
}
|
}
|
||||||
this.hasReadSheet = new HashSet<Integer>();
|
this.hasReadSheet = new HashSet<Integer>();
|
||||||
this.ignoreRecord03 = Boolean.FALSE;
|
this.ignoreRecord03 = Boolean.FALSE;
|
||||||
|
this.password = readWorkbook.getPassword();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReadWorkbook getReadWorkbook() {
|
public ReadWorkbook getReadWorkbook() {
|
||||||
@ -312,6 +313,14 @@ public class ReadWorkbookHolder extends AbstractReadHolder {
|
|||||||
this.ignoreRecord03 = ignoreRecord03;
|
this.ignoreRecord03 = ignoreRecord03;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HolderEnum holderType() {
|
public HolderEnum holderType() {
|
||||||
return HolderEnum.WORKBOOK;
|
return HolderEnum.WORKBOOK;
|
||||||
|
@ -157,6 +157,15 @@ public class FileUtils {
|
|||||||
return directory;
|
return directory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static File createTmpFile(String fileName) {
|
||||||
|
String tmpDir = System.getProperty(JAVA_IO_TMPDIR);
|
||||||
|
if (tmpDir == null) {
|
||||||
|
throw new RuntimeException(
|
||||||
|
"Systems temporary directory not defined - set the -D" + JAVA_IO_TMPDIR + " jvm property!");
|
||||||
|
}
|
||||||
|
return new File(tmpDir, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param directory
|
* @param directory
|
||||||
|
67
src/main/java/com/alibaba/excel/util/SheetUtils.java
Normal file
67
src/main/java/com/alibaba/excel/util/SheetUtils.java
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package com.alibaba.excel.util;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.alibaba.excel.metadata.GlobalConfiguration;
|
||||||
|
import com.alibaba.excel.read.metadata.ReadSheet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sheet utils
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
public class SheetUtils {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(SheetUtils.class);
|
||||||
|
|
||||||
|
private SheetUtils() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match the parameters to the actual sheet
|
||||||
|
*
|
||||||
|
* @param readSheet
|
||||||
|
* actual sheet
|
||||||
|
* @param parameterReadSheetList
|
||||||
|
* parameters
|
||||||
|
* @param readAll
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static ReadSheet match(ReadSheet readSheet, List<ReadSheet> parameterReadSheetList, Boolean readAll,
|
||||||
|
GlobalConfiguration globalConfiguration) {
|
||||||
|
if (readAll) {
|
||||||
|
return readSheet;
|
||||||
|
}
|
||||||
|
for (ReadSheet parameterReadSheet : parameterReadSheetList) {
|
||||||
|
if (parameterReadSheet == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (parameterReadSheet.getSheetNo() == null && parameterReadSheet.getSheetName() == null) {
|
||||||
|
if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("The first is read by default.");
|
||||||
|
}
|
||||||
|
parameterReadSheet.setSheetNo(0);
|
||||||
|
}
|
||||||
|
boolean match = (parameterReadSheet.getSheetNo() != null
|
||||||
|
&& parameterReadSheet.getSheetNo().equals(readSheet.getSheetNo()));
|
||||||
|
if (!match) {
|
||||||
|
String parameterSheetName = parameterReadSheet.getSheetName();
|
||||||
|
if (!StringUtils.isEmpty(parameterSheetName)) {
|
||||||
|
boolean autoTrim = (parameterReadSheet.getAutoTrim() != null && parameterReadSheet.getAutoTrim())
|
||||||
|
|| (parameterReadSheet.getAutoTrim() == null && globalConfiguration.getAutoTrim());
|
||||||
|
if (autoTrim) {
|
||||||
|
parameterSheetName = parameterSheetName.trim();
|
||||||
|
}
|
||||||
|
match = parameterSheetName.equals(readSheet.getSheetName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
readSheet.copyBasicParameter(parameterReadSheet);
|
||||||
|
return readSheet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,16 @@
|
|||||||
package com.alibaba.excel.util;
|
package com.alibaba.excel.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.poi.hssf.usermodel.HSSFFont;
|
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
||||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
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.poifs.filesystem.POIFSFileSystem;
|
||||||
import org.apache.poi.ss.usermodel.Cell;
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
import org.apache.poi.ss.usermodel.CellStyle;
|
import org.apache.poi.ss.usermodel.CellStyle;
|
||||||
@ -48,6 +54,10 @@ public class WorkBookUtil {
|
|||||||
}
|
}
|
||||||
writeWorkbookHolder.setCachedWorkbook(hssfWorkbook);
|
writeWorkbookHolder.setCachedWorkbook(hssfWorkbook);
|
||||||
writeWorkbookHolder.setWorkbook(hssfWorkbook);
|
writeWorkbookHolder.setWorkbook(hssfWorkbook);
|
||||||
|
if (writeWorkbookHolder.getPassword() != null) {
|
||||||
|
Biff8EncryptionKey.setCurrentUserPassword(writeWorkbookHolder.getPassword());
|
||||||
|
hssfWorkbook.writeProtectWorkbook(writeWorkbookHolder.getPassword(), StringUtils.EMPTY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Sheet createSheet(Workbook workbook, String sheetName) {
|
public static Sheet createSheet(Workbook workbook, String sheetName) {
|
||||||
|
@ -103,7 +103,6 @@ public class ExcelBuilderImpl implements ExcelBuilder {
|
|||||||
}
|
}
|
||||||
context.currentSheet(writeSheet, WriteTypeEnum.ADD);
|
context.currentSheet(writeSheet, WriteTypeEnum.ADD);
|
||||||
context.currentTable(writeTable);
|
context.currentTable(writeTable);
|
||||||
context.setPassword(password);
|
|
||||||
if (excelWriteAddExecutor == null) {
|
if (excelWriteAddExecutor == null) {
|
||||||
excelWriteAddExecutor = new ExcelWriteAddExecutor(context);
|
excelWriteAddExecutor = new ExcelWriteAddExecutor(context);
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,19 @@ public class ExcelWriterBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the encryption.
|
||||||
|
* <p>
|
||||||
|
* WARRING:Encryption is when the entire file is read into memory, so it is very memory intensive.
|
||||||
|
*
|
||||||
|
* @param password
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public ExcelWriterBuilder password(String password) {
|
||||||
|
writeWorkbook.setPassword(password);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default is all excel objects.if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a
|
* The default is all excel objects.if true , you can use {@link com.alibaba.excel.annotation.ExcelIgnore} ignore a
|
||||||
* field. if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed.
|
* field. if false , you must use {@link com.alibaba.excel.annotation.ExcelProperty} to use a filed.
|
||||||
|
@ -159,19 +159,6 @@ 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(), password);
|
|
||||||
excelWriter.finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ExcelWriterTableBuilder table() {
|
public ExcelWriterTableBuilder table() {
|
||||||
return table(null);
|
return table(null);
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,13 @@ public class WriteWorkbook extends WriteBasicParameter {
|
|||||||
* Mandatory use 'inputStream' .Default is false
|
* Mandatory use 'inputStream' .Default is false
|
||||||
*/
|
*/
|
||||||
private Boolean mandatoryUseInputStream;
|
private Boolean mandatoryUseInputStream;
|
||||||
|
/**
|
||||||
|
* Whether the encryption
|
||||||
|
* <p>
|
||||||
|
* WARRING:Encryption is when the entire file is read into memory, so it is very memory intensive.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private String password;
|
||||||
/**
|
/**
|
||||||
* The default is all excel objects.Default is true.
|
* The default is all excel objects.Default is true.
|
||||||
* <p>
|
* <p>
|
||||||
@ -140,4 +147,12 @@ public class WriteWorkbook extends WriteBasicParameter {
|
|||||||
public void setWriteHandler(com.alibaba.excel.event.WriteHandler writeHandler) {
|
public void setWriteHandler(com.alibaba.excel.event.WriteHandler writeHandler) {
|
||||||
this.writeHandler = writeHandler;
|
this.writeHandler = writeHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
package com.alibaba.excel.write.metadata.holder;
|
package com.alibaba.excel.write.metadata.holder;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -96,9 +93,8 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
|
|||||||
* prevent duplicate creation of sheet objects
|
* prevent duplicate creation of sheet objects
|
||||||
*/
|
*/
|
||||||
private Map<Integer, WriteSheetHolder> hasBeenInitializedSheet;
|
private Map<Integer, WriteSheetHolder> hasBeenInitializedSheet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* password
|
* Whether the encryption
|
||||||
*/
|
*/
|
||||||
private String password;
|
private String password;
|
||||||
|
|
||||||
@ -140,6 +136,7 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
|
|||||||
this.mandatoryUseInputStream = writeWorkbook.getMandatoryUseInputStream();
|
this.mandatoryUseInputStream = writeWorkbook.getMandatoryUseInputStream();
|
||||||
}
|
}
|
||||||
this.hasBeenInitializedSheet = new HashMap<Integer, WriteSheetHolder>();
|
this.hasBeenInitializedSheet = new HashMap<Integer, WriteSheetHolder>();
|
||||||
|
this.password = writeWorkbook.getPassword();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyTemplate() throws IOException {
|
private void copyTemplate() throws IOException {
|
||||||
@ -257,11 +254,6 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
|
|||||||
this.mandatoryUseInputStream = mandatoryUseInputStream;
|
this.mandatoryUseInputStream = mandatoryUseInputStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public HolderEnum holderType() {
|
|
||||||
return HolderEnum.WORKBOOK;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getPassword() {
|
public String getPassword() {
|
||||||
return password;
|
return password;
|
||||||
}
|
}
|
||||||
@ -269,4 +261,9 @@ public class WriteWorkbookHolder extends AbstractWriteHolder {
|
|||||||
public void setPassword(String password) {
|
public void setPassword(String password) {
|
||||||
this.password = password;
|
this.password = password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HolderEnum holderType() {
|
||||||
|
return HolderEnum.WORKBOOK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.alibaba.easyexcel.test.core.encrypt;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class EncryptData {
|
||||||
|
@ExcelProperty("姓名")
|
||||||
|
private String name;
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.alibaba.easyexcel.test.core.encrypt;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.alibaba.excel.context.AnalysisContext;
|
||||||
|
import com.alibaba.excel.event.AnalysisEventListener;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
public class EncryptDataListener extends AnalysisEventListener<EncryptData> {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(EncryptDataListener.class);
|
||||||
|
List<EncryptData> list = new ArrayList<EncryptData>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void invoke(EncryptData data, AnalysisContext context) {
|
||||||
|
list.add(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
||||||
|
Assert.assertEquals(list.size(), 10);
|
||||||
|
Assert.assertEquals(list.get(0).getName(), "姓名0");
|
||||||
|
Assert.assertEquals((int)(context.readSheetHolder().getSheetNo()), 0);
|
||||||
|
Assert.assertEquals(
|
||||||
|
context.readSheetHolder().getExcelReadHeadProperty().getHeadMap().get(0).getHeadNameList().get(0), "姓名");
|
||||||
|
LOGGER.debug("First row:{}", JSON.toJSONString(list.get(0)));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
package com.alibaba.easyexcel.test.core.encrypt;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.FixMethodOrder;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runners.MethodSorters;
|
||||||
|
|
||||||
|
import com.alibaba.easyexcel.test.core.simple.SimpleData;
|
||||||
|
import com.alibaba.easyexcel.test.core.simple.SimpleDataListener;
|
||||||
|
import com.alibaba.easyexcel.test.core.simple.SimpleDataSheetNameListener;
|
||||||
|
import com.alibaba.easyexcel.test.util.TestFileUtil;
|
||||||
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.support.ExcelTypeEnum;
|
||||||
|
import com.alibaba.excel.util.FileUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
*/
|
||||||
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
|
public class EncryptDataTest {
|
||||||
|
|
||||||
|
private static File file07;
|
||||||
|
private static File file03;
|
||||||
|
private static File file07OutputStream;
|
||||||
|
private static File file03OutputStream;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void init() {
|
||||||
|
file07 = TestFileUtil.createNewFile("encrypt07.xlsx");
|
||||||
|
file03 = TestFileUtil.createNewFile("encrypt03.xls");
|
||||||
|
file07OutputStream = TestFileUtil.createNewFile("encryptOutputStream07.xlsx");
|
||||||
|
file03OutputStream = TestFileUtil.createNewFile("encryptOutputStream03.xls");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void t01ReadAndWrite07() {
|
||||||
|
readAndWrite(file07);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void t02ReadAndWrite03() {
|
||||||
|
readAndWrite(file03);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void t01ReadAndWriteStream07() throws Exception {
|
||||||
|
readAndWriteStream(file07OutputStream, ExcelTypeEnum.XLSX);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void t02ReadAndWriteStream03() throws Exception {
|
||||||
|
readAndWriteStream(file03OutputStream, ExcelTypeEnum.XLSX);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readAndWrite(File file) {
|
||||||
|
EasyExcel.write(file, EncryptData.class).password("123456").sheet().doWrite(data());
|
||||||
|
EasyExcel.read(file, EncryptData.class, new EncryptDataListener()).password("123456").sheet().doRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readAndWriteStream(File file, ExcelTypeEnum excelType) throws Exception {
|
||||||
|
FileOutputStream fileOutputStream = new FileOutputStream(file);
|
||||||
|
EasyExcel.write(fileOutputStream, EncryptData.class).password("123456").excelType(excelType).sheet()
|
||||||
|
.doWrite(data());
|
||||||
|
fileOutputStream.close();
|
||||||
|
|
||||||
|
FileInputStream fileInputStream = new FileInputStream(file);
|
||||||
|
EasyExcel.read(fileInputStream, EncryptData.class, new EncryptDataListener()).password("123456").sheet()
|
||||||
|
.doRead();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<SimpleData> data() {
|
||||||
|
List<SimpleData> list = new ArrayList<SimpleData>();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
SimpleData simpleData = new SimpleData();
|
||||||
|
simpleData.setName("姓名" + i);
|
||||||
|
list.add(simpleData);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
@ -40,6 +40,16 @@ public class MultipleSheetsDataTest {
|
|||||||
read(file03);
|
read(file03);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void t03Read07All() {
|
||||||
|
readAll(file07);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void t04Read03All() {
|
||||||
|
readAll(file03);
|
||||||
|
}
|
||||||
|
|
||||||
private void read(File file) {
|
private void read(File file) {
|
||||||
MultipleSheetsListener multipleSheetsListener = new MultipleSheetsListener();
|
MultipleSheetsListener multipleSheetsListener = new MultipleSheetsListener();
|
||||||
ExcelReader excelReader = EasyExcel.read(file, MultipleSheetsData.class, multipleSheetsListener).build();
|
ExcelReader excelReader = EasyExcel.read(file, MultipleSheetsData.class, multipleSheetsListener).build();
|
||||||
@ -53,4 +63,8 @@ public class MultipleSheetsDataTest {
|
|||||||
excelReader.finish();
|
excelReader.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void readAll(File file) {
|
||||||
|
EasyExcel.read(file, MultipleSheetsData.class, new MultipleSheetsListener()).doReadAll();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ public class MultipleSheetsListener extends AnalysisEventListener<MultipleSheets
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doAfterAllAnalysed(AnalysisContext context) {
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
||||||
|
LOGGER.debug("A form is read finished.");
|
||||||
Assert.assertEquals(list.get(0).getTitle(), "表1数据");
|
Assert.assertEquals(list.get(0).getTitle(), "表1数据");
|
||||||
LOGGER.debug("All row:{}", JSON.toJSONString(list));
|
LOGGER.debug("All row:{}", JSON.toJSONString(list));
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ public class ReadTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读多个sheet,这里注意一个sheet不能读取多次,多次读取需要重新读取文件
|
* 读多个或者全部sheet,这里注意一个sheet不能读取多次,多次读取需要重新读取文件
|
||||||
* <p>
|
* <p>
|
||||||
* 1. 创建excel对应的实体对象 参照{@link DemoData}
|
* 1. 创建excel对应的实体对象 参照{@link DemoData}
|
||||||
* <p>
|
* <p>
|
||||||
@ -82,24 +82,21 @@ public class ReadTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void repeatedRead() {
|
public void repeatedRead() {
|
||||||
// 方法1 如果 sheet1 sheet2 都是同一数据 监听器和头 都写到最外层
|
|
||||||
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
||||||
ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
|
// 读取全部sheet
|
||||||
ReadSheet readSheet1 = EasyExcel.readSheet(0).build();
|
// 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写
|
||||||
ReadSheet readSheet2 = EasyExcel.readSheet(1).build();
|
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();
|
||||||
excelReader.read(readSheet1);
|
|
||||||
excelReader.read(readSheet2);
|
|
||||||
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
|
||||||
excelReader.finish();
|
|
||||||
|
|
||||||
// 方法2 如果 sheet1 sheet2 数据不一致的话
|
// 读取部分sheet
|
||||||
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
|
||||||
excelReader = EasyExcel.read(fileName).build();
|
ExcelReader excelReader = EasyExcel.read(fileName).build();
|
||||||
// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
|
// 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
|
||||||
readSheet1 = EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
ReadSheet readSheet1 =
|
||||||
readSheet2 = EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
||||||
excelReader.read(readSheet1);
|
ReadSheet readSheet2 =
|
||||||
excelReader.read(readSheet2);
|
EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
|
||||||
|
// 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能
|
||||||
|
excelReader.read(readSheet1, readSheet2);
|
||||||
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
|
||||||
excelReader.finish();
|
excelReader.finish();
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@ package com.alibaba.easyexcel.test.demo.write;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||||
|
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -19,4 +21,9 @@ public class DemoData {
|
|||||||
private Date date;
|
private Date date;
|
||||||
@ExcelProperty("数字标题")
|
@ExcelProperty("数字标题")
|
||||||
private Double doubleData;
|
private Double doubleData;
|
||||||
|
/**
|
||||||
|
* 忽略这个字段
|
||||||
|
*/
|
||||||
|
@ExcelIgnore
|
||||||
|
private String ignore;
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ public class WriteTest {
|
|||||||
// 这里 需要指定写用哪个class去读
|
// 这里 需要指定写用哪个class去读
|
||||||
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,"12345");
|
excelWriter.write(data(), writeSheet);
|
||||||
// 进行加密
|
// 进行加密
|
||||||
/// 千万别忘记finish 会帮忙关闭流
|
/// 千万别忘记finish 会帮忙关闭流
|
||||||
excelWriter.finish();
|
excelWriter.finish();
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
package com.alibaba.easyexcel.test.temp.poi;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
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.CellCopyPolicy;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFRow;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFRow;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.alibaba.easyexcel.test.util.TestFileUtil;
|
||||||
|
import com.alibaba.excel.util.FileUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试poi
|
||||||
|
*
|
||||||
|
* @author Jiaju Zhuang
|
||||||
|
**/
|
||||||
|
@Ignore
|
||||||
|
public class Poi3Test {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(Poi3Test.class);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void Encryption() throws Exception {
|
||||||
|
String file = TestFileUtil.getPath() + "large" + File.separator + "large07.xlsx";
|
||||||
|
POIFSFileSystem fs = new POIFSFileSystem();
|
||||||
|
EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
|
||||||
|
Encryptor enc = info.getEncryptor();
|
||||||
|
enc.confirmPassword("foobaa");
|
||||||
|
OPCPackage opc = OPCPackage.open(new File(file), PackageAccess.READ_WRITE);
|
||||||
|
OutputStream os = enc.getDataStream(fs);
|
||||||
|
opc.save(os);
|
||||||
|
opc.close();
|
||||||
|
|
||||||
|
// Write out the encrypted version
|
||||||
|
FileOutputStream fos = new FileOutputStream("D:\\test\\99999999999.xlsx");
|
||||||
|
fs.writeFilesystem(fos);
|
||||||
|
fos.close();
|
||||||
|
fs.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void Encryption2() throws Exception {
|
||||||
|
Biff8EncryptionKey.setCurrentUserPassword("123456");
|
||||||
|
POIFSFileSystem fs = new POIFSFileSystem(new File("d:/test/simple03.xls"), true);
|
||||||
|
HSSFWorkbook hwb = new HSSFWorkbook(fs.getRoot(), true);
|
||||||
|
Biff8EncryptionKey.setCurrentUserPassword(null);
|
||||||
|
System.out.println(hwb.getSheetAt(0).getSheetName());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,8 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.alibaba.easyexcel.test.util.TestFileUtil;
|
import com.alibaba.easyexcel.test.util.TestFileUtil;
|
||||||
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import com.alibaba.excel.ExcelReader;
|
||||||
import com.alibaba.excel.util.FileUtils;
|
import com.alibaba.excel.util.FileUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +33,7 @@ public class Wirte {
|
|||||||
String fileName = TestFileUtil.getPath() + "t22" + System.currentTimeMillis() + ".xlsx";
|
String fileName = TestFileUtil.getPath() + "t22" + System.currentTimeMillis() + ".xlsx";
|
||||||
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
|
// 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
|
||||||
// 如果这里想使用03 则 传入excelType参数即可
|
// 如果这里想使用03 则 传入excelType参数即可
|
||||||
EasyExcel.write(fileName).sheet("模板").head(head()).doWrite(data());
|
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<List<String>> head() {
|
private List<List<String>> head() {
|
||||||
|
@ -2,10 +2,13 @@
|
|||||||
* 新增支持导入、导出支持公式
|
* 新增支持导入、导出支持公式
|
||||||
* 新增支持读取单元格类型、写入指定单元格类型
|
* 新增支持读取单元格类型、写入指定单元格类型
|
||||||
* 支持通过模板填充数据
|
* 支持通过模板填充数据
|
||||||
* 新增写支持 禁用头样式 autoHeadStyle
|
* 新增写支持 禁用头样式 `autoHeadStyle`
|
||||||
* 用map读取数据 空的单元格也会有个 null的数据
|
* 用map读取数据 空的单元格也会有个 null的数据
|
||||||
* 转换报错 能获取到对应的行号和列号
|
* 转换报错 能获取到对应的行号和列号
|
||||||
* 优化读取全部sheet方案
|
* 优化读取全部sheet方案
|
||||||
|
* 新增注解`ExcelIgnoreUnannotated` 支持忽略未加`ExcelProperty`注解的字段
|
||||||
|
* 支持导出加密 [Issue #361](https://github.com/alibaba/easyexcel/issues/361)
|
||||||
|
* 支持导入加密 [Issue #295](https://github.com/alibaba/easyexcel/issues/295)
|
||||||
|
|
||||||
# 2.0.5
|
# 2.0.5
|
||||||
* 优化07版超大文件读取方案
|
* 优化07版超大文件读取方案
|
||||||
|
Loading…
x
Reference in New Issue
Block a user