{
*
* 1. 当前行游标归零
* 2. 清空别名比较器
+ * 3. 清除标题缓存
*
*
* @return this
@@ -200,6 +203,7 @@ public class ExcelWriter extends ExcelBase {
public ExcelWriter reset() {
resetRow();
this.aliasComparator = null;
+ this.headLocationCache = null;
return this;
}
@@ -776,7 +780,16 @@ public class ExcelWriter extends ExcelBase {
*/
public ExcelWriter writeHeadRow(Iterable> rowData) {
Assert.isFalse(this.isClosed, "ExcelWriter has been closed!");
- RowUtil.writeRow(this.sheet.createRow(this.currentRow.getAndIncrement()), rowData, this.styleSet, true);
+ this.headLocationCache = new ConcurrentHashMap<>();
+ final Row row = this.sheet.createRow(this.currentRow.getAndIncrement());
+ int i = 0;
+ Cell cell;
+ for (Object value : rowData) {
+ cell = row.createCell(i);
+ CellUtil.setCellValue(cell, value, this.styleSet, true);
+ this.headLocationCache.put(StrUtil.toString(value), i);
+ i++;
+ }
return this;
}
@@ -842,7 +855,20 @@ public class ExcelWriter extends ExcelBase {
if (isWriteKeyAsHead) {
writeHeadRow(aliasMap.keySet());
}
- writeRow(aliasMap.values());
+
+ // 如果已经写出标题行,根据标题行找对应的值写入
+ if(MapUtil.isNotEmpty(this.headLocationCache)){
+ final Row row = RowUtil.getOrCreateRow(this.sheet, this.currentRow.getAndIncrement());
+ Integer location;
+ for (Entry, ?> entry : aliasMap.entrySet()) {
+ location = this.headLocationCache.get(StrUtil.toString(entry.getKey()));
+ if(null != location){
+ CellUtil.setCellValue(CellUtil.getOrCreateCell(row, location), entry.getValue(), this.styleSet, false);
+ }
+ }
+ } else{
+ writeRow(aliasMap.values());
+ }
return this;
}
diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java
index 88015027c..48028a61c 100644
--- a/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java
+++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/test/ExcelWriteTest.java
@@ -1,28 +1,29 @@
package cn.hutool.poi.excel.test;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import cn.hutool.core.util.IdUtil;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.junit.Ignore;
-import org.junit.Test;
-
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.style.StyleUtil;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
/**
* 写出Excel单元测试
@@ -75,7 +76,7 @@ public class ExcelWriteTest {
rows.add(ObjectUtil.clone(row1));
}
- String filePath = "f:/test/writeTest.xlsx";
+ String filePath = "d:/test/writeTest.xlsx";
FileUtil.del(filePath);
// 通过工具类创建writer
ExcelWriter writer = ExcelUtil.getWriter(filePath);
@@ -105,7 +106,7 @@ public class ExcelWriteTest {
List> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);
// 通过工具类创建writer
- ExcelWriter writer = ExcelUtil.getWriter("e:/mergeTest.xlsx");
+ ExcelWriter writer = ExcelUtil.getWriter("d:/test/mergeTest.xlsx");
CellStyle style = writer.getStyleSet().getHeadCellStyle();
StyleUtil.setColor(style, IndexedColors.RED, FillPatternType.SOLID_FOREGROUND);
@@ -143,7 +144,7 @@ public class ExcelWriteTest {
ArrayList