Browse Source

Merge pull request #1198 from dota17/2.1.x

增加通过注解设置图片位置的特性
developing
Jiaju Zhuang 4 years ago committed by GitHub
parent
commit
1bc7b40628
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      easyexcel
  2. 61
      src/main/java/com/alibaba/excel/annotation/write/style/ImagePosition.java
  3. 10
      src/main/java/com/alibaba/excel/converters/bytearray/BoxingByteArrayImageConverter.java
  4. 13
      src/main/java/com/alibaba/excel/converters/bytearray/ByteArrayImageConverter.java
  5. 10
      src/main/java/com/alibaba/excel/converters/file/FileImageConverter.java
  6. 10
      src/main/java/com/alibaba/excel/converters/inputstream/InputStreamImageConverter.java
  7. 10
      src/main/java/com/alibaba/excel/converters/string/StringImageConverter.java
  8. 30
      src/main/java/com/alibaba/excel/metadata/CellData.java
  9. 9
      src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java
  10. 135
      src/main/java/com/alibaba/excel/metadata/property/ImagePositionProperty.java
  11. 4
      src/main/java/com/alibaba/excel/write/builder/AbstractExcelWriterParameterBuilder.java
  12. 12
      src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java
  13. 20
      src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java
  14. 40
      src/main/java/com/alibaba/excel/write/metadata/holder/AbstractWriteHolder.java
  15. 42
      src/test/java/com/alibaba/easyexcel/test/demo/write/ImageDataWithAnnotation.java
  16. 33
      src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

1
easyexcel

@ -0,0 +1 @@
Subproject commit 4076b897953b18f9e96c278c6929325e89f2be12

61
src/main/java/com/alibaba/excel/annotation/write/style/ImagePosition.java

@ -0,0 +1,61 @@
package com.alibaba.excel.annotation.write.style;
import org.apache.poi.ss.usermodel.ClientAnchor;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
/**
* This annotation is used to set the position of a picture.
* See {@link ClientAnchor}
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ImagePosition {
/**
* The x coordinate within the first cell.
*/
int dx1();
/**
* The y coordinate within the first cell.
*/
int dy1();
/**
* The x coordinate within the second cell.
*/
int dx2();
/**
* The y coordinate within the second cell
*/
int dy2();
/**
* 0-based column of the first cell.
*/
short col1();
/**
* 0-based row of the first cell.
*/
int row1();
/**
* 0-based column of the second cell.
*/
short col2();
/**
* 0-based row of the second cell.
*/
int row2();
}

10
src/main/java/com/alibaba/excel/converters/bytearray/BoxingByteArrayImageConverter.java

@ -1,5 +1,8 @@
package com.alibaba.excel.converters.bytearray; package com.alibaba.excel.converters.bytearray;
import java.lang.annotation.Annotation;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
@ -35,7 +38,12 @@ public class BoxingByteArrayImageConverter implements Converter<Byte[]> {
for (int i = 0; i < value.length; i++) { for (int i = 0; i < value.length; i++) {
byteValue[i] = value[i]; byteValue[i] = value[i];
} }
return new CellData<>(byteValue); ImagePosition imagePosition = contentProperty.getField().getAnnotation(ImagePosition.class);
if (imagePosition != null) {
return new CellData(byteValue, imagePosition);
} else {
return new CellData(byteValue);
}
} }
} }

13
src/main/java/com/alibaba/excel/converters/bytearray/ByteArrayImageConverter.java

@ -1,5 +1,8 @@
package com.alibaba.excel.converters.bytearray; package com.alibaba.excel.converters.bytearray;
import java.lang.annotation.Annotation;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
@ -23,15 +26,21 @@ public class ByteArrayImageConverter implements Converter<byte[]> {
} }
@Override @Override
public byte[] convertToJavaData(CellData<?> cellData, ExcelContentProperty contentProperty, public byte[] convertToJavaData(CellData<?> cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) { GlobalConfiguration globalConfiguration) {
throw new UnsupportedOperationException("Cannot convert images to byte arrays"); throw new UnsupportedOperationException("Cannot convert images to byte arrays");
} }
@Override @Override
public CellData<?> convertToExcelData(byte[] value, ExcelContentProperty contentProperty, public CellData convertToExcelData(byte[] value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) { GlobalConfiguration globalConfiguration) {
return new CellData<>(value); ImagePosition imagePosition = contentProperty.getField().getAnnotation(ImagePosition.class);
if (imagePosition != null) {
return new CellData(value, imagePosition);
} else {
return new CellData(value);
}
} }
} }

10
src/main/java/com/alibaba/excel/converters/file/FileImageConverter.java

@ -2,7 +2,7 @@ package com.alibaba.excel.converters.file;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
@ -35,7 +35,11 @@ public class FileImageConverter implements Converter<File> {
@Override @Override
public CellData<?> convertToExcelData(File value, ExcelContentProperty contentProperty, public CellData<?> convertToExcelData(File value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws IOException { GlobalConfiguration globalConfiguration) throws IOException {
return new CellData<>(FileUtils.readFileToByteArray(value)); ImagePosition imagePosition = contentProperty.getField().getAnnotation(ImagePosition.class);
if (imagePosition != null) {
return new CellData(FileUtils.readFileToByteArray(value), imagePosition);
} else {
return new CellData(FileUtils.readFileToByteArray(value));
}
} }
} }

10
src/main/java/com/alibaba/excel/converters/inputstream/InputStreamImageConverter.java

@ -2,12 +2,15 @@ package com.alibaba.excel.converters.inputstream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.annotation.Annotation;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.IoUtils; import com.alibaba.excel.util.IoUtils;
/** /**
@ -35,7 +38,12 @@ public class InputStreamImageConverter implements Converter<InputStream> {
@Override @Override
public CellData<?> convertToExcelData(InputStream value, ExcelContentProperty contentProperty, public CellData<?> convertToExcelData(InputStream value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws IOException { GlobalConfiguration globalConfiguration) throws IOException {
return new CellData<>(IoUtils.toByteArray(value)); ImagePosition imagePosition = contentProperty.getField().getAnnotation(ImagePosition.class);
if (imagePosition != null) {
return new CellData(IoUtils.toByteArray(value), imagePosition);
} else {
return new CellData(IoUtils.toByteArray(value));
}
} }
} }

10
src/main/java/com/alibaba/excel/converters/string/StringImageConverter.java

@ -2,13 +2,16 @@ package com.alibaba.excel.converters.string;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Annotation;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty; import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.util.FileUtils;
import com.alibaba.excel.util.IoUtils;
/** /**
* String and image converter * String and image converter
@ -35,7 +38,12 @@ public class StringImageConverter implements Converter<String> {
@Override @Override
public CellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, public CellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws IOException { GlobalConfiguration globalConfiguration) throws IOException {
return new CellData<>(FileUtils.readFileToByteArray(new File(value))); ImagePosition imagePosition = contentProperty.getField().getAnnotation(ImagePosition.class);
if (imagePosition != null) {
return new CellData(FileUtils.readFileToByteArray(new File(value)), imagePosition);
} else {
return new CellData(FileUtils.readFileToByteArray(new File(value)));
}
} }
} }

30
src/main/java/com/alibaba/excel/metadata/CellData.java

@ -1,9 +1,10 @@
package com.alibaba.excel.metadata; package com.alibaba.excel.metadata;
import java.math.BigDecimal; import java.math.BigDecimal;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import java.util.Date; import java.util.Date;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.property.ImagePositionProperty;
import com.alibaba.excel.util.StringUtils; import com.alibaba.excel.util.StringUtils;
import lombok.Getter; import lombok.Getter;
@ -35,6 +36,16 @@ public class CellData<T> extends AbstractCell {
private Boolean formula; private Boolean formula;
private String formulaValue; private String formulaValue;
private byte[] imageValue; private byte[] imageValue;
/**
* Keep the information of image position in annotation.
*/
private ImagePositionProperty imagePositionProperty;
/**
* It will be set true when using annotation to set the image's position.
*/
private Boolean useImagePositionProperty = false;
/** /**
* Support only when writing. * Support only when writing.
*/ */
@ -60,6 +71,8 @@ public class CellData<T> extends AbstractCell {
this.formula = other.formula; this.formula = other.formula;
this.formulaValue = other.formulaValue; this.formulaValue = other.formulaValue;
this.imageValue = other.imageValue; this.imageValue = other.imageValue;
this.imagePositionProperty = other.imagePositionProperty;
this.useImagePositionProperty = other.useImagePositionProperty;
this.dataFormat = other.dataFormat; this.dataFormat = other.dataFormat;
this.dataFormatString = other.dataFormatString; this.dataFormatString = other.dataFormatString;
this.data = other.data; this.data = other.data;
@ -113,6 +126,20 @@ public class CellData<T> extends AbstractCell {
this.formula = Boolean.FALSE; this.formula = Boolean.FALSE;
} }
public CellData(byte[] imageValue, ImagePosition imagePosition) {
if (imageValue == null) {
throw new IllegalArgumentException("ImageValue can not be null");
}
if (imagePosition == null) {
throw new IllegalArgumentException("ImagePosition can not be null");
}
this.type = CellDataTypeEnum.IMAGE;
this.imageValue = imageValue;
this.imagePositionProperty = ImagePositionProperty.build(imagePosition);
this.useImagePositionProperty = true;
this.formula = Boolean.FALSE;
}
public CellData(Boolean booleanValue) { public CellData(Boolean booleanValue) {
if (booleanValue == null) { if (booleanValue == null) {
throw new IllegalArgumentException("BooleanValue can not be null"); throw new IllegalArgumentException("BooleanValue can not be null");
@ -137,7 +164,6 @@ public class CellData<T> extends AbstractCell {
throw new IllegalArgumentException("Type can not be null"); throw new IllegalArgumentException("Type can not be null");
} }
this.type = type; this.type = type;
this.formula = Boolean.FALSE;
} }
/** /**

9
src/main/java/com/alibaba/excel/metadata/property/ExcelHeadProperty.java

@ -1,7 +1,9 @@
package com.alibaba.excel.metadata.property; package com.alibaba.excel.metadata.property;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.AbstractMap;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -62,7 +64,7 @@ public class ExcelHeadProperty {
*/ */
private Map<String, Field> ignoreMap; private Map<String, Field> ignoreMap;
public ExcelHeadProperty(Holder holder, Class headClazz, List<List<String>> head, Boolean convertAllFiled) { public ExcelHeadProperty(Holder holder, Class headClazz, List<List<String>> head, Boolean convertAllField) {
this.headClazz = headClazz; this.headClazz = headClazz;
headMap = new TreeMap<Integer, Head>(); headMap = new TreeMap<Integer, Head>();
contentPropertyMap = new TreeMap<Integer, ExcelContentProperty>(); contentPropertyMap = new TreeMap<Integer, ExcelContentProperty>();
@ -85,7 +87,7 @@ public class ExcelHeadProperty {
headKind = HeadKindEnum.STRING; headKind = HeadKindEnum.STRING;
} }
// convert headClazz to head // convert headClazz to head
initColumnProperties(holder, convertAllFiled); initColumnProperties(holder, convertAllField);
initHeadRowNumber(); initHeadRowNumber();
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {
@ -113,7 +115,7 @@ public class ExcelHeadProperty {
} }
} }
private void initColumnProperties(Holder holder, Boolean convertAllFiled) { private void initColumnProperties(Holder holder, Boolean convertAllField) {
if (headClazz == null) { if (headClazz == null) {
return; return;
} }
@ -132,7 +134,6 @@ public class ExcelHeadProperty {
for (Map.Entry<Integer, Field> entry : sortedAllFiledMap.entrySet()) { for (Map.Entry<Integer, Field> entry : sortedAllFiledMap.entrySet()) {
initOneColumnProperty(entry.getKey(), entry.getValue(), indexFiledMap.containsKey(entry.getKey())); initOneColumnProperty(entry.getKey(), entry.getValue(), indexFiledMap.containsKey(entry.getKey()));
} }
headKind = HeadKindEnum.CLASS;
} }
/** /**

135
src/main/java/com/alibaba/excel/metadata/property/ImagePositionProperty.java

@ -0,0 +1,135 @@
package com.alibaba.excel.metadata.property;
import com.alibaba.excel.annotation.write.style.ImagePosition;
/**
* Keep the image position information from an annotation.
*
* @author Pengliang Zhao
*/
public class ImagePositionProperty {
/**
* The x coordinate within the first cell.
*/
private int dx1;
/**
* The y coordinate within the first cell.
*/
private int dy1;
/**
* The x coordinate within the second cell.
*/
private int dx2;
/**
* The y coordinate within the second cell
*/
private int dy2;
/**
* 0-based column of the first cell.
*/
private short col1;
/**
* 0-based row of the first cell.
*/
private int row1;
/**
* 0-based column of the second cell.
*/
private short col2;
/**
* 0-based row of the second cell.
*/
private int row2;
public static ImagePositionProperty build(ImagePosition imagePosition) {
if (imagePosition == null) {
return null;
}
return new ImagePositionProperty(imagePosition.dx1(), imagePosition.dy1(), imagePosition.dx2(),
imagePosition.dy2(), imagePosition.col1(), imagePosition.row1(), imagePosition.col2(),
imagePosition.row2());
}
public ImagePositionProperty(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2) {
this.dx1 = dx1;
this.dy1 = dy1;
this.dx2 = dx2;
this.dy2 = dy2;
this.col1 = col1;
this.row1 = row1;
this.col2 = col2;
this.row2 = row2;
}
public int getDx1() {
return dx1;
}
public void setDx1(int dx1) {
this.dx1 = dx1;
}
public int getDy1() {
return dy1;
}
public void setDy1(int dy1) {
this.dy1 = dy1;
}
public int getDx2() {
return dx2;
}
public void setDx2(int dx2) {
this.dx2 = dx2;
}
public int getDy2() {
return dy2;
}
public void setDy2(int dy2) {
this.dy2 = dy2;
}
public short getCol1() {
return col1;
}
public void setCol1(short col1) {
this.col1 = col1;
}
public int getRow1() {
return row1;
}
public void setRow1(int row1) {
this.row1 = row1;
}
public short getCol2() {
return col2;
}
public void setCol2(short col2) {
this.col2 = col2;
}
public int getRow2() {
return row2;
}
public void setRow2(int row2) {
this.row2 = row2;
}
}

4
src/main/java/com/alibaba/excel/write/builder/AbstractExcelWriterParameterBuilder.java

@ -81,7 +81,7 @@ public abstract class AbstractExcelWriterParameterBuilder<T extends AbstractExce
* Ignore the custom columns. * Ignore the custom columns.
*/ */
public T excludeColumnFiledNames(Collection<String> excludeColumnFiledNames) { public T excludeColumnFiledNames(Collection<String> excludeColumnFiledNames) {
parameter().setExcludeColumnFiledNames(excludeColumnFiledNames); parameter().setExcludeColumnFieldNames(excludeColumnFiledNames);
return self(); return self();
} }
@ -97,7 +97,7 @@ public abstract class AbstractExcelWriterParameterBuilder<T extends AbstractExce
* Only output the custom columns. * Only output the custom columns.
*/ */
public T includeColumnFiledNames(Collection<String> includeColumnFiledNames) { public T includeColumnFiledNames(Collection<String> includeColumnFiledNames) {
parameter().setIncludeColumnFiledNames(includeColumnFiledNames); parameter().setIncludeColumnFieldNames(includeColumnFiledNames);
return self(); return self();
} }

12
src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java

@ -134,6 +134,17 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
} }
CreationHelper helper = sheet.getWorkbook().getCreationHelper(); CreationHelper helper = sheet.getWorkbook().getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor(); ClientAnchor anchor = helper.createClientAnchor();
if(cellData.getUseImagePositionProperty()) {
anchor.setDx1(cellData.getImagePositionProperty().getDx1());
anchor.setDx2(cellData.getImagePositionProperty().getDx2());
anchor.setDy1(cellData.getImagePositionProperty().getDy1());
anchor.setDy2(cellData.getImagePositionProperty().getDy2());
anchor.setCol1(cellData.getImagePositionProperty().getCol1());
anchor.setCol2(cellData.getImagePositionProperty().getCol2());
anchor.setRow1(cellData.getImagePositionProperty().getRow1());
anchor.setRow2(cellData.getImagePositionProperty().getRow2());
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
} else {
anchor.setDx1(0); anchor.setDx1(0);
anchor.setDx2(0); anchor.setDx2(0);
anchor.setDy1(0); anchor.setDy1(0);
@ -143,6 +154,7 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
anchor.setRow1(cell.getRowIndex()); anchor.setRow1(cell.getRowIndex());
anchor.setRow2(cell.getRowIndex() + 1); anchor.setRow2(cell.getRowIndex() + 1);
anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE); anchor.setAnchorType(ClientAnchor.AnchorType.DONT_MOVE_AND_RESIZE);
}
drawing.createPicture(anchor, index); drawing.createPicture(anchor, index);
} }
} }

20
src/main/java/com/alibaba/excel/write/metadata/WriteBasicParameter.java

@ -40,7 +40,7 @@ public class WriteBasicParameter extends BasicParameter {
/** /**
* Ignore the custom columns. * Ignore the custom columns.
*/ */
private Collection<String> excludeColumnFiledNames; private Collection<String> excludeColumnFieldNames;
/** /**
* Only output the custom columns. * Only output the custom columns.
*/ */
@ -48,7 +48,7 @@ public class WriteBasicParameter extends BasicParameter {
/** /**
* Only output the custom columns. * Only output the custom columns.
*/ */
private Collection<String> includeColumnFiledNames; private Collection<String> includeColumnFieldNames;
public Integer getRelativeHeadRowIndex() { public Integer getRelativeHeadRowIndex() {
return relativeHeadRowIndex; return relativeHeadRowIndex;
@ -98,12 +98,12 @@ public class WriteBasicParameter extends BasicParameter {
this.excludeColumnIndexes = excludeColumnIndexes; this.excludeColumnIndexes = excludeColumnIndexes;
} }
public Collection<String> getExcludeColumnFiledNames() { public Collection<String> getExcludeColumnFieldNames() {
return excludeColumnFiledNames; return excludeColumnFieldNames;
} }
public void setExcludeColumnFiledNames(Collection<String> excludeColumnFiledNames) { public void setExcludeColumnFieldNames(Collection<String> excludeColumnFieldNames) {
this.excludeColumnFiledNames = excludeColumnFiledNames; this.excludeColumnFieldNames = excludeColumnFieldNames;
} }
public Collection<Integer> getIncludeColumnIndexes() { public Collection<Integer> getIncludeColumnIndexes() {
@ -114,12 +114,12 @@ public class WriteBasicParameter extends BasicParameter {
this.includeColumnIndexes = includeColumnIndexes; this.includeColumnIndexes = includeColumnIndexes;
} }
public Collection<String> getIncludeColumnFiledNames() { public Collection<String> getIncludeColumnFieldNames() {
return includeColumnFiledNames; return includeColumnFieldNames;
} }
public void setIncludeColumnFiledNames(Collection<String> includeColumnFiledNames) { public void setIncludeColumnFieldNames(Collection<String> includeColumnFieldNames) {
this.includeColumnFiledNames = includeColumnFiledNames; this.includeColumnFieldNames = includeColumnFieldNames;
} }
} }

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

@ -87,7 +87,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
/** /**
* Ignore the custom columns. * Ignore the custom columns.
*/ */
private Collection<String> excludeColumnFiledNames; private Collection<String> excludeColumnFieldNames;
/** /**
* Only output the custom columns. * Only output the custom columns.
*/ */
@ -95,10 +95,10 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
/** /**
* Only output the custom columns. * Only output the custom columns.
*/ */
private Collection<String> includeColumnFiledNames; private Collection<String> includeColumnFieldNames;
public AbstractWriteHolder(WriteBasicParameter writeBasicParameter, AbstractWriteHolder parentAbstractWriteHolder, public AbstractWriteHolder(WriteBasicParameter writeBasicParameter, AbstractWriteHolder parentAbstractWriteHolder,
Boolean convertAllFiled) { Boolean convertAllField) {
super(writeBasicParameter, parentAbstractWriteHolder); super(writeBasicParameter, parentAbstractWriteHolder);
if (writeBasicParameter.getUse1904windowing() == null) { if (writeBasicParameter.getUse1904windowing() == null) {
if (parentAbstractWriteHolder == null) { if (parentAbstractWriteHolder == null) {
@ -155,20 +155,20 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
this.automaticMergeHead = writeBasicParameter.getAutomaticMergeHead(); this.automaticMergeHead = writeBasicParameter.getAutomaticMergeHead();
} }
if (writeBasicParameter.getExcludeColumnFiledNames() == null && parentAbstractWriteHolder != null) { if (writeBasicParameter.getExcludeColumnFieldNames() == null && parentAbstractWriteHolder != null) {
this.excludeColumnFiledNames = parentAbstractWriteHolder.getExcludeColumnFiledNames(); this.excludeColumnFieldNames = parentAbstractWriteHolder.getExcludeColumnFieldNames();
} else { } else {
this.excludeColumnFiledNames = writeBasicParameter.getExcludeColumnFiledNames(); this.excludeColumnFieldNames = writeBasicParameter.getExcludeColumnFieldNames();
} }
if (writeBasicParameter.getExcludeColumnIndexes() == null && parentAbstractWriteHolder != null) { if (writeBasicParameter.getExcludeColumnIndexes() == null && parentAbstractWriteHolder != null) {
this.excludeColumnIndexes = parentAbstractWriteHolder.getExcludeColumnIndexes(); this.excludeColumnIndexes = parentAbstractWriteHolder.getExcludeColumnIndexes();
} else { } else {
this.excludeColumnIndexes = writeBasicParameter.getExcludeColumnIndexes(); this.excludeColumnIndexes = writeBasicParameter.getExcludeColumnIndexes();
} }
if (writeBasicParameter.getIncludeColumnFiledNames() == null && parentAbstractWriteHolder != null) { if (writeBasicParameter.getIncludeColumnFieldNames() == null && parentAbstractWriteHolder != null) {
this.includeColumnFiledNames = parentAbstractWriteHolder.getIncludeColumnFiledNames(); this.includeColumnFieldNames = parentAbstractWriteHolder.getIncludeColumnFieldNames();
} else { } else {
this.includeColumnFiledNames = writeBasicParameter.getIncludeColumnFiledNames(); this.includeColumnFieldNames = writeBasicParameter.getIncludeColumnFieldNames();
} }
if (writeBasicParameter.getIncludeColumnIndexes() == null && parentAbstractWriteHolder != null) { if (writeBasicParameter.getIncludeColumnIndexes() == null && parentAbstractWriteHolder != null) {
this.includeColumnIndexes = parentAbstractWriteHolder.getIncludeColumnIndexes(); this.includeColumnIndexes = parentAbstractWriteHolder.getIncludeColumnIndexes();
@ -177,7 +177,7 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
} }
// Initialization property // Initialization property
this.excelWriteHeadProperty = new ExcelWriteHeadProperty(this, getClazz(), getHead(), convertAllFiled); this.excelWriteHeadProperty = new ExcelWriteHeadProperty(this, getClazz(), getHead(), convertAllField);
// Compatible with old code // Compatible with old code
compatibleOldCode(writeBasicParameter); compatibleOldCode(writeBasicParameter);
@ -462,10 +462,10 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
@Override @Override
public boolean ignore(String fieldName, Integer columnIndex) { public boolean ignore(String fieldName, Integer columnIndex) {
if (fieldName != null) { if (fieldName != null) {
if (includeColumnFiledNames != null && !includeColumnFiledNames.contains(fieldName)) { if (includeColumnFieldNames != null && !includeColumnFieldNames.contains(fieldName)) {
return true; return true;
} }
if (excludeColumnFiledNames != null && excludeColumnFiledNames.contains(fieldName)) { if (excludeColumnFieldNames != null && excludeColumnFieldNames.contains(fieldName)) {
return true; return true;
} }
} }
@ -545,12 +545,12 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
this.excludeColumnIndexes = excludeColumnIndexes; this.excludeColumnIndexes = excludeColumnIndexes;
} }
public Collection<String> getExcludeColumnFiledNames() { public Collection<String> getExcludeColumnFieldNames() {
return excludeColumnFiledNames; return excludeColumnFieldNames;
} }
public void setExcludeColumnFiledNames(Collection<String> excludeColumnFiledNames) { public void setExcludeColumnFieldNames(Collection<String> excludeColumnFieldNames) {
this.excludeColumnFiledNames = excludeColumnFiledNames; this.excludeColumnFieldNames = excludeColumnFieldNames;
} }
public Collection<Integer> getIncludeColumnIndexes() { public Collection<Integer> getIncludeColumnIndexes() {
@ -561,12 +561,12 @@ public abstract class AbstractWriteHolder extends AbstractHolder implements Writ
this.includeColumnIndexes = includeColumnIndexes; this.includeColumnIndexes = includeColumnIndexes;
} }
public Collection<String> getIncludeColumnFiledNames() { public Collection<String> getIncludeColumnFieldNames() {
return includeColumnFiledNames; return includeColumnFieldNames;
} }
public void setIncludeColumnFiledNames(Collection<String> includeColumnFiledNames) { public void setIncludeColumnFieldNames(Collection<String> includeColumnFieldNames) {
this.includeColumnFiledNames = includeColumnFiledNames; this.includeColumnFieldNames = includeColumnFieldNames;
} }
@Override @Override

42
src/test/java/com/alibaba/easyexcel/test/demo/write/ImageDataWithAnnotation.java

@ -0,0 +1,42 @@
package com.alibaba.easyexcel.test.demo.write;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.ImagePosition;
import com.alibaba.excel.converters.string.StringImageConverter;
import lombok.Data;
/**
* 图片导出类
*
*/
@Data
@ContentRowHeight(100)
@ColumnWidth(100 / 8)
public class ImageDataWithAnnotation {
@ImagePosition(dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0, col1 = 0, row1 = 3, col2 = 1, row2 = 4)
private File file;
@ImagePosition(dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0, col1 = 0, row1 = 1, col2 = 2, row2 = 2)
private InputStream inputStream;
/**
* 如果string类型 必须指定转换器string默认转换成string
*/
@ExcelProperty(converter = StringImageConverter.class)
@ImagePosition(dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0, col1 = 2, row1 = 1, col2 = 3, row2 = 3)
private String string;
@ImagePosition(dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0, col1 = 3, row1 = 1, col2 = 4, row2 = 5)
private byte[] byteArray;
/**
* 根据url导出
*
* @since 2.1.1
*/
@ImagePosition(dx1 = 0, dy1 = 0, dx2 = 0, dy2 = 0, col1 = 4, row1 = 1, col2 = 5, row2 = 2)
private URL url;
}

33
src/test/java/com/alibaba/easyexcel/test/demo/write/WriteTest.java

@ -257,6 +257,39 @@ public class WriteTest {
} }
} }
/**
* 使用注解设置图片位置,然后导出
* <p>
* 1. 创建excel对应的实体对象 参照{@link ImageData}
* <p>
* 2. 直接写即可
*/
@Test
public void imageWriteWithAnnotation() throws Exception {
String fileName = TestFileUtil.getPath() + "imageWriteWithAnnotation" + System.currentTimeMillis() + ".xlsx";
// 如果使用流 记得关闭
InputStream inputStream = null;
try {
List<ImageDataWithAnnotation> list = new ArrayList<ImageDataWithAnnotation>();
ImageDataWithAnnotation imageData = new ImageDataWithAnnotation();
list.add(imageData);
String imagePath = TestFileUtil.getPath() + "converter" + File.separator + "img.jpg";
// 放入五种类型的图片 实际使用只要选一种即可
imageData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));
imageData.setFile(new File(imagePath));
imageData.setString(imagePath);
inputStream = FileUtils.openInputStream(new File(imagePath));
imageData.setInputStream(inputStream);
imageData.setUrl(new URL(
"https://raw.githubusercontent.com/alibaba/easyexcel/master/src/test/resources/converter/img.jpg"));
EasyExcel.write(fileName, ImageDataWithAnnotation.class).sheet().doWrite(list);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
/** /**
* 根据模板写入 * 根据模板写入
* <p> * <p>

Loading…
Cancel
Save