diff --git a/.gitignore b/.gitignore index 93472b7d..16cbd45d 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ antx.properties output/ .flattened-pom.xml dependency-reduced-pom.xml +.settings/ +*.factorypath diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java index ac2dd8dc..af82074c 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/DefaultConverterLoader.java @@ -31,8 +31,11 @@ import com.alibaba.excel.converters.inputstream.InputStreamImageConverter; import com.alibaba.excel.converters.integer.IntegerBooleanConverter; import com.alibaba.excel.converters.integer.IntegerNumberConverter; import com.alibaba.excel.converters.integer.IntegerStringConverter; -import com.alibaba.excel.converters.localdatetime.LocalDateNumberConverter; +import com.alibaba.excel.converters.localdate.LocalDateConverter; +import com.alibaba.excel.converters.localdate.LocalDateNumberConverter; +import com.alibaba.excel.converters.localdate.LocalDateStringConverter; import com.alibaba.excel.converters.localdatetime.LocalDateTimeDateConverter; +import com.alibaba.excel.converters.localdatetime.LocalDateTimeNumberConverter; import com.alibaba.excel.converters.localdatetime.LocalDateTimeStringConverter; import com.alibaba.excel.converters.longconverter.LongBooleanConverter; import com.alibaba.excel.converters.longconverter.LongNumberConverter; @@ -82,8 +85,11 @@ public class DefaultConverterLoader { putAllConverter(new DateNumberConverter()); putAllConverter(new DateStringConverter()); - putAllConverter(new LocalDateNumberConverter()); + putAllConverter(new LocalDateTimeNumberConverter()); putAllConverter(new LocalDateTimeStringConverter()); + + putAllConverter(new LocalDateNumberConverter()); + putAllConverter(new LocalDateStringConverter()); putAllConverter(new DoubleBooleanConverter()); putAllConverter(new DoubleNumberConverter()); @@ -120,6 +126,7 @@ public class DefaultConverterLoader { putWriteConverter(new BooleanBooleanConverter()); putWriteConverter(new ByteNumberConverter()); putWriteConverter(new DateDateConverter()); + putWriteConverter(new LocalDateConverter()); putWriteConverter(new LocalDateTimeDateConverter()); putWriteConverter(new DoubleNumberConverter()); putWriteConverter(new FloatNumberConverter()); @@ -139,6 +146,7 @@ public class DefaultConverterLoader { putWriteStringConverter(new BooleanStringConverter()); putWriteStringConverter(new ByteStringConverter()); putWriteStringConverter(new DateStringConverter()); + putWriteStringConverter(new LocalDateStringConverter()); putWriteStringConverter(new LocalDateTimeStringConverter()); putWriteStringConverter(new DoubleStringConverter()); putWriteStringConverter(new FloatStringConverter()); diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateConverter.java new file mode 100644 index 00000000..001d4961 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateConverter.java @@ -0,0 +1,34 @@ +package com.alibaba.excel.converters.localdate; + +import java.time.LocalDate; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.util.DateUtils; +import com.alibaba.excel.util.WorkBookUtil; + +/** + * LocalDate converter + * + * @author ywzou + */ +public class LocalDateConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return LocalDate.class; + } + + @Override + public WriteCellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + WriteCellData cellData = new WriteCellData<>(value); + String format = null; + if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) { + format = contentProperty.getDateTimeFormatProperty().getFormat(); + } + WorkBookUtil.fillDataFormat(cellData, format, DateUtils.DATE_FORMAT_10); + return cellData; + } +} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateNumberConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateNumberConverter.java new file mode 100644 index 00000000..8bd6a24e --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateNumberConverter.java @@ -0,0 +1,50 @@ +package com.alibaba.excel.converters.localdate; + +import java.math.BigDecimal; +import java.time.LocalDate; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.util.DateUtils; + +import org.apache.poi.ss.usermodel.DateUtil; + +/** + * LocalDate and number converter + * + * @author ywzou + */ +public class LocalDateNumberConverter implements Converter { + + @Override + public Class supportJavaTypeKey() { + return LocalDate.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.NUMBER; + } + + @Override + public LocalDate convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return DateUtils.getLocalDate(cellData.getNumberValue().doubleValue(), globalConfiguration.getUse1904windowing()); + } else { + return DateUtils.getLocalDate(cellData.getNumberValue().doubleValue(), contentProperty.getDateTimeFormatProperty().getUse1904windowing()); + } + } + + @Override + public WriteCellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return new WriteCellData<>(BigDecimal.valueOf(DateUtil.getExcelDate(value, globalConfiguration.getUse1904windowing()))); + } else { + return new WriteCellData<>(BigDecimal.valueOf(DateUtil.getExcelDate(value, contentProperty.getDateTimeFormatProperty().getUse1904windowing()))); + } + } +} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateStringConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateStringConverter.java new file mode 100644 index 00000000..ab2bbb53 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdate/LocalDateStringConverter.java @@ -0,0 +1,47 @@ +package com.alibaba.excel.converters.localdate; + +import java.text.ParseException; +import java.time.LocalDate; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.alibaba.excel.util.DateUtils; + +/** + * LocalDate and string converter + * + * @author ywzou + */ +public class LocalDateStringConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return LocalDate.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public LocalDate convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws ParseException { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return DateUtils.parseLocalDate(cellData.getStringValue(), null, globalConfiguration.getLocale()); + } else { + return DateUtils.parseLocalDate(cellData.getStringValue(), contentProperty.getDateTimeFormatProperty().getFormat(), globalConfiguration.getLocale()); + } + } + + @Override + public WriteCellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { + if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) { + return new WriteCellData<>(DateUtils.format(value, null, globalConfiguration.getLocale())); + } else { + return new WriteCellData<>(DateUtils.format(value, contentProperty.getDateTimeFormatProperty().getFormat(), globalConfiguration.getLocale())); + } + } +} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateNumberConverter.java b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateTimeNumberConverter.java similarity index 96% rename from easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateNumberConverter.java rename to easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateTimeNumberConverter.java index 4542fd08..51959fde 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateNumberConverter.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/converters/localdatetime/LocalDateTimeNumberConverter.java @@ -18,7 +18,7 @@ import org.apache.poi.ss.usermodel.DateUtil; * * @author Jiaju Zhuang */ -public class LocalDateNumberConverter implements Converter { +public class LocalDateTimeNumberConverter implements Converter { @Override public Class supportJavaTypeKey() { diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/data/WriteCellData.java b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/data/WriteCellData.java index f8ce9064..ef0c389c 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/metadata/data/WriteCellData.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/metadata/data/WriteCellData.java @@ -1,11 +1,13 @@ package com.alibaba.excel.metadata.data; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.Date; import java.util.List; +import org.apache.poi.ss.usermodel.CellStyle; + import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.util.ListUtils; import com.alibaba.excel.write.metadata.style.WriteCellStyle; @@ -14,7 +16,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.apache.poi.ss.usermodel.CellStyle; /** * wirte cell data @@ -29,7 +30,7 @@ public class WriteCellData extends CellData { /** * Support only when writing.{@link CellDataTypeEnum#DATE} */ - private LocalDateTime dateValue; + private Object dateValue; /** * rich text.{@link CellDataTypeEnum#RICH_TEXT_STRING} @@ -105,8 +106,18 @@ public class WriteCellData extends CellData { throw new IllegalArgumentException("DateValue can not be null"); } setType(CellDataTypeEnum.DATE); - this.dateValue = LocalDateTime.ofInstant(dateValue.toInstant(), ZoneId.systemDefault()); + // this.dateValue = LocalDateTime.ofInstant(dateValue.toInstant(), ZoneId.systemDefault()); + this.dateValue = dateValue; } + + public WriteCellData(LocalDate dateValue) { + super(); + if (dateValue == null) { + throw new IllegalArgumentException("DateValue can not be null"); + } + setType(CellDataTypeEnum.DATE); + this.dateValue = dateValue; + } public WriteCellData(LocalDateTime dateValue) { super(); diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/DateUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/DateUtils.java index fb19a105..786ce023 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/DateUtils.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/util/DateUtils.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; @@ -95,6 +96,26 @@ public class DateUtils { } } + /** + * convert string to LocalDate + * + * @param dateString + * @param dateFormat + * @param local + * @return + */ + public static LocalDate parseLocalDate(String dateString, String dateFormat, Locale local) { + if (StringUtils.isEmpty(dateFormat)) { + dateFormat = switchDateFormat(dateString); + } + + if (local == null) { + return LocalDate.parse(dateString, DateTimeFormatter.ofPattern(dateFormat)); + } else { + return LocalDate.parse(dateString, DateTimeFormatter.ofPattern(dateFormat, local)); + } + } + /** * convert string to date * @@ -198,6 +219,29 @@ public class DateUtils { public static String format(LocalDateTime date, String dateFormat) { return format(date, dateFormat, null); } + + /** + * Format date + * + * @param date + * @param dateFormat + * @return + */ + public static String format(LocalDate date, String dateFormat, Locale local) { + if (date == null) { + return null; + } + + if (StringUtils.isEmpty(dateFormat)) { + dateFormat = DATE_FORMAT_10; + } + + if (local == null) { + return date.format(DateTimeFormatter.ofPattern(dateFormat)); + } else { + return date.format(DateTimeFormatter.ofPattern(dateFormat, local)); + } + } /** * Format date @@ -271,6 +315,10 @@ public class DateUtils { return DateUtil.getLocalDateTime(date, use1904windowing, true); } + public static LocalDate getLocalDate(double date, boolean use1904windowing) { + return getLocalDateTime(date, use1904windowing).toLocalDate(); + } + /** * Determine if it is a date format. * diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java index 7f8fe0ea..ee4e85af 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java @@ -1,7 +1,22 @@ package com.alibaba.excel.write.executor; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; import java.util.List; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.Comment; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.Hyperlink; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; + import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ConverterKeyBuild; @@ -24,18 +39,6 @@ import com.alibaba.excel.util.WorkBookUtil; import com.alibaba.excel.util.WriteHandlerUtils; import com.alibaba.excel.write.handler.context.CellWriteHandlerContext; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.poi.hssf.usermodel.HSSFClientAnchor; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.ClientAnchor; -import org.apache.poi.ss.usermodel.Comment; -import org.apache.poi.ss.usermodel.CreationHelper; -import org.apache.poi.ss.usermodel.Drawing; -import org.apache.poi.ss.usermodel.Hyperlink; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFClientAnchor; - /** * Excel write Executor * @@ -92,7 +95,20 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor { cell.setCellValue(cellData.getNumberValue().doubleValue()); return; case DATE: - cell.setCellValue(cellData.getDateValue()); + // cell.setCellValue(cellData.getDateValue()); + + Object dateValue = cellData.getDateValue(); + if (dateValue instanceof Date) { + cell.setCellValue((Date) dateValue); + } + + if (dateValue instanceof LocalDate) { + cell.setCellValue((LocalDate) dateValue); + } + + if (dateValue instanceof LocalDateTime) { + cell.setCellValue((LocalDateTime) dateValue); + } return; case RICH_TEXT_STRING: cell.setCellValue(StyleUtil diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/DataEntry.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/DataEntry.java new file mode 100644 index 00000000..c42182aa --- /dev/null +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/DataEntry.java @@ -0,0 +1,114 @@ +package com.alibaba.easyexcel.test.core.localdate; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * @author ywzou + */ +public class DataEntry { + private String userName; + private int age; + private boolean hashChild; + private BigDecimal income; + private double height; + private Double weight; + +// @DateTimeFormat(value = "yyyy-MM-dd") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime birthdayTime;// yyyy-MM-dd HH:mm:ss + + @JSONField(format = "yyyy-MM-dd") + private LocalDate birthday;// yyyy-MM-dd + + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date createDate;// yyyy-MM-dd HH:mm:ss + +// @DateTimeFormat(value = "yyyy-MM-dd") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date modifyDate;// yyyy-MM-dd HH:mm:ss + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public boolean isHashChild() { + return hashChild; + } + + public void setHashChild(boolean hashChild) { + this.hashChild = hashChild; + } + + public BigDecimal getIncome() { + return income; + } + + public void setIncome(BigDecimal income) { + this.income = income; + } + + public double getHeight() { + return height; + } + + public void setHeight(double height) { + this.height = height; + } + + public Double getWeight() { + return weight; + } + + public void setWeight(Double weight) { + this.weight = weight; + } + + public LocalDateTime getBirthdayTime() { + return birthdayTime; + } + + public void setBirthdayTime(LocalDateTime birthdayTime) { + this.birthdayTime = birthdayTime; + } + + public LocalDate getBirthday() { + return birthday; + } + + public void setBirthday(LocalDate birthday) { + this.birthday = birthday; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Date getModifyDate() { + return modifyDate; + } + + public void setModifyDate(Date modifyDate) { + this.modifyDate = modifyDate; + } +} diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/EntryListener.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/EntryListener.java new file mode 100644 index 00000000..ee977792 --- /dev/null +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/EntryListener.java @@ -0,0 +1,41 @@ +package com.alibaba.easyexcel.test.core.localdate; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.fastjson.JSONObject; + +/** + * 读的监听器 + * + * @author ywzou + * + */ +public class EntryListener implements ReadListener { + + private static final Logger log = LoggerFactory.getLogger(EntryListener.class); + + private List entries = new ArrayList<>(); + + // 这个每一条数据解析都会来调用 + @Override + public void invoke(DataEntry data, AnalysisContext context) { + log.info("解析到一条数据:{}", JSONObject.toJSONString(data)); + entries.add(data); + } + + // 所有数据解析完成了 都会来调用 + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + public List getEntries() { + return entries; + } +} diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/LocalDateTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/LocalDateTest.java new file mode 100644 index 00000000..e3568ee7 --- /dev/null +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/localdate/LocalDateTest.java @@ -0,0 +1,99 @@ +package com.alibaba.easyexcel.test.core.localdate; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.easyexcel.test.util.TestFileUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson2.JSON; + +/** + * @author Jiaju Zhuang + */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class LocalDateTest { + + private static final Logger log = LoggerFactory.getLogger(LocalDateTest.class); + + // 读取 + @Test + public void read() throws Exception { + String fileName = TestFileUtil.getPath() + "localdate/local-date-time.xlsx"; + EntryListener entryListener = new EntryListener(); + EasyExcel.read(fileName, DataEntry.class, entryListener).sheet().doRead(); + log.info("读取到的数据==>{}", JSON.toJSONString(entryListener.getEntries())); + } + + // 读取 + @Test + public void read2() throws Exception { + String fileName = TestFileUtil.getPath() + "localdate/local-date-time2.xlsx"; + EntryListener entryListener = new EntryListener(); + EasyExcel.read(fileName, DataEntry.class, entryListener).sheet().doRead(); + log.info("读取到的数据==>{}", JSON.toJSONString(entryListener.getEntries())); + } + + // 写 + @Test + public void write() throws Exception { + + List entries = buildData(); + + String fileName = TestFileUtil.getPath() + "local-date-time-" + System.currentTimeMillis() + ".xlsx"; + + EasyExcel.write(fileName, DataEntry.class).sheet("demo").doWrite(entries); + } + + // 填充 + @Test + public void fill() throws Exception { + List entries = buildData(); + String templateFileName = TestFileUtil.getPath() + "localdate/local-date-time-fill.xlsx"; + + String fileName = TestFileUtil.getPath() + "local-date-time-fill-" + System.currentTimeMillis() + ".xlsx"; + + EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(entries); + } + + private List buildData() { + List entries = ListUtils.newArrayList(); + BigDecimal hundred = new BigDecimal(1000); + LocalDateTime localDateTime = LocalDateTime.now(); + LocalDate localDate = LocalDate.now(); + Date date = new Date(); + Calendar calendar = Calendar.getInstance(); + for (int i = 1; i < 11; i++) { + calendar.setTime(date); + + DataEntry item = new DataEntry(); + item.setUserName("王麻子" + i); + item.setAge(i * 10); + item.setHashChild(i % 2 > 0); + item.setIncome(hundred.multiply(new BigDecimal(i))); + item.setHeight(i % 2 > 0 ? 1.72 : 1.68); + item.setWeight(i % 2 > 0 ? 50.00 : 40.00); + item.setBirthdayTime(localDateTime.plusDays(i)); + item.setBirthday(localDate.plusDays(i)); + + calendar.add(Calendar.DAY_OF_MONTH, i); + item.setCreateDate(calendar.getTime()); + + calendar.add(Calendar.HOUR_OF_DAY, i); + item.setModifyDate(calendar.getTime()); + entries.add(item); + } + return entries; + } + +} diff --git a/easyexcel-test/src/test/resources/localdate/local-date-time-fill.xlsx b/easyexcel-test/src/test/resources/localdate/local-date-time-fill.xlsx new file mode 100644 index 00000000..4caec878 Binary files /dev/null and b/easyexcel-test/src/test/resources/localdate/local-date-time-fill.xlsx differ diff --git a/easyexcel-test/src/test/resources/localdate/local-date-time.xlsx b/easyexcel-test/src/test/resources/localdate/local-date-time.xlsx new file mode 100644 index 00000000..8c424fac Binary files /dev/null and b/easyexcel-test/src/test/resources/localdate/local-date-time.xlsx differ diff --git a/easyexcel-test/src/test/resources/localdate/local-date-time2.xlsx b/easyexcel-test/src/test/resources/localdate/local-date-time2.xlsx new file mode 100644 index 00000000..24c518b4 Binary files /dev/null and b/easyexcel-test/src/test/resources/localdate/local-date-time2.xlsx differ