diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordCellWriteHandler.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordCellWriteHandler.java new file mode 100644 index 000000000..4cc9b7790 --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordCellWriteHandler.java @@ -0,0 +1,43 @@ +/* + * 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 org.apache.fesod.excel.demo.write; + +import lombok.extern.slf4j.Slf4j; +import org.apache.fesod.excel.util.BooleanUtils; +import org.apache.fesod.excel.write.handler.CellWriteHandler; +import org.apache.fesod.excel.write.handler.context.CellWriteHandlerContext; +import org.apache.poi.ss.usermodel.Cell; + +/** + * 拦截器中单元格上下文可以获取到行数据 + */ +@Slf4j +public class RecordCellWriteHandler implements CellWriteHandler { + + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + Cell cell = context.getCell(); + + if (BooleanUtils.isFalse(context.getHead()) && cell.getColumnIndex() != 0) { + RecordData record = context.getOriginalRecord(); + log.debug("写入数据:{}", record); + } + } +} diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordData.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordData.java new file mode 100644 index 000000000..1345ba6d7 --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordData.java @@ -0,0 +1,63 @@ +/* + * 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 org.apache.fesod.excel.demo.write; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.apache.fesod.excel.annotation.ExcelProperty; + +import java.util.Date; + +/** + * Basic data class + * + * + **/ +@Getter +@Setter +@ToString +@EqualsAndHashCode +public class RecordData { + /** + * String Title + */ + @ExcelProperty("String Title") + private String string; + + /** + * Date Title + */ + @ExcelProperty("Date Title") + private Date date; + + /** + * Number Title + */ + @ExcelProperty("Number Title") + private Double doubleData; + + /** + * 通过自定义转换器转换 + */ + @ExcelProperty(converter = RecordStringStringConverter.class) + private String text; +} diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordStringStringConverter.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordStringStringConverter.java new file mode 100644 index 000000000..fd9c38d15 --- /dev/null +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/RecordStringStringConverter.java @@ -0,0 +1,59 @@ +/* + * 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 org.apache.fesod.excel.demo.write; + +import lombok.extern.slf4j.Slf4j; +import org.apache.fesod.excel.converters.Converter; +import org.apache.fesod.excel.converters.ReadConverterContext; +import org.apache.fesod.excel.converters.WriteConverterContext; +import org.apache.fesod.excel.enums.CellDataTypeEnum; +import org.apache.fesod.excel.metadata.data.WriteCellData; + +/** + * converter to the original data record + */ +@Slf4j +public class RecordStringStringConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return String.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public String convertToJavaData(ReadConverterContext context) { + return context.getReadCellData().getStringValue(); + } + + /** + * 这里是写的时候会可以访问到原始数据,你可以进行其他业务处理,然后进行转换 + */ + @Override + public WriteCellData convertToExcelData(WriteConverterContext context) { + // 获取原始数据,不需要强制类型转换 + RecordData record = context.getRecord(); + log.debug("原始数据:{}", record); + return new WriteCellData<>("自定义:" + context.getValue() + "-" + record.getDoubleData()); + } +} diff --git a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java index 6ec7b6ea1..08c0bae8f 100644 --- a/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java +++ b/fesod-examples/src/test/java/org/apache/fesod/excel/demo/write/WriteTest.java @@ -19,14 +19,6 @@ package org.apache.fesod.excel.demo.write; -import java.io.File; -import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.Set; import org.apache.fesod.excel.ExcelWriter; import org.apache.fesod.excel.FastExcel; import org.apache.fesod.excel.annotation.ExcelProperty; @@ -36,12 +28,7 @@ import org.apache.fesod.excel.annotation.write.style.ContentRowHeight; import org.apache.fesod.excel.annotation.write.style.HeadRowHeight; import org.apache.fesod.excel.enums.CellDataTypeEnum; -import org.apache.fesod.excel.metadata.data.CommentData; -import org.apache.fesod.excel.metadata.data.FormulaData; -import org.apache.fesod.excel.metadata.data.HyperlinkData; -import org.apache.fesod.excel.metadata.data.ImageData; -import org.apache.fesod.excel.metadata.data.RichTextStringData; -import org.apache.fesod.excel.metadata.data.WriteCellData; +import org.apache.fesod.excel.metadata.data.*; import org.apache.fesod.excel.util.BooleanUtils; import org.apache.fesod.excel.util.FileUtils; import org.apache.fesod.excel.util.ListUtils; @@ -58,16 +45,16 @@ import org.apache.fesod.excel.write.metadata.style.WriteFont; import org.apache.fesod.excel.write.style.HorizontalCellStyleStrategy; import org.apache.fesod.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.FillPatternType; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.junit.jupiter.api.Test; +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.*; + /** * 写的常见写法 * @@ -711,6 +698,15 @@ public void customHandlerWrite() { .doWrite(data()); } + @Test + public void recordWrite() { + String fileName = TestFileUtil.getPath() + "recordWrite" + System.currentTimeMillis() + ".xlsx"; + FastExcel.write(fileName, RecordData.class) + .registerWriteHandler(new RecordCellWriteHandler()) + .sheet("模板") + .doWrite(records()); + } + /** * 插入批注 *

@@ -844,6 +840,19 @@ private List data() { return list; } + private List records() { + List list = ListUtils.newArrayList(); + for (int i = 0; i < 10; i++) { + RecordData data = new RecordData(); + data.setString("STRING" + i); + data.setDate(new Date()); + data.setDoubleData(0.56); + data.setText("record-" + i); + list.add(data); + } + return list; + } + private List dataHex() { List list = ListUtils.newArrayList(); for (int i = 0; i < 10; i++) { diff --git a/fesod/src/main/java/org/apache/fesod/excel/converters/WriteConverterContext.java b/fesod/src/main/java/org/apache/fesod/excel/converters/WriteConverterContext.java index a3be47893..710208d02 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/converters/WriteConverterContext.java +++ b/fesod/src/main/java/org/apache/fesod/excel/converters/WriteConverterContext.java @@ -19,11 +19,7 @@ package org.apache.fesod.excel.converters; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import org.apache.fesod.excel.context.WriteContext; import org.apache.fesod.excel.metadata.property.ExcelContentProperty; @@ -44,6 +40,11 @@ public class WriteConverterContext { */ private T value; + /** + * Java row level record + */ + private Object record; + /** * Content property.Nullable. */ @@ -53,4 +54,12 @@ public class WriteConverterContext { * write context */ private WriteContext writeContext; + + @SuppressWarnings("unchecked") + public E getRecord() { + if (record == null) { + return null; + } + return (E) record; + } } diff --git a/fesod/src/main/java/org/apache/fesod/excel/write/executor/AbstractExcelWriteExecutor.java b/fesod/src/main/java/org/apache/fesod/excel/write/executor/AbstractExcelWriteExecutor.java index b6a7f6cce..93deb13bb 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/write/executor/AbstractExcelWriteExecutor.java +++ b/fesod/src/main/java/org/apache/fesod/excel/write/executor/AbstractExcelWriteExecutor.java @@ -19,7 +19,6 @@ package org.apache.fesod.excel.write.executor; -import java.util.List; import org.apache.commons.collections4.CollectionUtils; import org.apache.fesod.excel.context.WriteContext; import org.apache.fesod.excel.converters.Converter; @@ -28,31 +27,17 @@ import org.apache.fesod.excel.converters.WriteConverterContext; import org.apache.fesod.excel.enums.CellDataTypeEnum; import org.apache.fesod.excel.exception.ExcelWriteDataConvertException; -import org.apache.fesod.excel.metadata.data.CommentData; -import org.apache.fesod.excel.metadata.data.FormulaData; -import org.apache.fesod.excel.metadata.data.HyperlinkData; -import org.apache.fesod.excel.metadata.data.ImageData; -import org.apache.fesod.excel.metadata.data.WriteCellData; +import org.apache.fesod.excel.metadata.data.*; import org.apache.fesod.excel.metadata.property.ExcelContentProperty; import org.apache.fesod.excel.support.ExcelTypeEnum; -import org.apache.fesod.excel.util.DateUtils; -import org.apache.fesod.excel.util.FileTypeUtils; -import org.apache.fesod.excel.util.ListUtils; -import org.apache.fesod.excel.util.StyleUtil; -import org.apache.fesod.excel.util.WorkBookUtil; -import org.apache.fesod.excel.util.WriteHandlerUtils; +import org.apache.fesod.excel.util.*; import org.apache.fesod.excel.write.handler.context.CellWriteHandlerContext; 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.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import java.util.List; + /** * Excel write Executor * @@ -361,7 +346,7 @@ private WriteCellData doConvert(CellWriteHandlerContext cellWriteHandlerConte try { cellData = ((Converter) converter) .convertToExcelData(new WriteConverterContext<>( - cellWriteHandlerContext.getOriginalValue(), excelContentProperty, writeContext)); + cellWriteHandlerContext.getOriginalValue(), cellWriteHandlerContext.getOriginalRecord(), excelContentProperty, writeContext)); } catch (Exception e) { throw new ExcelWriteDataConvertException( cellWriteHandlerContext, diff --git a/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteAddExecutor.java b/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteAddExecutor.java index 3bf2ac040..a89250c1e 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteAddExecutor.java +++ b/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteAddExecutor.java @@ -20,11 +20,6 @@ package org.apache.fesod.excel.write.executor; import cn.idev.excel.support.cglib.beans.BeanMap; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.fesod.excel.context.WriteContext; import org.apache.fesod.excel.enums.HeadKindEnum; @@ -32,11 +27,7 @@ import org.apache.fesod.excel.metadata.FieldWrapper; import org.apache.fesod.excel.metadata.Head; import org.apache.fesod.excel.metadata.property.ExcelContentProperty; -import org.apache.fesod.excel.util.BeanMapUtils; -import org.apache.fesod.excel.util.ClassUtils; -import org.apache.fesod.excel.util.FieldUtils; -import org.apache.fesod.excel.util.WorkBookUtil; -import org.apache.fesod.excel.util.WriteHandlerUtils; +import org.apache.fesod.excel.util.*; import org.apache.fesod.excel.write.handler.context.CellWriteHandlerContext; import org.apache.fesod.excel.write.handler.context.RowWriteHandlerContext; import org.apache.fesod.excel.write.metadata.CollectionRowData; @@ -47,6 +38,8 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; +import java.util.*; + /** * Add the data into excel * @@ -153,6 +146,7 @@ private void doAddBasicTypeToExcel( WriteHandlerUtils.afterCellCreate(cellWriteHandlerContext); + cellWriteHandlerContext.setOriginalRecord(oneRowData); cellWriteHandlerContext.setOriginalValue(oneRowData.get(dataIndex)); cellWriteHandlerContext.setOriginalFieldClass( FieldUtils.getFieldClass(cellWriteHandlerContext.getOriginalValue())); @@ -199,6 +193,7 @@ private void addJavaObjectToExcel(Object oneRowData, Row row, int rowIndex, int WriteHandlerUtils.afterCellCreate(cellWriteHandlerContext); + cellWriteHandlerContext.setOriginalRecord(oneRowData); cellWriteHandlerContext.setOriginalValue(beanMap.get(name)); cellWriteHandlerContext.setOriginalFieldClass(head.getField().getType()); converterAndSet(cellWriteHandlerContext); @@ -244,6 +239,7 @@ private void addJavaObjectToExcel(Object oneRowData, Row row, int rowIndex, int WriteHandlerUtils.afterCellCreate(cellWriteHandlerContext); + cellWriteHandlerContext.setOriginalRecord(oneRowData); cellWriteHandlerContext.setOriginalValue(value); cellWriteHandlerContext.setOriginalFieldClass(FieldUtils.getFieldClass(beanMap, fieldName, value)); converterAndSet(cellWriteHandlerContext); diff --git a/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteFillExecutor.java b/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteFillExecutor.java index ab0289dc5..a686f7602 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteFillExecutor.java +++ b/fesod/src/main/java/org/apache/fesod/excel/write/executor/ExcelWriteFillExecutor.java @@ -19,16 +19,6 @@ package org.apache.fesod.excel.write.executor; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -41,25 +31,16 @@ import org.apache.fesod.excel.exception.ExcelGenerateException; import org.apache.fesod.excel.metadata.data.WriteCellData; import org.apache.fesod.excel.metadata.property.ExcelContentProperty; -import org.apache.fesod.excel.util.BeanMapUtils; -import org.apache.fesod.excel.util.ClassUtils; -import org.apache.fesod.excel.util.FieldUtils; -import org.apache.fesod.excel.util.ListUtils; -import org.apache.fesod.excel.util.MapUtils; -import org.apache.fesod.excel.util.PoiUtils; -import org.apache.fesod.excel.util.StringUtils; -import org.apache.fesod.excel.util.WriteHandlerUtils; +import org.apache.fesod.excel.util.*; import org.apache.fesod.excel.write.handler.context.CellWriteHandlerContext; import org.apache.fesod.excel.write.handler.context.RowWriteHandlerContext; import org.apache.fesod.excel.write.metadata.fill.AnalysisCell; import org.apache.fesod.excel.write.metadata.fill.FillConfig; import org.apache.fesod.excel.write.metadata.fill.FillWrapper; import org.apache.fesod.excel.write.metadata.holder.WriteSheetHolder; -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellStyle; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.*; + +import java.util.*; /** * Fill the data into excel @@ -248,6 +229,7 @@ private void doFill( cellWriteHandlerContext.setExcelContentProperty(excelContentProperty); createCell(analysisCell, fillConfig, cellWriteHandlerContext, rowWriteHandlerContext); + cellWriteHandlerContext.setOriginalRecord(oneRowData); cellWriteHandlerContext.setOriginalValue(value); cellWriteHandlerContext.setOriginalFieldClass(FieldUtils.getFieldClass(dataMap, variable, value)); @@ -285,6 +267,8 @@ private void doFill( .getHeadClazz(), variable, writeContext.currentWriteHolder()); + + cellWriteHandlerContext.setOriginalRecord(oneRowData); cellWriteHandlerContext.setOriginalValue(value); cellWriteHandlerContext.setOriginalFieldClass(FieldUtils.getFieldClass(dataMap, variable, value)); cellWriteHandlerContext.setExcelContentProperty(excelContentProperty); diff --git a/fesod/src/main/java/org/apache/fesod/excel/write/handler/context/CellWriteHandlerContext.java b/fesod/src/main/java/org/apache/fesod/excel/write/handler/context/CellWriteHandlerContext.java index c80232cff..028a25a1f 100644 --- a/fesod/src/main/java/org/apache/fesod/excel/write/handler/context/CellWriteHandlerContext.java +++ b/fesod/src/main/java/org/apache/fesod/excel/write/handler/context/CellWriteHandlerContext.java @@ -19,7 +19,6 @@ package org.apache.fesod.excel.write.handler.context; -import java.util.List; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -35,6 +34,8 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; +import java.util.List; + /** * cell context * @@ -104,6 +105,11 @@ public class CellWriteHandlerContext { */ private ExcelContentProperty excelContentProperty; + /** + * The record of the original + */ + private Object originalRecord; + /** * The value of the original */ @@ -156,4 +162,12 @@ public CellWriteHandlerContext( this.head = head; this.excelContentProperty = excelContentProperty; } + + @SuppressWarnings("unchecked") + public E getOriginalRecord() { + if (originalRecord == null) { + return null; + } + return (E) originalRecord; + } }