From 2c8918bed3975e1eeb4745a1665234fe1b282ee0 Mon Sep 17 00:00:00 2001 From: Jiaju Zhuang Date: Wed, 23 Oct 2019 18:43:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A1=AB=E5=85=85=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=E6=9C=89=E6=95=B0=E5=AD=97=E4=BC=9A=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../excel/analysis/ExcelAnalyserImpl.java | 20 ++-- .../excel/analysis/v07/XlsxSaxAnalyser.java | 2 - .../excel/context/WriteContextImpl.java | 25 ++--- .../metadata/property/ExcelHeadProperty.java | 48 ++++++--- .../metadata/holder/AbstractReadHolder.java | 2 +- .../property/ExcelReadHeadProperty.java | 5 +- .../com/alibaba/excel/util/WorkBookUtil.java | 17 +++- .../write/builder/ExcelWriterBuilder.java | 43 ++++++++ .../builder/ExcelWriterSheetBuilder.java | 33 ++++++ .../builder/ExcelWriterTableBuilder.java | 34 +++++++ .../write/executor/ExcelWriteAddExecutor.java | 8 +- .../executor/ExcelWriteFillExecutor.java | 36 ++++--- .../write/metadata/WriteBasicParameter.java | 49 +++++++++ .../excel/write/metadata/WriteWorkbook.java | 16 ++- .../metadata/holder/AbstractWriteHolder.java | 94 +++++++++++++++++- .../write/metadata/holder/WriteHolder.java | 9 ++ .../metadata/holder/WriteWorkbookHolder.java | 19 ++++ .../property/ExcelWriteHeadProperty.java | 5 +- .../LongestMatchColumnWidthStyleStrategy.java | 2 +- .../easyexcel/test/core/fill/FillData.java | 1 + .../easyexcel/test/demo/write/WriteTest.java | 31 ++++++ .../easyexcel/test/temp/simple/Wirte.java | 4 +- src/test/resources/fill/simple.xls | Bin 19456 -> 19456 bytes src/test/resources/fill/simple.xlsx | Bin 10138 -> 10199 bytes update.md | 8 ++ 26 files changed, 450 insertions(+), 63 deletions(-) diff --git a/pom.xml b/pom.xml index 90838f33..514464b1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.alibaba easyexcel - 2.1.0-beta2 + 2.1.0-beta3 jar easyexcel diff --git a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java index 6e1f435d..72a27e7f 100644 --- a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java +++ b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java @@ -129,26 +129,28 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { } ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder(); + Throwable throwable = null; + try { if (readWorkbookHolder.getReadCache() != null) { readWorkbookHolder.getReadCache().destroy(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } try { if (readWorkbookHolder.getOpcPackage() != null) { readWorkbookHolder.getOpcPackage().revert(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } try { if (readWorkbookHolder.getPoifsFileSystem() != null) { readWorkbookHolder.getPoifsFileSystem().close(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } try { if (analysisContext.readWorkbookHolder().getAutoCloseStream() @@ -156,17 +158,21 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { readWorkbookHolder.getInputStream().close(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } try { if (readWorkbookHolder.getTempFile() != null) { FileUtils.delete(readWorkbookHolder.getTempFile()); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } clearEncrypt03(); + + if (throwable != null) { + throw new ExcelAnalysisException("Can not close IO", throwable); + } } private void clearEncrypt03() { @@ -177,10 +183,6 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { Biff8EncryptionKey.setCurrentUserPassword(null); } - private void throwCanNotCloseIo(Throwable t) { - throw new ExcelAnalysisException("Can not close IO", t); - } - @Override public ExcelReadExecutor excelExecutor() { return excelReadExecutor; diff --git a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java index dd468b4b..a30b4260 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -15,7 +15,6 @@ import javax.xml.parsers.SAXParserFactory; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; 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.model.StylesTable; import org.apache.poi.xssf.usermodel.XSSFRelation; @@ -35,7 +34,6 @@ import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.util.SheetUtils; -import com.alibaba.excel.util.StringUtils; /** * diff --git a/src/main/java/com/alibaba/excel/context/WriteContextImpl.java b/src/main/java/com/alibaba/excel/context/WriteContextImpl.java index ffacd521..f136ea09 100644 --- a/src/main/java/com/alibaba/excel/context/WriteContextImpl.java +++ b/src/main/java/com/alibaba/excel/context/WriteContextImpl.java @@ -179,6 +179,7 @@ public class WriteContextImpl implements WriteContext { Row row = WorkBookUtil.createRow(writeSheetHolder.getSheet(), i); WriteHandlerUtils.afterRowCreate(this, row, relativeRowIndex, Boolean.TRUE); addOneRowOfHeadDataToExcel(row, excelWriteHeadProperty.getHeadMap(), relativeRowIndex); + WriteHandlerUtils.afterRowDispose(this, row, relativeRowIndex, Boolean.FALSE); } } @@ -197,8 +198,7 @@ public class WriteContextImpl implements WriteContext { Cell cell = row.createCell(columnIndex); WriteHandlerUtils.afterCellCreate(this, cell, head, relativeRowIndex, Boolean.TRUE); cell.setCellValue(head.getHeadNameList().get(relativeRowIndex)); - CellData cellData = null; - WriteHandlerUtils.afterCellDispose(this, cellData, cell, head, relativeRowIndex, Boolean.TRUE); + WriteHandlerUtils.afterCellDispose(this, (CellData)null, cell, head, relativeRowIndex, Boolean.TRUE); } } @@ -261,12 +261,13 @@ public class WriteContextImpl implements WriteContext { if (writeWorkbookHolder == null) { return; } + Throwable throwable = null; boolean isOutputStreamEncrypt = false; try { isOutputStreamEncrypt = doOutputStreamEncrypt07(); } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } if (!isOutputStreamEncrypt) { @@ -274,7 +275,7 @@ public class WriteContextImpl implements WriteContext { writeWorkbookHolder.getWorkbook().write(writeWorkbookHolder.getOutputStream()); writeWorkbookHolder.getWorkbook().close(); } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } } @@ -284,7 +285,7 @@ public class WriteContextImpl implements WriteContext { ((SXSSFWorkbook)workbook).dispose(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } try { @@ -292,14 +293,14 @@ public class WriteContextImpl implements WriteContext { writeWorkbookHolder.getOutputStream().close(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } if (!isOutputStreamEncrypt) { try { doFileEncrypt07(); } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } } @@ -308,20 +309,20 @@ public class WriteContextImpl implements WriteContext { writeWorkbookHolder.getTempTemplateInputStream().close(); } } catch (Throwable t) { - throwCanNotCloseIo(t); + throwable = t; } clearEncrypt03(); + if (throwable != null) { + throw new ExcelGenerateException("Can not close IO", throwable); + } + if (LOGGER.isDebugEnabled()) { LOGGER.debug("Finished write."); } } - private void throwCanNotCloseIo(Throwable t) { - throw new ExcelGenerateException("Can not close IO", t); - } - @Override public Sheet getCurrentSheet() { return writeSheetHolder.getSheet(); diff --git a/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java b/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java index 69211617..eed5699e 100644 --- a/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java +++ b/src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java @@ -17,14 +17,15 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; 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.Converter; import com.alibaba.excel.enums.HeadKindEnum; import com.alibaba.excel.exception.ExcelCommonException; import com.alibaba.excel.exception.ExcelGenerateException; import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.Holder; import com.alibaba.excel.util.StringUtils; +import com.alibaba.excel.write.metadata.holder.AbstractWriteHolder; /** * Define the header attribute of excel @@ -46,7 +47,6 @@ public class ExcelHeadProperty { * The number of rows in the line with the most rows */ private int headRowNumber; - /** * Configuration header information */ @@ -64,7 +64,7 @@ public class ExcelHeadProperty { */ private Map ignoreMap; - public ExcelHeadProperty(Class headClazz, List> head, Boolean convertAllFiled) { + public ExcelHeadProperty(Holder holder, Class headClazz, List> head, Boolean convertAllFiled) { this.headClazz = headClazz; headMap = new TreeMap(); contentPropertyMap = new TreeMap(); @@ -73,14 +73,21 @@ public class ExcelHeadProperty { headKind = HeadKindEnum.NONE; headRowNumber = 0; if (head != null && !head.isEmpty()) { + int headIndex = 0; for (int i = 0; i < head.size(); i++) { - headMap.put(i, new Head(i, null, head.get(i), Boolean.FALSE, Boolean.TRUE)); - contentPropertyMap.put(i, null); + if (holder instanceof AbstractWriteHolder) { + if (((AbstractWriteHolder)holder).ignore(null, i)) { + continue; + } + } + headMap.put(headIndex, new Head(headIndex, null, head.get(i), Boolean.FALSE, Boolean.TRUE)); + contentPropertyMap.put(headIndex, null); + headIndex++; } headKind = HeadKindEnum.STRING; } else { // convert headClazz to head - initColumnProperties(convertAllFiled); + initColumnProperties(holder, convertAllFiled); } initHeadRowNumber(); if (LOGGER.isDebugEnabled()) { @@ -108,7 +115,7 @@ public class ExcelHeadProperty { } } - private void initColumnProperties(Boolean convertAllFiled) { + private void initColumnProperties(Holder holder, Boolean convertAllFiled) { if (headClazz == null) { return; } @@ -161,20 +168,36 @@ public class ExcelHeadProperty { int index = 0; for (Field field : defaultFieldList) { while (customFiledMap.containsKey(index)) { - initOneColumnProperty(index, customFiledMap.get(index), Boolean.TRUE); customFiledMap.remove(index); + if (!initOneColumnProperty(holder, index, customFiledMap.get(index), Boolean.TRUE)) { + index++; + } + } + if (!initOneColumnProperty(holder, index, field, Boolean.FALSE)) { index++; } - initOneColumnProperty(index, field, Boolean.FALSE); - index++; } for (Map.Entry entry : customFiledMap.entrySet()) { - initOneColumnProperty(entry.getKey(), entry.getValue(), Boolean.TRUE); + initOneColumnProperty(holder, entry.getKey(), entry.getValue(), Boolean.TRUE); } headKind = HeadKindEnum.CLASS; } - private void initOneColumnProperty(int index, Field field, Boolean forceIndex) { + /** + * Initialization column property + * + * @param holder + * @param index + * @param field + * @param forceIndex + * @return Ignore current field + */ + private boolean initOneColumnProperty(Holder holder, int index, Field field, Boolean forceIndex) { + if (holder instanceof AbstractWriteHolder) { + if (((AbstractWriteHolder)holder).ignore(field.getName(), index)) { + return true; + } + } ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); List tmpHeadList = new ArrayList(); boolean notForceName = excelProperty == null || excelProperty.value().length <= 0 @@ -206,6 +229,7 @@ public class ExcelHeadProperty { headMap.put(index, head); contentPropertyMap.put(index, excelContentProperty); fieldNameContentPropertyMap.put(field.getName(), excelContentProperty); + return false; } public Class getHeadClazz() { diff --git a/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java b/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java index 4ca8d63c..a748f32c 100644 --- a/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java +++ b/src/main/java/com/alibaba/excel/read/metadata/holder/AbstractReadHolder.java @@ -70,7 +70,7 @@ public abstract class AbstractReadHolder extends AbstractHolder implements ReadH } // Initialization property - this.excelReadHeadProperty = new ExcelReadHeadProperty(getClazz(), getHead(), convertAllFiled); + this.excelReadHeadProperty = new ExcelReadHeadProperty(this, getClazz(), getHead(), convertAllFiled); if (readBasicParameter.getHeadRowNumber() == null) { if (parentAbstractReadHolder == null) { if (excelReadHeadProperty.hasHead()) { diff --git a/src/main/java/com/alibaba/excel/read/metadata/property/ExcelReadHeadProperty.java b/src/main/java/com/alibaba/excel/read/metadata/property/ExcelReadHeadProperty.java index fdc5562d..1b7ae17c 100644 --- a/src/main/java/com/alibaba/excel/read/metadata/property/ExcelReadHeadProperty.java +++ b/src/main/java/com/alibaba/excel/read/metadata/property/ExcelReadHeadProperty.java @@ -2,6 +2,7 @@ package com.alibaba.excel.read.metadata.property; import java.util.List; +import com.alibaba.excel.metadata.Holder; import com.alibaba.excel.metadata.property.ExcelHeadProperty; /** @@ -11,7 +12,7 @@ import com.alibaba.excel.metadata.property.ExcelHeadProperty; */ public class ExcelReadHeadProperty extends ExcelHeadProperty { - public ExcelReadHeadProperty(Class headClazz, List> head, Boolean convertAllFiled) { - super(headClazz, head, convertAllFiled); + public ExcelReadHeadProperty(Holder holder, Class headClazz, List> head, Boolean convertAllFiled) { + super(holder, headClazz, head, convertAllFiled); } } diff --git a/src/main/java/com/alibaba/excel/util/WorkBookUtil.java b/src/main/java/com/alibaba/excel/util/WorkBookUtil.java index bcec5234..186708c9 100644 --- a/src/main/java/com/alibaba/excel/util/WorkBookUtil.java +++ b/src/main/java/com/alibaba/excel/util/WorkBookUtil.java @@ -31,12 +31,21 @@ public class WorkBookUtil { if (writeWorkbookHolder.getTempTemplateInputStream() != null) { XSSFWorkbook xssfWorkbook = new XSSFWorkbook(writeWorkbookHolder.getTempTemplateInputStream()); writeWorkbookHolder.setCachedWorkbook(xssfWorkbook); - writeWorkbookHolder.setWorkbook(new SXSSFWorkbook(xssfWorkbook, ROW_ACCESS_WINDOW_SIZE)); + if (writeWorkbookHolder.getInMemory()) { + writeWorkbookHolder.setWorkbook(xssfWorkbook); + } else { + writeWorkbookHolder.setWorkbook(new SXSSFWorkbook(xssfWorkbook, ROW_ACCESS_WINDOW_SIZE)); + } return; } - SXSSFWorkbook sxssWorkbook = new SXSSFWorkbook(ROW_ACCESS_WINDOW_SIZE); - writeWorkbookHolder.setCachedWorkbook(sxssWorkbook); - writeWorkbookHolder.setWorkbook(sxssWorkbook); + Workbook workbook = null; + if (writeWorkbookHolder.getInMemory()) { + workbook = new XSSFWorkbook(); + } else { + workbook = new SXSSFWorkbook(ROW_ACCESS_WINDOW_SIZE); + } + writeWorkbookHolder.setCachedWorkbook(workbook); + writeWorkbookHolder.setWorkbook(workbook); return; } HSSFWorkbook hssfWorkbook; diff --git a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java index 82de0381..8af1e62c 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterBuilder.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import com.alibaba.excel.ExcelWriter; @@ -103,6 +104,48 @@ public class ExcelWriterBuilder { return this; } + /** + * Write excel in memory. Default false,the cache file is created and finally written to excel. + *

+ * Comment and RichTextString are only supported in memory mode. + */ + public ExcelWriterBuilder inMemory(Boolean inMemory) { + writeWorkbook.setInMemory(inMemory); + return this; + } + + /** + * Ignore the custom columns. + */ + public ExcelWriterBuilder excludeColumnIndexes(Collection excludeColumnIndexes) { + writeWorkbook.setExcludeColumnIndexes(excludeColumnIndexes); + return this; + } + + /** + * Ignore the custom columns. + */ + public ExcelWriterBuilder excludeColumnFiledNames(Collection excludeColumnFiledNames) { + writeWorkbook.setExcludeColumnFiledNames(excludeColumnFiledNames); + return this; + } + + /** + * Only output the custom columns. + */ + public ExcelWriterBuilder includeColumnIndexes(Collection includeColumnIndexes) { + writeWorkbook.setIncludeColumnIndexes(includeColumnIndexes); + return this; + } + + /** + * Only output the custom columns. + */ + public ExcelWriterBuilder includeColumnFiledNames(Collection includeColumnFiledNames) { + writeWorkbook.setIncludeColumnFiledNames(includeColumnFiledNames); + return this; + } + /** * 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. 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 26acff51..50f230ae 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterSheetBuilder.java @@ -1,6 +1,7 @@ package com.alibaba.excel.write.builder; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import com.alibaba.excel.ExcelWriter; @@ -135,6 +136,38 @@ public class ExcelWriterSheetBuilder { return this; } + /** + * Ignore the custom columns. + */ + public ExcelWriterSheetBuilder excludeColumnIndexes(Collection excludeColumnIndexes) { + writeSheet.setExcludeColumnIndexes(excludeColumnIndexes); + return this; + } + + /** + * Ignore the custom columns. + */ + public ExcelWriterSheetBuilder excludeColumnFiledNames(Collection excludeColumnFiledNames) { + writeSheet.setExcludeColumnFiledNames(excludeColumnFiledNames); + return this; + } + + /** + * Only output the custom columns. + */ + public ExcelWriterSheetBuilder includeColumnIndexes(Collection includeColumnIndexes) { + writeSheet.setIncludeColumnIndexes(includeColumnIndexes); + return this; + } + + /** + * Only output the custom columns. + */ + public ExcelWriterSheetBuilder includeColumnFiledNames(Collection includeColumnFiledNames) { + writeSheet.setIncludeColumnFiledNames(includeColumnFiledNames); + return this; + } + public WriteSheet build() { return writeSheet; } diff --git a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java index eca1fe07..40ca58b9 100644 --- a/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java +++ b/src/main/java/com/alibaba/excel/write/builder/ExcelWriterTableBuilder.java @@ -1,6 +1,7 @@ package com.alibaba.excel.write.builder; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import com.alibaba.excel.ExcelWriter; @@ -128,6 +129,39 @@ public class ExcelWriterTableBuilder { return this; } + + /** + * Ignore the custom columns. + */ + public ExcelWriterTableBuilder excludeColumnIndexes(Collection excludeColumnIndexes) { + writeTable.setExcludeColumnIndexes(excludeColumnIndexes); + return this; + } + + /** + * Ignore the custom columns. + */ + public ExcelWriterTableBuilder excludeColumnFiledNames(Collection excludeColumnFiledNames) { + writeTable.setExcludeColumnFiledNames(excludeColumnFiledNames); + return this; + } + + /** + * Only output the custom columns. + */ + public ExcelWriterTableBuilder includeColumnIndexes(Collection includeColumnIndexes) { + writeTable.setIncludeColumnIndexes(includeColumnIndexes); + return this; + } + + /** + * Only output the custom columns. + */ + public ExcelWriterTableBuilder includeColumnFiledNames(Collection includeColumnFiledNames) { + writeSheet.setIncludeColumnFiledNames(includeColumnFiledNames); + return this; + } + public WriteTable build() { return writeTable; } diff --git a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java index 8843e2cc..0fa0cae2 100644 --- a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java +++ b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java @@ -98,6 +98,9 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { private void doAddBasicTypeToExcel(List oneRowData, Head head, Row row, int relativeRowIndex, int dataIndex, int cellIndex) { + if (writeContext.currentWriteHolder().ignore(null, cellIndex)) { + return; + } WriteHandlerUtils.beforeCellCreate(writeContext, row, head, cellIndex, relativeRowIndex, Boolean.FALSE); Cell cell = WorkBookUtil.createCell(row, cellIndex); WriteHandlerUtils.afterCellCreate(writeContext, cell, head, relativeRowIndex, Boolean.FALSE); @@ -121,6 +124,9 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { cellIndex = entry.getKey(); ExcelContentProperty excelContentProperty = entry.getValue(); String name = excelContentProperty.getField().getName(); + if (writeContext.currentWriteHolder().ignore(name, cellIndex)) { + continue; + } if (!beanMap.containsKey(name)) { continue; } @@ -147,7 +153,7 @@ public class ExcelWriteAddExecutor extends AbstractExcelWriteExecutor { for (Field field : fieldList) { String filedName = field.getName(); boolean uselessData = !beanMap.containsKey(filedName) || beanMapHandledSet.contains(filedName) - || ignoreMap.containsKey(filedName); + || ignoreMap.containsKey(filedName) || writeContext.currentWriteHolder().ignore(filedName, cellIndex); if (uselessData) { continue; } diff --git a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java index 388fc770..75a88105 100644 --- a/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java +++ b/src/main/java/com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java @@ -9,6 +9,7 @@ import java.util.Map; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -141,6 +142,9 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { Cell cell = getOneCell(analysisCell, fillConfig); if (analysisCell.getOnlyOneVariable()) { String variable = analysisCell.getVariableList().get(0); + if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) { + continue; + } if (!dataMap.containsKey(variable)) { continue; } @@ -154,6 +158,9 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { List cellDataList = new ArrayList(); for (String variable : analysisCell.getVariableList()) { cellValueBuild.append(analysisCell.getPrepareDataList().get(index++)); + if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) { + continue; + } if (!dataMap.containsKey(variable)) { continue; } @@ -279,11 +286,10 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { if (cell == null) { continue; } - boolean needFill = - prepareData(cell.getStringCellValue(), analysisCellList, collectionAnalysisCellList, i, j); + String preparedData = prepareData(cell, analysisCellList, collectionAnalysisCellList, i, j); // Prevent empty data from not being replaced - if (needFill) { - cell.setCellValue(StringUtils.EMPTY); + if (preparedData != null) { + cell.setCellValue(preparedData); } } } @@ -295,18 +301,23 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { /** * To prepare data * - * @param value + * @param cell * @param analysisCellList * @param collectionAnalysisCellList * @param rowIndex * @param columnIndex - * @return Is a cell to be filled + * @return Returns the data that the cell needs to replace */ - private boolean prepareData(String value, List analysisCellList, + private String prepareData(Cell cell, List analysisCellList, List collectionAnalysisCellList, int rowIndex, int columnIndex) { + if (!CellType.STRING.equals(cell.getCellTypeEnum())) { + return null; + } + String value = cell.getStringCellValue(); if (StringUtils.isEmpty(value)) { - return false; + return null; } + StringBuilder preparedData = new StringBuilder(); AnalysisCell analysisCell = null; int startIndex = 0; int length = value.length(); @@ -354,8 +365,9 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { if (lastPrepareDataIndex == prefixIndex) { analysisCell.getPrepareDataList().add(StringUtils.EMPTY); } else { - analysisCell.getPrepareDataList() - .add(convertPrepareData(value.substring(lastPrepareDataIndex, prefixIndex))); + String data = convertPrepareData(value.substring(lastPrepareDataIndex, prefixIndex)); + preparedData.append(data); + analysisCell.getPrepareDataList().add(data); analysisCell.setOnlyOneVariable(Boolean.FALSE); } lastPrepareDataIndex = suffixIndex + 1; @@ -372,9 +384,9 @@ public class ExcelWriteFillExecutor extends AbstractExcelWriteExecutor { } else { collectionAnalysisCellList.add(analysisCell); } - return true; + return preparedData.toString(); } - return false; + return null; } private AnalysisCell initAnalysisCell(Integer rowIndex, Integer columnIndex) { diff --git a/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java b/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java index 2689cd98..61115aff 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java +++ b/src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java @@ -1,6 +1,7 @@ package com.alibaba.excel.write.metadata; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import com.alibaba.excel.metadata.BasicParameter; @@ -28,6 +29,22 @@ public class WriteBasicParameter extends BasicParameter { * Use the default style.Default is true. */ private Boolean useDefaultStyle; + /** + * Ignore the custom columns. + */ + private Collection excludeColumnIndexes; + /** + * Ignore the custom columns. + */ + private Collection excludeColumnFiledNames; + /** + * Only output the custom columns. + */ + private Collection includeColumnIndexes; + /** + * Only output the custom columns. + */ + private Collection includeColumnFiledNames; public Integer getRelativeHeadRowIndex() { return relativeHeadRowIndex; @@ -60,4 +77,36 @@ public class WriteBasicParameter extends BasicParameter { public void setUseDefaultStyle(Boolean useDefaultStyle) { this.useDefaultStyle = useDefaultStyle; } + + public Collection getExcludeColumnIndexes() { + return excludeColumnIndexes; + } + + public void setExcludeColumnIndexes(Collection excludeColumnIndexes) { + this.excludeColumnIndexes = excludeColumnIndexes; + } + + public Collection getExcludeColumnFiledNames() { + return excludeColumnFiledNames; + } + + public void setExcludeColumnFiledNames(Collection excludeColumnFiledNames) { + this.excludeColumnFiledNames = excludeColumnFiledNames; + } + + public Collection getIncludeColumnIndexes() { + return includeColumnIndexes; + } + + public void setIncludeColumnIndexes(Collection includeColumnIndexes) { + this.includeColumnIndexes = includeColumnIndexes; + } + + public Collection getIncludeColumnFiledNames() { + return includeColumnFiledNames; + } + + public void setIncludeColumnFiledNames(Collection includeColumnFiledNames) { + this.includeColumnFiledNames = includeColumnFiledNames; + } } diff --git a/src/main/java/com/alibaba/excel/write/metadata/WriteWorkbook.java b/src/main/java/com/alibaba/excel/write/metadata/WriteWorkbook.java index 7d9ebcd6..738299af 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/WriteWorkbook.java +++ b/src/main/java/com/alibaba/excel/write/metadata/WriteWorkbook.java @@ -43,7 +43,7 @@ public class WriteWorkbook extends WriteBasicParameter { */ private File templateFile; /** - * Default trueuseDefaultStyle + * Default true. */ private Boolean autoCloseStream; /** @@ -57,6 +57,12 @@ public class WriteWorkbook extends WriteBasicParameter { * */ private String password; + /** + * Write excel in memory. Default false,the cache file is created and finally written to excel. + *

+ * Comment and RichTextString are only supported in memory mode. + */ + private Boolean inMemory; /** * The default is all excel objects.Default is true. *

@@ -155,4 +161,12 @@ public class WriteWorkbook extends WriteBasicParameter { public void setPassword(String password) { this.password = password; } + + public Boolean getInMemory() { + return inMemory; + } + + public void setInMemory(Boolean inMemory) { + this.inMemory = inMemory; + } } diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java index 72f5f9be..b28f267b 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java @@ -1,6 +1,7 @@ package com.alibaba.excel.write.metadata.holder; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -65,6 +66,22 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ * Use the default style.Default is true. */ private Boolean useDefaultStyle; + /** + * Ignore the custom columns. + */ + private Collection excludeColumnIndexes; + /** + * Ignore the custom columns. + */ + private Collection excludeColumnFiledNames; + /** + * Only output the custom columns. + */ + private Collection includeColumnIndexes; + /** + * Only output the custom columns. + */ + private Collection includeColumnFiledNames; public AbstractWriteHolder(WriteBasicParameter writeBasicParameter, AbstractWriteHolder parentAbstractWriteHolder, Boolean convertAllFiled) { @@ -110,8 +127,29 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ this.useDefaultStyle = writeBasicParameter.getUseDefaultStyle(); } + if (writeBasicParameter.getExcludeColumnFiledNames() == null && parentAbstractWriteHolder != null) { + this.excludeColumnFiledNames = parentAbstractWriteHolder.getExcludeColumnFiledNames(); + } else { + this.excludeColumnFiledNames = writeBasicParameter.getExcludeColumnFiledNames(); + } + if (writeBasicParameter.getExcludeColumnIndexes() == null && parentAbstractWriteHolder != null) { + this.excludeColumnIndexes = parentAbstractWriteHolder.getExcludeColumnIndexes(); + } else { + this.excludeColumnIndexes = writeBasicParameter.getExcludeColumnIndexes(); + } + if (writeBasicParameter.getIncludeColumnFiledNames() == null && parentAbstractWriteHolder != null) { + this.includeColumnFiledNames = parentAbstractWriteHolder.getIncludeColumnFiledNames(); + } else { + this.includeColumnFiledNames = writeBasicParameter.getIncludeColumnFiledNames(); + } + if (writeBasicParameter.getIncludeColumnIndexes() == null && parentAbstractWriteHolder != null) { + this.includeColumnIndexes = parentAbstractWriteHolder.getIncludeColumnIndexes(); + } else { + this.includeColumnIndexes = writeBasicParameter.getIncludeColumnIndexes(); + } + // Initialization property - this.excelWriteHeadProperty = new ExcelWriteHeadProperty(getClazz(), getHead(), convertAllFiled); + this.excelWriteHeadProperty = new ExcelWriteHeadProperty(this, getClazz(), getHead(), convertAllFiled); // Compatible with old code compatibleOldCode(writeBasicParameter); @@ -148,7 +186,6 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ getConverterMap().put(ConverterKeyBuild.buildKey(converter.supportJavaTypeKey()), converter); } } - } /** @@ -343,6 +380,27 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ return result; } + @Override + public boolean ignore(String fieldName, Integer columnIndex) { + if (fieldName != null) { + if (includeColumnFiledNames != null && !includeColumnFiledNames.contains(fieldName)) { + return true; + } + if (excludeColumnFiledNames != null && excludeColumnFiledNames.contains(fieldName)) { + return true; + } + } + if (columnIndex != null) { + if (includeColumnIndexes != null && !includeColumnIndexes.contains(columnIndex)) { + return true; + } + if (excludeColumnIndexes != null && excludeColumnIndexes.contains(columnIndex)) { + return true; + } + } + return false; + } + public Boolean getNeedHead() { return needHead; } @@ -383,6 +441,38 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ this.useDefaultStyle = useDefaultStyle; } + public Collection getExcludeColumnIndexes() { + return excludeColumnIndexes; + } + + public void setExcludeColumnIndexes(Collection excludeColumnIndexes) { + this.excludeColumnIndexes = excludeColumnIndexes; + } + + public Collection getExcludeColumnFiledNames() { + return excludeColumnFiledNames; + } + + public void setExcludeColumnFiledNames(Collection excludeColumnFiledNames) { + this.excludeColumnFiledNames = excludeColumnFiledNames; + } + + public Collection getIncludeColumnIndexes() { + return includeColumnIndexes; + } + + public void setIncludeColumnIndexes(Collection includeColumnIndexes) { + this.includeColumnIndexes = includeColumnIndexes; + } + + public Collection getIncludeColumnFiledNames() { + return includeColumnFiledNames; + } + + public void setIncludeColumnFiledNames(Collection includeColumnFiledNames) { + this.includeColumnFiledNames = includeColumnFiledNames; + } + @Override public ExcelWriteHeadProperty excelWriteHeadProperty() { return getExcelWriteHeadProperty(); diff --git a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java index 53c11dba..8f2ae7e2 100644 --- a/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java +++ b/src/main/java/com/alibaba/excel/write/metadata/holder/WriteHolder.java @@ -28,6 +28,15 @@ public interface WriteHolder extends ConfigurationHolder { */ Map, List> writeHandlerMap(); + /** + * Is to determine if a field needs to be ignored + * + * @param fieldName + * @param columnIndex + * @return + */ + boolean ignore(String fieldName, Integer columnIndex); + /** * Whether a header is required for the currently operated cell * 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 7614489f..4de6ade6 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,12 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { * Whether the encryption */ private String password; + /** + * Write excel in memory. Default false,the cache file is created and finally written to excel. + *

+ * Comment and RichTextString are only supported in memory mode. + */ + private Boolean inMemory; public WriteWorkbookHolder(WriteWorkbook writeWorkbook) { super(writeWorkbook, null, writeWorkbook.getConvertAllFiled()); @@ -137,6 +143,11 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { } this.hasBeenInitializedSheet = new HashMap(); this.password = writeWorkbook.getPassword(); + if (writeWorkbook.getInMemory() == null) { + this.inMemory = Boolean.FALSE; + } else { + this.inMemory = writeWorkbook.getInMemory(); + } } private void copyTemplate() throws IOException { @@ -262,6 +273,14 @@ public class WriteWorkbookHolder extends AbstractWriteHolder { this.password = password; } + public Boolean getInMemory() { + return inMemory; + } + + public void setInMemory(Boolean inMemory) { + this.inMemory = inMemory; + } + @Override public HolderEnum holderType() { return HolderEnum.WORKBOOK; diff --git a/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java b/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java index fbd33c4e..b1ba891e 100644 --- a/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java +++ b/src/main/java/com/alibaba/excel/write/property/ExcelWriteHeadProperty.java @@ -17,6 +17,7 @@ import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.HeadKindEnum; import com.alibaba.excel.metadata.CellRange; import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.Holder; import com.alibaba.excel.metadata.property.ColumnWidthProperty; import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.metadata.property.ExcelHeadProperty; @@ -31,8 +32,8 @@ public class ExcelWriteHeadProperty extends ExcelHeadProperty { private RowHeightProperty headRowHeightProperty; private RowHeightProperty contentRowHeightProperty; - public ExcelWriteHeadProperty(Class headClazz, List> head, Boolean convertAllFiled) { - super(headClazz, head, convertAllFiled); + public ExcelWriteHeadProperty(Holder holder, Class headClazz, List> head, Boolean convertAllFiled) { + super(holder, headClazz, head, convertAllFiled); if (getHeadKind() != HeadKindEnum.CLASS) { return; } diff --git a/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java b/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java index 006927f9..463fea00 100644 --- a/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java +++ b/src/main/java/com/alibaba/excel/write/style/column/LongestMatchColumnWidthStyleStrategy.java @@ -21,7 +21,7 @@ import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; */ public class LongestMatchColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { - private static final int MAX_COLUMN_WIDTH = 256; + private static final int MAX_COLUMN_WIDTH = 255; private static final Map> CACHE = new HashMap>(8); diff --git a/src/test/java/com/alibaba/easyexcel/test/core/fill/FillData.java b/src/test/java/com/alibaba/easyexcel/test/core/fill/FillData.java index 13dfa17a..dcdf23f7 100644 --- a/src/test/java/com/alibaba/easyexcel/test/core/fill/FillData.java +++ b/src/test/java/com/alibaba/easyexcel/test/core/fill/FillData.java @@ -15,4 +15,5 @@ public class FillData { @NumberFormat("#") @ExcelProperty(converter = DoubleStringConverter.class) private double number; + private String empty; } 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 2582f105..ff30ae26 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 @@ -4,7 +4,9 @@ import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.IndexedColors; @@ -62,6 +64,35 @@ public class WriteTest { excelWriter.finish(); } + /** + * 根据参数只导出指定列 + *

+ * 1. 创建excel对应的实体对象 参照{@link DemoData} + *

+ * 2. 根据自己或者排除自己需要的列 + *

+ * 3. 直接写即可 + */ + @Test + public void excludeOrIncludeWrite() { + String fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx"; + + // 根据用户传入字段 假设我们要忽略 date + Set excludeColumnFiledNames = new HashSet(); + excludeColumnFiledNames.add("date"); + // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 + EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板") + .doWrite(data()); + + fileName = TestFileUtil.getPath() + "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx"; + // 根据用户传入字段 假设我们只要导出 date + Set includeColumnFiledNames = new HashSet(); + includeColumnFiledNames.add("date"); + // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 + EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("模板") + .doWrite(data()); + } + /** * 指定写入的列 *

diff --git a/src/test/java/com/alibaba/easyexcel/test/temp/simple/Wirte.java b/src/test/java/com/alibaba/easyexcel/test/temp/simple/Wirte.java index 49240d1b..698dc063 100644 --- a/src/test/java/com/alibaba/easyexcel/test/temp/simple/Wirte.java +++ b/src/test/java/com/alibaba/easyexcel/test/temp/simple/Wirte.java @@ -19,6 +19,7 @@ import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy; import com.alibaba.fastjson.JSON; import net.sf.cglib.beans.BeanMap; @@ -49,7 +50,8 @@ public class Wirte { String fileName = TestFileUtil.getPath() + "t22" + System.currentTimeMillis() + ".xlsx"; // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 - EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data()); + EasyExcel.write(fileName, DemoData.class) + .registerWriteHandler(new SimpleRowHeightStyleStrategy((short)150, (short)120)).sheet("模板").doWrite(data()); } private List> head() { diff --git a/src/test/resources/fill/simple.xls b/src/test/resources/fill/simple.xls index ea66e944309bec381e00ac115b08e64aad53a331..317ef6debac1d619c71ab6d6bc9f67952906e411 100644 GIT binary patch delta 806 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 vVW delta 4474 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 diff --git a/update.md b/update.md index d2c0cbb0..1eb3717e 100644 --- a/update.md +++ b/update.md @@ -1,3 +1,11 @@ +# 2.1.0-beta3 +* 支持强行指定在内存处理,以支持备注、RichTextString等的写入 +* 修复关闭流失败,可能会不删除临时文件的问题 +* 支持根据参数自定义导出列 +* 修改最长匹配策略的最大长度 [Issue #734](https://github.com/alibaba/easyexcel/issues/734) +* 修复策略头未生效的bug [Issue #735](https://github.com/alibaba/easyexcel/issues/735) +* 修复填充的时候有数字会异常 + # 2.1.0-beta2 * 修改模板通过流创建报错的bug * 修复空数据未替换掉的bug