diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc68ecf9..f4e30b60 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ 8, 11, 17] + java: [ 8, 11, 17, 21] distribution: [ 'adopt' ] fail-fast: false max-parallel: 4 @@ -37,7 +37,7 @@ jobs: java-version: ${{ matrix.java }} distribution: ${{ matrix.distribution }} - name: Cache local Maven repository - uses: actions/cache@v3 + uses: actions/cache@main with: path: ~/.m2/repository key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} @@ -46,7 +46,11 @@ jobs: - name: Chmod run: chmod +x mvnw - name: Test with Maven + if: ${{ matrix.java == '8' }} run: ./mvnw test -B -Dmaven.test.skip=false + - name: Test with Maven + if: ${{ matrix.java != '8' }} + run: ./mvnw test -B -Dmaven.test.skip=false -DargLine="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED" - name: Maven Build run: ./mvnw install -B -V - name: Java Doc diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3051a057..d6bba390 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,7 @@ jobs: server-username: MAVEN_USERNAME server-password: MAVEN_PASSWORD - name: Cache local Maven repository - uses: actions/cache@v3 + uses: actions/cache@main with: path: ~/.m2/repository key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} diff --git a/README.md b/README.md index cc5c9352..789337c2 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析 com.alibaba easyexcel - 3.3.4 + 4.0.1 ``` diff --git a/easyexcel-core/pom.xml b/easyexcel-core/pom.xml index 70c1e6fe..93d013cc 100644 --- a/easyexcel-core/pom.xml +++ b/easyexcel-core/pom.xml @@ -28,10 +28,6 @@ org.apache.poi poi-ooxml - - org.apache.poi - poi-ooxml-schemas - org.apache.commons commons-csv @@ -40,9 +36,5 @@ org.ehcache ehcache - - commons-io - commons-io - diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java index a2bf163d..beda8503 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -33,7 +33,6 @@ import com.alibaba.excel.util.SheetUtils; import com.alibaba.excel.util.StringUtils; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackageAccess; @@ -43,10 +42,9 @@ import org.apache.poi.openxml4j.opc.PackageRelationshipCollection; import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.ss.util.CellAddress; import org.apache.poi.xssf.eventusermodel.XSSFReader; +import org.apache.poi.xssf.model.Comments; import org.apache.poi.xssf.model.CommentsTable; -import org.apache.poi.xssf.model.SharedStringsTable; import org.apache.poi.xssf.usermodel.XSSFComment; -import org.apache.poi.xssf.usermodel.XSSFRelation; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument; @@ -123,9 +121,9 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { sheetList.add(new ReadSheet(index, ite.getSheetName())); sheetMap.put(index, inputStream); if (xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.COMMENT)) { - CommentsTable commentsTable = ite.getSheetComments(); - if (null != commentsTable) { - commentsTableMap.put(index, commentsTable); + Comments comments = ite.getSheetComments(); + if (comments instanceof CommentsTable) { + commentsTableMap.put(index, (CommentsTable) comments); } } if (xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.HYPERLINK)) { @@ -181,7 +179,7 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { } private void analysisSharedStringsTable(InputStream sharedStringsTableInputStream, - XlsxReadWorkbookHolder xlsxReadWorkbookHolder) throws Exception { + XlsxReadWorkbookHolder xlsxReadWorkbookHolder) { ContentHandler handler = new SharedStringsTableHandler(xlsxReadWorkbookHolder.getReadCache()); parseXmlSource(sharedStringsTableInputStream, handler); xlsxReadWorkbookHolder.getReadCache().putFinished(); @@ -201,7 +199,7 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { } File readTempFile = FileUtils.createCacheTmpFile(); xlsxReadWorkbookHolder.setTempFile(readTempFile); - File tempFile = new File(readTempFile.getPath(), UUID.randomUUID().toString() + ".xlsx"); + File tempFile = new File(readTempFile.getPath(), UUID.randomUUID() + ".xlsx"); if (decryptedStream != null) { FileUtils.writeToFile(tempFile, decryptedStream, false); } else { diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCell.java b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCell.java index 72beb30a..a75c5765 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCell.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCell.java @@ -227,11 +227,6 @@ public class CsvCell extends CellBase { return getCellType(); } - @Override - public CellType getCachedFormulaResultTypeEnum() { - return getCellType(); - } - @Override public String getCellFormula() { if (formulaData == null) { diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCellStyle.java b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCellStyle.java index a992f213..7a2714a0 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCellStyle.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvCellStyle.java @@ -76,7 +76,7 @@ public class CsvCellStyle implements CellStyle { } @Override - public short getFontIndex() { + public int getFontIndex() { return 0; } @@ -125,11 +125,6 @@ public class CsvCellStyle implements CellStyle { return null; } - @Override - public HorizontalAlignment getAlignmentEnum() { - return null; - } - @Override public void setWrapText(boolean wrapped) { @@ -150,11 +145,6 @@ public class CsvCellStyle implements CellStyle { return null; } - @Override - public VerticalAlignment getVerticalAlignmentEnum() { - return null; - } - @Override public void setRotation(short rotation) { @@ -185,11 +175,6 @@ public class CsvCellStyle implements CellStyle { return null; } - @Override - public BorderStyle getBorderLeftEnum() { - return null; - } - @Override public void setBorderRight(BorderStyle border) { @@ -200,11 +185,6 @@ public class CsvCellStyle implements CellStyle { return null; } - @Override - public BorderStyle getBorderRightEnum() { - return null; - } - @Override public void setBorderTop(BorderStyle border) { @@ -215,11 +195,6 @@ public class CsvCellStyle implements CellStyle { return null; } - @Override - public BorderStyle getBorderTopEnum() { - return null; - } - @Override public void setBorderBottom(BorderStyle border) { @@ -230,11 +205,6 @@ public class CsvCellStyle implements CellStyle { return null; } - @Override - public BorderStyle getBorderBottomEnum() { - return null; - } - @Override public void setLeftBorderColor(short color) { @@ -286,12 +256,12 @@ public class CsvCellStyle implements CellStyle { } @Override - public FillPatternType getFillPatternEnum() { - return null; + public void setFillBackgroundColor(short bg) { + } @Override - public void setFillBackgroundColor(short bg) { + public void setFillBackgroundColor(Color color) { } @@ -310,6 +280,11 @@ public class CsvCellStyle implements CellStyle { } + @Override + public void setFillForegroundColor(Color color) { + + } + @Override public short getFillForegroundColor() { return 0; diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvSheet.java b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvSheet.java index f3f63156..6e3db62e 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvSheet.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvSheet.java @@ -34,6 +34,8 @@ import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Footer; import org.apache.poi.ss.usermodel.Header; import org.apache.poi.ss.usermodel.Hyperlink; +import org.apache.poi.ss.usermodel.PageMargin; +import org.apache.poi.ss.usermodel.PaneType; import org.apache.poi.ss.usermodel.PrintSetup; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -406,11 +408,21 @@ public class CsvSheet implements Sheet, Closeable { return 0; } + @Override + public double getMargin(PageMargin pageMargin) { + return 0; + } + @Override public void setMargin(short margin, double size) { } + @Override + public void setMargin(PageMargin pageMargin, double v) { + + } + @Override public boolean getProtect() { return false; @@ -476,6 +488,11 @@ public class CsvSheet implements Sheet, Closeable { } + @Override + public void createSplitPane(int i, int i1, int i2, int i3, PaneType paneType) { + + } + @Override public PaneInformation getPaneInformation() { return null; diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvWorkbook.java b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvWorkbook.java index d2f0e08b..31724d99 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvWorkbook.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/csv/CsvWorkbook.java @@ -12,7 +12,9 @@ import lombok.Getter; import lombok.Setter; import org.apache.commons.compress.utils.Lists; import org.apache.poi.ss.SpreadsheetVersion; +import org.apache.poi.ss.formula.EvaluationWorkbook; import org.apache.poi.ss.formula.udf.UDFFinder; +import org.apache.poi.ss.usermodel.CellReferenceType; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.DataFormat; @@ -40,10 +42,9 @@ public class CsvWorkbook implements Workbook { /** * true if date uses 1904 windowing, or false if using 1900 date windowing. - * + *

* default is false * - * @return */ private Boolean use1904windowing; @@ -54,7 +55,7 @@ public class CsvWorkbook implements Workbook { /** * Whether to use scientific Format. - * + *

* default is false */ private Boolean useScientificFormat; @@ -200,7 +201,7 @@ public class CsvWorkbook implements Workbook { } @Override - public short getNumberOfFonts() { + public int getNumberOfFonts() { return 0; } @@ -209,11 +210,6 @@ public class CsvWorkbook implements Workbook { return 0; } - @Override - public Font getFontAt(short idx) { - return null; - } - @Override public Font getFontAt(int idx) { return null; @@ -272,31 +268,11 @@ public class CsvWorkbook implements Workbook { return null; } - @Override - public Name getNameAt(int nameIndex) { - return null; - } - @Override public Name createName() { return null; } - @Override - public int getNameIndex(String name) { - return 0; - } - - @Override - public void removeName(int index) { - - } - - @Override - public void removeName(String name) { - - } - @Override public void removeName(Name name) { @@ -417,10 +393,25 @@ public class CsvWorkbook implements Workbook { } @Override - public int addOlePackage(byte[] oleData, String label, String fileName, String command) throws IOException { + public int addOlePackage(byte[] oleData, String label, String fileName, String command) { return 0; } + @Override + public EvaluationWorkbook createEvaluationWorkbook() { + return null; + } + + @Override + public CellReferenceType getCellReferenceType() { + return null; + } + + @Override + public void setCellReferenceType(CellReferenceType cellReferenceType) { + + } + @Override public Iterator iterator() { return null; diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java index 5d3333c7..fab5a7c6 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/listener/ModelBuildEventListener.java @@ -4,7 +4,6 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Map; - import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.HeadKindEnum; @@ -15,13 +14,13 @@ import com.alibaba.excel.metadata.data.DataFormatData; import com.alibaba.excel.metadata.data.ReadCellData; import com.alibaba.excel.read.metadata.holder.ReadSheetHolder; import com.alibaba.excel.read.metadata.property.ExcelReadHeadProperty; +import com.alibaba.excel.support.cglib.beans.BeanMap; import com.alibaba.excel.util.BeanMapUtils; import com.alibaba.excel.util.ClassUtils; import com.alibaba.excel.util.ConverterUtils; import com.alibaba.excel.util.DateUtils; import com.alibaba.excel.util.MapUtils; -import org.springframework.cglib.beans.BeanMap; /** * Convert to the object the user needs diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/BeanMapUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/BeanMapUtils.java index 30b2c692..29926aa0 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/BeanMapUtils.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/BeanMapUtils.java @@ -1,7 +1,7 @@ package com.alibaba.excel.util; -import org.springframework.cglib.beans.BeanMap; -import org.springframework.cglib.core.DefaultNamingPolicy; +import com.alibaba.excel.support.cglib.beans.BeanMap; +import com.alibaba.excel.support.cglib.core.DefaultNamingPolicy; /** * bean utils diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java index f9a53e08..3f3e14a0 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/ClassUtils.java @@ -33,6 +33,7 @@ import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.metadata.property.FontProperty; import com.alibaba.excel.metadata.property.NumberFormatProperty; import com.alibaba.excel.metadata.property.StyleProperty; +import com.alibaba.excel.support.cglib.beans.BeanMap; import com.alibaba.excel.write.metadata.holder.WriteHolder; import lombok.AllArgsConstructor; @@ -41,7 +42,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.commons.collections4.CollectionUtils; -import org.springframework.cglib.beans.BeanMap; /** * Licensed to the Apache Software Foundation (ASF) under one or more diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/EasyExcelTempFileCreationStrategy.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/EasyExcelTempFileCreationStrategy.java new file mode 100644 index 00000000..ce4db733 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/EasyExcelTempFileCreationStrategy.java @@ -0,0 +1,136 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package com.alibaba.excel.util; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.FileAttribute; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.apache.poi.util.DefaultTempFileCreationStrategy; +import org.apache.poi.util.TempFileCreationStrategy; + +import static org.apache.poi.util.TempFile.JAVA_IO_TMPDIR; + +/** + * In the scenario where `poifiles` are cleaned up, the {@link DefaultTempFileCreationStrategy} will throw a + * java.nio.file.NoSuchFileException. Therefore, it is necessary to verify the existence of the temporary file every + * time it is created. + * + * @author Jiaju Zhuang + */ +public class EasyExcelTempFileCreationStrategy implements TempFileCreationStrategy { + /** + * Name of POI files directory in temporary directory. + */ + public static final String POIFILES = "poifiles"; + + /** + * To use files.deleteOnExit after clean JVM exit, set the -Dpoi.delete.tmp.files.on.exit JVM property + */ + public static final String DELETE_FILES_ON_EXIT = "poi.delete.tmp.files.on.exit"; + + /** + * The directory where the temporary files will be created (null to use the default directory). + */ + private volatile File dir; + + /** + * The lock to make dir initialized only once. + */ + private final Lock dirLock = new ReentrantLock(); + + /** + * Creates the strategy so that it creates the temporary files in the default directory. + * + * @see File#createTempFile(String, String) + */ + public EasyExcelTempFileCreationStrategy() { + this(null); + } + + /** + * Creates the strategy allowing to set the + * + * @param dir The directory where the temporary files will be created (null to use the default + * directory). + * @see Files#createTempFile(Path, String, String, FileAttribute[]) + */ + public EasyExcelTempFileCreationStrategy(File dir) { + this.dir = dir; + } + + private void createPOIFilesDirectory() throws IOException { + // Create our temp dir only once by double-checked locking + // The directory is not deleted, even if it was created by this TempFileCreationStrategy + if (dir == null || !dir.exists()) { + dirLock.lock(); + try { + if (dir == null || !dir.exists()) { + String tmpDir = System.getProperty(JAVA_IO_TMPDIR); + if (tmpDir == null) { + throw new IOException("System's temporary directory not defined - set the -D" + JAVA_IO_TMPDIR + + " jvm property!"); + } + Path dirPath = Paths.get(tmpDir, POIFILES); + dir = Files.createDirectories(dirPath).toFile(); + } + } finally { + dirLock.unlock(); + } + return; + } + } + + @Override + public File createTempFile(String prefix, String suffix) throws IOException { + // Identify and create our temp dir, if needed + createPOIFilesDirectory(); + + // Generate a unique new filename + File newFile = Files.createTempFile(dir.toPath(), prefix, suffix).toFile(); + + // Set the delete on exit flag, but only when explicitly disabled + if (System.getProperty(DELETE_FILES_ON_EXIT) != null) { + newFile.deleteOnExit(); + } + + // All done + return newFile; + } + + /* (non-JavaDoc) Created directory path is /poifiles/prefix0123456789 */ + @Override + public File createTempDirectory(String prefix) throws IOException { + // Identify and create our temp dir, if needed + createPOIFilesDirectory(); + + // Generate a unique new filename + File newDirectory = Files.createTempDirectory(dir.toPath(), prefix).toFile(); + + //this method appears to be only used in tests, so it is probably ok to use deleteOnExit + newDirectory.deleteOnExit(); + + // All done + return newDirectory; + } +} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/FieldUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/FieldUtils.java index 42cc3e4a..2d5647ca 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/FieldUtils.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/FieldUtils.java @@ -5,8 +5,7 @@ import java.lang.reflect.Modifier; import java.util.Map; import com.alibaba.excel.metadata.NullObject; - -import org.springframework.cglib.beans.BeanMap; +import com.alibaba.excel.support.cglib.beans.BeanMap; /** * Licensed to the Apache Software Foundation (ASF) under one or more diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/FileUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/FileUtils.java index d800be51..f514f6f7 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/FileUtils.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/FileUtils.java @@ -12,7 +12,6 @@ import java.util.UUID; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.exception.ExcelCommonException; -import org.apache.poi.util.DefaultTempFileCreationStrategy; import org.apache.poi.util.TempFile; /** @@ -111,7 +110,7 @@ public class FileUtils { /** * Write inputStream to file * - * @param file file + * @param file file * @param inputStream inputStream */ public static void writeToFile(File file, InputStream inputStream) { @@ -121,8 +120,8 @@ public class FileUtils { /** * Write inputStream to file * - * @param file file - * @param inputStream inputStream + * @param file file + * @param inputStream inputStream * @param closeInputStream closeInputStream */ public static void writeToFile(File file, InputStream inputStream, boolean closeInputStream) { @@ -154,11 +153,8 @@ public class FileUtils { } } - public static void createPoiFilesDirectory() { - File poiFilesPathFile = new File(poiFilesPath); - createDirectory(poiFilesPathFile); - TempFile.setTempFileCreationStrategy(new DefaultTempFileCreationStrategy(poiFilesPathFile)); + TempFile.setTempFileCreationStrategy(new EasyExcelTempFileCreationStrategy()); } public static File createCacheTmpFile() { @@ -171,7 +167,6 @@ public class FileUtils { } /** - * * @param directory */ public static File createDirectory(File directory) { diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java index 2bdd713f..d1d82cc2 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/ExcelWriteAddExecutor.java @@ -1,12 +1,10 @@ package com.alibaba.excel.write.executor; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.enums.HeadKindEnum; @@ -14,6 +12,7 @@ import com.alibaba.excel.metadata.FieldCache; import com.alibaba.excel.metadata.FieldWrapper; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.support.cglib.beans.BeanMap; import com.alibaba.excel.util.BeanMapUtils; import com.alibaba.excel.util.ClassUtils; import com.alibaba.excel.util.FieldUtils; @@ -30,7 +29,6 @@ import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; -import org.springframework.cglib.beans.BeanMap; /** * Add the data into excel diff --git a/easyexcel-support/pom.xml b/easyexcel-support/pom.xml index 20e7c937..f07d0446 100644 --- a/easyexcel-support/pom.xml +++ b/easyexcel-support/pom.xml @@ -21,11 +21,11 @@ org.springframework spring-core - 5.3.27 + 5.3.37 - org.springframework - spring-jcl + * + * @@ -49,7 +49,7 @@ true true - + org.springframework:spring-core @@ -63,6 +63,12 @@ + + + org.springframework + com.alibaba.excel.support + + diff --git a/easyexcel-test/pom.xml b/easyexcel-test/pom.xml index 94256f36..8c540b22 100644 --- a/easyexcel-test/pom.xml +++ b/easyexcel-test/pom.xml @@ -21,6 +21,7 @@ + com.alibaba easyexcel-core @@ -28,17 +29,17 @@ com.alibaba.fastjson2 fastjson2 - 2.0.29 + 2.0.51 org.springframework.boot spring-boot-starter-web - 2.7.11 + 2.7.18 org.springframework.boot spring-boot-starter-test - 2.7.11 + 2.7.18 @@ -60,7 +61,7 @@ ch.qos.logback logback-classic - 1.2.12 + 1.5.6 @@ -73,7 +74,7 @@ /com/alibaba/easyexcel/test/core/**/*.java - true + false diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatData.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatData.java index 5958161c..31cdd85d 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatData.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatData.java @@ -13,6 +13,7 @@ import lombok.Setter; public class DateFormatData { private String date; private String dateStringCn; + private String dateStringCn2; private String dateStringUs; private String number; private String numberStringCn; diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatTest.java index 43a00fae..1229b238 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/dataformat/DateFormatTest.java @@ -3,6 +3,7 @@ package com.alibaba.easyexcel.test.core.dataformat; import java.io.File; import java.util.List; import java.util.Locale; +import java.util.Objects; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; @@ -46,15 +47,22 @@ public class DateFormatTest { List list = EasyExcel.read(file, DateFormatData.class, null).locale(Locale.CHINA).sheet().doReadSync(); for (DateFormatData data : list) { - if (data.getDateStringCn() != null && !data.getDateStringCn().equals(data.getDate())) { - log.info("date:cn:{},{}", data.getDateStringCn(), data.getDate()); + if (!Objects.equals(data.getDateStringCn(), data.getDate()) && !Objects.equals(data.getDateStringCn2(), + data.getDate())) { + log.info("date:cn:{},{},{}", data.getDateStringCn(), data.getDateStringCn2(), data.getDate()); } if (data.getNumberStringCn() != null && !data.getNumberStringCn().equals(data.getNumber())) { log.info("number:cn{},{}", data.getNumberStringCn(), data.getNumber()); } } for (DateFormatData data : list) { - Assertions.assertEquals(data.getDateStringCn(), data.getDate()); + // The way dates are read in Chinese is different on Linux and Mac, so it is acceptable if it matches + // either one. + // For example, on Linux: 1-Jan -> 1-1月 + // On Mac: 1-Jan -> 1-一月 + Assertions.assertTrue( + Objects.equals(data.getDateStringCn(), data.getDate()) || Objects.equals(data.getDateStringCn2(), + data.getDate())); Assertions.assertEquals(data.getNumberStringCn(), data.getNumber()); } } diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Lock2Test.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Lock2Test.java index eba2453b..db1ead44 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Lock2Test.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Lock2Test.java @@ -26,7 +26,7 @@ import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; -import org.apache.poi.hssf.util.CellReference; +import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.IndexedColors; diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java index 509dc57e..29ac81b4 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/StyleTest.java @@ -10,7 +10,6 @@ import java.util.List; import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson2.JSON; -import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; @@ -180,7 +179,7 @@ public class StyleTest { private void isDate(Cell cell) { System.out.println( DateUtil.isADateFormat(cell.getCellStyle().getDataFormat(), cell.getCellStyle().getDataFormatString())); - System.out.println(HSSFDateUtil.isCellDateFormatted(cell)); + //System.out.println(HSSFDateUtil.isCellDateFormatted(cell)); DataFormatter f = new DataFormatter(); System.out.println(f.formatCellValue(cell)); diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/WriteV33Test.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/WriteV33Test.java index ed5b2385..5e83405d 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/WriteV33Test.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/WriteV33Test.java @@ -1,5 +1,8 @@ package com.alibaba.easyexcel.test.temp; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -135,4 +138,11 @@ public class WriteV33Test { return list; } + + @Test + public void test4() throws Exception{ + Path path= Files.createTempFile(new File("/Users/zhuangjiaju/test/test0422/test/xx").toPath(),System.currentTimeMillis()+"",".jpg"); + System.out.println(path); + } + } diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Xls03Test.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Xls03Test.java index 7d5a4490..a43525ae 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Xls03Test.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/Xls03Test.java @@ -3,14 +3,14 @@ package com.alibaba.easyexcel.test.temp; import java.util.List; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.cglib.beans.BeanMap; +import com.alibaba.excel.support.cglib.core.DebuggingClassWriter; import com.alibaba.excel.util.BeanMapUtils; import com.alibaba.fastjson2.JSON; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cglib.beans.BeanMap; -import org.springframework.cglib.core.DebuggingClassWriter; /** * 临时测试 diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/dataformat/DataFormatter1.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/dataformat/DataFormatter1.java index 6af972ef..bb143e85 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/dataformat/DataFormatter1.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/dataformat/DataFormatter1.java @@ -38,6 +38,7 @@ import java.util.Observer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.alibaba.excel.analysis.ExcelAnalyserImpl; import org.apache.poi.ss.format.CellFormat; import org.apache.poi.ss.format.CellFormatResult; import org.apache.poi.ss.formula.ConditionalFormattingEvaluator; @@ -54,8 +55,8 @@ import org.apache.poi.ss.usermodel.FractionFormat; import org.apache.poi.ss.util.DateFormatConverter; import org.apache.poi.ss.util.NumberToTextConverter; import org.apache.poi.util.LocaleUtil; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * DataFormatter contains methods for formatting the value stored in an Cell. This can be useful for reports and GUI @@ -245,7 +246,7 @@ public class DataFormatter1 implements Observer { /** * For logging any problems we find */ - private static POILogger logger = POILogFactory.getLogger(DataFormatter.class); + private static final Logger logger = LoggerFactory.getLogger(ExcelAnalyserImpl.class); /** * Creates a formatter using the {@link Locale#getDefault() default locale}. @@ -358,7 +359,7 @@ public class DataFormatter1 implements Observer { // Wrap and return (non-cachable - CellFormat does that) return new CellFormatResultWrapper(cfmt.apply(cellValueO)); } catch (Exception e) { - logger.log(POILogger.WARN, "Formatting failed for format " + formatStr + ", falling back", e); + logger.warn("Formatting failed for format {}, falling back", formatStr, e); } } @@ -598,7 +599,7 @@ public class DataFormatter1 implements Observer { try { return new ExcelStyleDateFormatter(formatStr, dateSymbols); } catch (IllegalArgumentException iae) { - logger.log(POILogger.DEBUG, "Formatting failed for format " + formatStr + ", falling back", iae); + logger.debug("Formatting failed for format {}, falling back", formatStr, iae); // the pattern could not be parsed correctly, // so fall back to the default number format return getDefaultFormat(cellValue); @@ -759,7 +760,7 @@ public class DataFormatter1 implements Observer { try { return new InternalDecimalFormatWithScale(format, symbols); } catch (IllegalArgumentException iae) { - logger.log(POILogger.DEBUG, "Formatting failed for format " + formatStr + ", falling back", iae); + logger.debug("Formatting failed for format {}, falling back", formatStr, iae); // the pattern could not be parsed correctly, // so fall back to the default number format return getDefaultFormat(cellValue); diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/large/TempLargeDataTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/large/TempLargeDataTest.java index b88bf06e..246656c1 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/large/TempLargeDataTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/large/TempLargeDataTest.java @@ -8,7 +8,6 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; -import com.alibaba.easyexcel.test.core.large.LargeDataTest; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; @@ -31,7 +30,7 @@ import org.slf4j.LoggerFactory; public class TempLargeDataTest { - private static final Logger LOGGER = LoggerFactory.getLogger(LargeDataTest.class); + private static final Logger LOGGER = LoggerFactory.getLogger(TempLargeDataTest.class); private int i = 0; private static File fileFill07; diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/write/TempWriteTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/write/TempWriteTest.java index 8c75deab..9f66a507 100644 --- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/write/TempWriteTest.java +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/write/TempWriteTest.java @@ -8,6 +8,7 @@ import java.util.Map; import com.alibaba.easyexcel.test.demo.read.CustomStringStringConverter; import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.cglib.beans.BeanMap; import com.alibaba.excel.util.BeanMapUtils; import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.util.ListUtils; @@ -24,7 +25,6 @@ import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.jupiter.api.Test; -import org.springframework.cglib.beans.BeanMap; @Slf4j public class TempWriteTest { diff --git a/easyexcel-test/src/test/resources/dataformat/dataformat.xls b/easyexcel-test/src/test/resources/dataformat/dataformat.xls index c8afd646..95c306ce 100644 Binary files a/easyexcel-test/src/test/resources/dataformat/dataformat.xls and b/easyexcel-test/src/test/resources/dataformat/dataformat.xls differ diff --git a/easyexcel-test/src/test/resources/dataformat/dataformat.xlsx b/easyexcel-test/src/test/resources/dataformat/dataformat.xlsx index f77dd9fd..34a05cc9 100644 Binary files a/easyexcel-test/src/test/resources/dataformat/dataformat.xlsx and b/easyexcel-test/src/test/resources/dataformat/dataformat.xlsx differ diff --git a/pom.xml b/pom.xml index 358a2846..44dd0796 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ - 3.3.4 + 4.0.1 UTF-8 1.8 true @@ -90,48 +90,40 @@ com.alibaba easyexcel-support - ${revision} + 3.3.4 org.apache.poi poi - 4.1.2 + 5.2.5 org.apache.poi poi-ooxml - 4.1.2 - - - org.apache.poi - poi-ooxml-schemas - 4.1.2 + 5.2.5 org.apache.commons commons-csv - 1.8 - - - org.slf4j - slf4j-api - 1.7.32 + 1.11.0 org.ehcache ehcache - 3.9.9 + 3.9.11 - org.projectlombok - lombok - 1.18.20 + org.slf4j + slf4j-api + 1.7.36 + + - commons-io - commons-io - 2.11.0 + org.projectlombok + lombok + 1.18.32 @@ -193,12 +185,12 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.2 + 3.3.0 org.apache.maven.plugins maven-shade-plugin - 3.2.4 + 3.6.0 org.codehaus.mojo @@ -238,11 +230,13 @@ com/alibaba/excel/metadata/DataFormatter.java com/alibaba/excel/util/DateUtils.java com/alibaba/excel/util/MapUtils.java + com/alibaba/excel/util/EasyExcelTempFileCreationStrategy.java com/alibaba/excel/metadata/format/DataFormatter.java com/alibaba/excel/metadata/format/ExcelGeneralNumberFormat.java com/alibaba/excel/metadata/csv/CsvDataFormat.java com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java com/alibaba/excel/analysis/v07/handlers/sax/SharedStringsTableHandler.java + com/alibaba/excel/write/executor/ExcelWriteFillExecutor.java @@ -321,31 +315,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - - - package - - shade - - - - - ${project.groupId}:${project.artifactId} - - - - - org.springframework - com.alibaba.excel.support - - - - - - org.codehaus.mojo diff --git a/update.md b/update.md index a8f95564..6b141fff 100644 --- a/update.md +++ b/update.md @@ -1,3 +1,16 @@ +# 4.0.1 + +* `commons-io` 修改为依赖 `poi`的版本 +* 修复临时目录被清理可能提示`NoSuchFileException`的异常 + +# 4.0.0 + +* `poi`由`4.1.2`升级到`5.2.5` +* `commons-csv`由`1.1.0`升级到`1.10.0` +* `slf4j-api`由`1.7.32`升级到`1.7.36` +* `ehcache`由`3.9.9`升级到`3.9.11` +* 支持`jdk21` + # 3.3.4 * 支持停止单个`sheet`以后继续读取其他`sheet`,使用`ExcelAnalysisStopSheetException`