数学建模30个常用算法Python代码:预测分类优化评价全覆盖
2026/10/3 9:23:57
明白了,你这个需求是反过来的场景👇:
✅ EasyExcel 动态列导出时
希望:
- 看起来是“文本”的值(比如
"12.5"、"100")- 在 Excel 中是【数值格式】
- 可以参与公式计算(SUM、AVG 等)
- 而不是被当成【文本】
也就是说:
❌ 当前问题:被导出成“文本格式”,Excel 公式算不了
✅ 目标:导出成真正的 Number 类型
Excel 是否可参与函数计算,取决于单元格类型是否是 NUMERIC,而不是 STRING
你现在用的是动态列(head + Map / List<List>),常见错误是:
map.put("金额","123.45");// StringExcel 会当成文本。
正确做法是:👇
👉放 Number 类型,而不是 String
map.put("金额",newBigDecimal("123.45"));// 或map.put("金额",123.45);// 或map.put("金额",Integer.valueOf(100));List<List<String>>head=Arrays.asList(Collections.singletonList("商品"),Collections.singletonList("金额"));List<Map<String,Object>>data=newArrayList<>();Map<String,Object>row=newLinkedHashMap<>();row.put("商品","苹果");// Stringrow.put("金额",newBigDecimal("12.5"));// Numberdata.add(row);EasyExcel.write(out).head(head).sheet("sheet1").doWrite(data);这样 Excel 中:
=SUM(B2:B10)很多时候数据来自数据库或前端,全是 String,例如:
row.put("金额","123.45");你需要在导出前转换:
StringmoneyStr=(String)row.get("金额");row.put("金额",newBigDecimal(moneyStr));或者统一处理:
Objectvalue=row.get(key);if(valueinstanceofString&&value.toString().matches("-?\\d+(\\.\\d+)?")){row.put(key,newBigDecimal(value.toString()));}如果你想自动把 String 数字转为 Number:
publicclassStringToNumberConverterimplementsConverter<String>{@OverridepublicClass<?>supportJavaTypeKey(){returnString.class;}@OverridepublicCellDataTypeEnumsupportExcelTypeKey(){returnCellDataTypeEnum.NUMBER;}@OverridepublicWriteCellData<?>convertToExcelData(Stringvalue,ExcelContentPropertycontentProperty,GlobalConfigurationglobalConfiguration){if(value==null)returnnewWriteCellData<>("");returnnewWriteCellData<>(newBigDecimal(value));}}注册:
EasyExcel.write(out).head(head).registerConverter(newStringToNumberConverter()).doWrite(data);⚠️ 注意:要保证传进来的 String 真的是数字,否则会异常。
writeCellStyle.setDataFormat((short)49);// 文本格式这会导致 Excel 永远当字符串。
'"'123.45"Map<String,Object>全是StringLinkedHashMap + 区分类型:
row.put("姓名","张三");// Stringrow.put("数量",10);// Integerrow.put("单价",newBigDecimal("12.5"));row.put("总价",newBigDecimal("125"));Excel 中:
✅ 动态列导出要能函数计算:
Map 里放 Number,不要放 String
如果你愿意,可以把你现在的代码片段贴出来(head + data 部分),比如:
List<Map<String,Object>>data=...我可以帮你改成:
✅ 哪些字段是文本
✅ 哪些字段是数值
✅ Excel 中可以直接 SUM 的正确写法
你现在遇到的是:
1️⃣ 所有列都变成文本,公式算不了?
2️⃣ 只有部分列算不了?
3️⃣ 数据来自数据库 String?
4️⃣ 想自动识别数字字符串?
告诉我是哪一种,我给你最精准方案。