Browse Source

Merge pull request #2172 from alibaba/developing

Developing
pull/1846/merge v3.0.3
Jiaju Zhuang 3 years ago committed by GitHub
parent
commit
e9d73d9c53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 2
      pom.xml
  3. 9
      src/main/java/com/alibaba/excel/read/listener/PageReadListener.java
  4. 15
      src/main/java/com/alibaba/excel/util/BooleanUtils.java
  5. 17
      src/main/java/com/alibaba/excel/util/ClassUtils.java
  6. 17
      src/main/java/com/alibaba/excel/util/FieldUtils.java
  7. 14
      src/main/java/com/alibaba/excel/util/FileUtils.java
  8. 15
      src/main/java/com/alibaba/excel/util/MemberUtils.java
  9. 15
      src/main/java/com/alibaba/excel/util/Validate.java
  10. 8
      src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java
  11. 60
      src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationDataTest.java
  12. 3
      src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationIndexAndNameDataTest.java
  13. 33
      src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationStyleData.java
  14. 3
      update.md

2
README.md

@ -41,7 +41,7 @@ Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
<version>3.0.2</version> <version>3.0.3</version>
</dependency> </dependency>
``` ```

2
pom.xml

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
<version>3.0.2</version> <version>3.0.3</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>easyexcel</name> <name>easyexcel</name>

9
src/main/java/com/alibaba/excel/read/listener/PageReadListener.java

@ -6,6 +6,8 @@ import java.util.function.Consumer;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.util.ListUtils; import com.alibaba.excel.util.ListUtils;
import org.apache.commons.collections4.CollectionUtils;
/** /**
* page read listener * page read listener
* *
@ -15,7 +17,7 @@ public class PageReadListener<T> implements ReadListener<T> {
/** /**
* Single handle the amount of data * Single handle the amount of data
*/ */
public static final int BATCH_COUNT = 3000; public static int BATCH_COUNT = 3000;
/** /**
* Temporary storage of data * Temporary storage of data
*/ */
@ -34,14 +36,15 @@ public class PageReadListener<T> implements ReadListener<T> {
cachedData.add(data); cachedData.add(data);
if (cachedData.size() >= BATCH_COUNT) { if (cachedData.size() >= BATCH_COUNT) {
consumer.accept(cachedData); consumer.accept(cachedData);
// 存储完成清理 list
cachedData = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); cachedData = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
} }
} }
@Override @Override
public void doAfterAllAnalysed(AnalysisContext context) { public void doAfterAllAnalysed(AnalysisContext context) {
consumer.accept(cachedData); if (CollectionUtils.isNotEmpty(cachedData)) {
consumer.accept(cachedData);
}
} }
} }

15
src/main/java/com/alibaba/excel/util/BooleanUtils.java

@ -1,9 +1,20 @@
package com.alibaba.excel.util; package com.alibaba.excel.util;
/** /**
* boolean util * 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
* *
* @author Jiaju Zhuang * 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.
*
* @author Apache Software Foundation (ASF)
*/ */
public class BooleanUtils { public class BooleanUtils {

17
src/main/java/com/alibaba/excel/util/ClassUtils.java

@ -38,10 +38,21 @@ import lombok.Setter;
import net.sf.cglib.beans.BeanMap; import net.sf.cglib.beans.BeanMap;
/** /**
* Class utils * 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
* *
* @author Jiaju Zhuang * 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.
*
* @author Apache Software Foundation (ASF)
*/
public class ClassUtils { public class ClassUtils {
public static final Map<Class<?>, FieldCache> FIELD_CACHE = new ConcurrentHashMap<>(); public static final Map<Class<?>, FieldCache> FIELD_CACHE = new ConcurrentHashMap<>();

17
src/main/java/com/alibaba/excel/util/FieldUtils.java

@ -9,10 +9,21 @@ import com.alibaba.excel.metadata.NullObject;
import net.sf.cglib.beans.BeanMap; import net.sf.cglib.beans.BeanMap;
/** /**
* Field utils * 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
* *
* @author Jiaju Zhuang * 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.
*
* @author Apache Software Foundation (ASF)
*/
public class FieldUtils { public class FieldUtils {
public static Class<?> nullObjectClass = NullObject.class; public static Class<?> nullObjectClass = NullObject.class;

14
src/main/java/com/alibaba/excel/util/FileUtils.java

@ -16,8 +16,20 @@ import org.apache.poi.util.DefaultTempFileCreationStrategy;
import org.apache.poi.util.TempFile; import org.apache.poi.util.TempFile;
/** /**
* 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
* *
* @author jipengfei * 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.
*
* @author Apache Software Foundation (ASF)
*/ */
public class FileUtils { public class FileUtils {
public static final String POI_FILES = "poifiles"; public static final String POI_FILES = "poifiles";

15
src/main/java/com/alibaba/excel/util/MemberUtils.java

@ -5,9 +5,20 @@ import java.lang.reflect.Member;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
/** /**
* Member utils. * 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
* *
* @author Jiaju Zhuang * 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.
*
* @author Apache Software Foundation (ASF)
*/ */
public class MemberUtils { public class MemberUtils {

15
src/main/java/com/alibaba/excel/util/Validate.java

@ -3,9 +3,20 @@ package com.alibaba.excel.util;
import java.util.Objects; import java.util.Objects;
/** /**
* Validate * 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
* *
* @author Jiaju Zhuang * 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.
*
* @author Apache Software Foundation (ASF)
*/ */
public class Validate { public class Validate {

8
src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java

@ -273,9 +273,11 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
@Override @Override
protected WriteCellStyle headCellStyle(CellWriteHandlerContext context) { protected WriteCellStyle headCellStyle(CellWriteHandlerContext context) {
ExcelContentProperty excelContentProperty = context.getExcelContentProperty(); Head head = context.getHeadData();
return WriteCellStyle.build(excelContentProperty.getContentStyleProperty(), if (head == null) {
excelContentProperty.getContentFontProperty()); return null;
}
return WriteCellStyle.build(head.getHeadStyleProperty(), head.getHeadFontProperty());
} }
@Override @Override

60
src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationDataTest.java

@ -4,31 +4,40 @@ import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.alibaba.easyexcel.test.core.StyleTestUtils;
import com.alibaba.easyexcel.test.util.TestFileUtil; import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.DateUtils; import com.alibaba.excel.util.DateUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.junit.Assert; import org.junit.Assert;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test; import org.junit.Test;
import org.junit.runners.MethodSorters;
/** /**
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class AnnotationDataTest { public class AnnotationDataTest {
private static File file07; private static File file07;
private static File file03; private static File file03;
private static File fileCsv; private static File fileCsv;
private static File fileStyle07;
private static File fileStyle03;
@BeforeClass @BeforeClass
public static void init() { public static void init() {
file07 = TestFileUtil.createNewFile("annotation07.xlsx"); file07 = TestFileUtil.createNewFile("annotation07.xlsx");
file03 = TestFileUtil.createNewFile("annotation03.xls"); file03 = TestFileUtil.createNewFile("annotation03.xls");
fileStyle07 = TestFileUtil.createNewFile("annotationStyle07.xlsx");
fileStyle03 = TestFileUtil.createNewFile("annotationStyle03.xls");
fileCsv = TestFileUtil.createNewFile("annotationCsv.csv"); fileCsv = TestFileUtil.createNewFile("annotationCsv.csv");
} }
@ -47,10 +56,46 @@ public class AnnotationDataTest {
readAndWrite(fileCsv); readAndWrite(fileCsv);
} }
@Test
public void t11WriteStyle07() throws Exception {
writeStyle(fileStyle07);
}
@Test
public void t12Write03() throws Exception {
writeStyle(fileStyle03);
}
private void writeStyle(File file) throws Exception {
EasyExcel.write().file(file).head(AnnotationStyleData.class).sheet().doWrite(dataStyle());
Workbook workbook = WorkbookFactory.create(file);
Sheet sheet = workbook.getSheetAt(0);
Row row0 = sheet.getRow(0);
Cell cell00 = row0.getCell(0);
Assert.assertArrayEquals(new byte[] {-1, 0, -1}, StyleTestUtils.getFillForegroundColor(cell00));
Assert.assertArrayEquals(new byte[] {-1, -52, 0}, StyleTestUtils.getFontColor(cell00, workbook));
Assert.assertEquals(40, StyleTestUtils.getFontHeightInPoints(cell00, workbook));
Cell cell01 = row0.getCell(1);
Assert.assertArrayEquals(new byte[] {-1, 0, 0}, StyleTestUtils.getFillForegroundColor(cell01));
Assert.assertArrayEquals(new byte[] {0, -1, -1}, StyleTestUtils.getFontColor(cell01, workbook));
Assert.assertEquals(20, StyleTestUtils.getFontHeightInPoints(cell01, workbook));
Row row1 = sheet.getRow(1);
Cell cell10 = row1.getCell(0);
Assert.assertArrayEquals(new byte[] {0, -52, -1}, StyleTestUtils.getFillForegroundColor(cell10));
Assert.assertArrayEquals(new byte[] {0, 0, -1}, StyleTestUtils.getFontColor(cell10, workbook));
Assert.assertEquals(50, StyleTestUtils.getFontHeightInPoints(cell10, workbook));
Cell cell11 = row1.getCell(1);
Assert.assertArrayEquals(new byte[] {0, -128, 0}, StyleTestUtils.getFillForegroundColor(cell11));
Assert.assertArrayEquals(new byte[] {-64, -64, -64}, StyleTestUtils.getFontColor(cell11, workbook));
Assert.assertEquals(30, StyleTestUtils.getFontHeightInPoints(cell11, workbook));
}
private void readAndWrite(File file) throws Exception { private void readAndWrite(File file) throws Exception {
EasyExcel.write().file(file).head(AnnotationData.class).sheet().doWrite(data()); EasyExcel.write().file(file).head(AnnotationData.class).sheet().doWrite(dataStyle());
EasyExcel.read().file(file).head(AnnotationData.class).registerReadListener(new AnnotationDataListener())
.sheet().doRead();
if (file == fileCsv) { if (file == fileCsv) {
return; return;
@ -67,6 +112,15 @@ public class AnnotationDataTest {
Assert.assertEquals(2000, row1.getHeight(), 0); Assert.assertEquals(2000, row1.getHeight(), 0);
} }
private List<AnnotationStyleData> dataStyle() throws Exception {
List<AnnotationStyleData> list = new ArrayList<>();
AnnotationStyleData data = new AnnotationStyleData();
data.setString("string");
data.setString1("string1");
list.add(data);
return list;
}
private List<AnnotationData> data() throws Exception { private List<AnnotationData> data() throws Exception {
List<AnnotationData> list = new ArrayList<>(); List<AnnotationData> list = new ArrayList<>();
AnnotationData data = new AnnotationData(); AnnotationData data = new AnnotationData();

3
src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationIndexAndNameDataTest.java

@ -8,13 +8,16 @@ import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test; import org.junit.Test;
import org.junit.runners.MethodSorters;
/** /**
* Annotation data test * Annotation data test
* *
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class AnnotationIndexAndNameDataTest { public class AnnotationIndexAndNameDataTest {
private static File file07; private static File file07;

33
src/test/java/com/alibaba/easyexcel/test/core/annotation/AnnotationStyleData.java

@ -0,0 +1,33 @@
package com.alibaba.easyexcel.test.core.annotation;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
/**
* @author Jiaju Zhuang
*/
@Getter
@Setter
@EqualsAndHashCode
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
@HeadFontStyle(fontHeightInPoints = 20, color = 15)
@ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
@ContentFontStyle(fontHeightInPoints = 30, color = 22)
public class AnnotationStyleData {
@ExcelProperty("字符串")
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
@HeadFontStyle(fontHeightInPoints = 40, color = 51)
@ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
@ContentFontStyle(fontHeightInPoints = 50, color = 12)
private String string;
@ExcelProperty("字符串1")
private String string1;
}

3
update.md

@ -1,3 +1,6 @@
# 3.0.3
* 修复`HeadStyle`无效的bug
# 3.0.2 # 3.0.2
* 大幅提升读写性能 * 大幅提升读写性能
* 修复列宽注解没用的bug [Issue #2151](https://github.com/alibaba/easyexcel/issues/2151) * 修复列宽注解没用的bug [Issue #2151](https://github.com/alibaba/easyexcel/issues/2151)

Loading…
Cancel
Save