2026/3/30 2:57:13
网站建设
项目流程
营销型网站具备的二大能力,wordpress 账号图片尺寸,网站开发报价评估,青岛市建筑工程管理服务中心明白了#xff0c;你这个需求是 反过来的场景 #x1f447;#xff1a; ✅ EasyExcel 动态列导出时 希望#xff1a; 看起来是“文本”的值#xff08;比如 12.5、100#xff09;在 Excel 中是【数值格式】可以参与公式计算#xff08;SUM、AVG…明白了你这个需求是反过来的场景✅ EasyExcel 动态列导出时希望看起来是“文本”的值比如12.5、100在 Excel 中是【数值格式】可以参与公式计算SUM、AVG 等而不是被当成【文本】也就是说❌ 当前问题被导出成“文本格式”Excel 公式算不了✅ 目标导出成真正的 Number 类型 核心原则Excel 是否可参与函数计算取决于单元格类型是否是 NUMERIC而不是 STRING你现在用的是动态列head Map / ListList常见错误是map.put(金额,123.45);// StringExcel 会当成文本。正确做法是放 Number 类型而不是 Stringmap.put(金额,newBigDecimal(123.45));// 或map.put(金额,123.45);// 或map.put(金额,Integer.valueOf(100));✅ 方案一最推荐Map 中数值字段用 Number 类型表头ListListStringheadArrays.asList(Collections.singletonList(商品),Collections.singletonList(金额));数据ListMapString,ObjectdatanewArrayList();MapString,ObjectrownewLinkedHashMap();row.put(商品,苹果);// Stringrow.put(金额,newBigDecimal(12.5));// Numberdata.add(row);导出EasyExcel.write(out).head(head).sheet(sheet1).doWrite(data);这样 Excel 中“金额”列是数值可以SUM(B2:B10)不会变成文本✅ 方案二如果你现在的数据是 String → 转成 Number很多时候数据来自数据库或前端全是 String例如row.put(金额,123.45);你需要在导出前转换StringmoneyStr(String)row.get(金额);row.put(金额,newBigDecimal(moneyStr));或者统一处理Objectvaluerow.get(key);if(valueinstanceofStringvalue.toString().matches(-?\\d(\\.\\d)?)){row.put(key,newBigDecimal(value.toString()));}✅ 方案三自定义 Converter动态列场景也可用如果你想自动把 String 数字转为 NumberpublicclassStringToNumberConverterimplementsConverterString{OverridepublicClass?supportJavaTypeKey(){returnString.class;}OverridepublicCellDataTypeEnumsupportExcelTypeKey(){returnCellDataTypeEnum.NUMBER;}OverridepublicWriteCellData?convertToExcelData(Stringvalue,ExcelContentPropertycontentProperty,GlobalConfigurationglobalConfiguration){if(valuenull)returnnewWriteCellData();returnnewWriteCellData(newBigDecimal(value));}}注册EasyExcel.write(out).head(head).registerConverter(newStringToNumberConverter()).doWrite(data);⚠️ 注意要保证传进来的 String 真的是数字否则会异常。 不要做的事会导致不能计算❌ 1. 设置成文本格式writeCellStyle.setDataFormat((short)49);// 文本格式这会导致 Excel 永远当字符串。❌ 2. 在前面加123.45❌ 3. 所有值都用 StringMapString,Object全是String 推荐实践动态列 可计算LinkedHashMap 区分类型row.put(姓名,张三);// Stringrow.put(数量,10);// Integerrow.put(单价,newBigDecimal(12.5));row.put(总价,newBigDecimal(125));Excel 中数量、单价、总价 → 数值可 SUM / AVG / 公式计算姓名仍是文本 总结一句话✅ 动态列导出要能函数计算Map 里放 Number不要放 String如果你愿意可以把你现在的代码片段贴出来head data 部分比如ListMapString,Objectdata...我可以帮你改成✅ 哪些字段是文本✅ 哪些字段是数值✅ Excel 中可以直接 SUM 的正确写法你现在遇到的是1️⃣ 所有列都变成文本公式算不了2️⃣ 只有部分列算不了3️⃣ 数据来自数据库 String4️⃣ 想自动识别数字字符串告诉我是哪一种我给你最精准方案。