当前位置: 首页 > news >正文

easyExcel 的动态列导出把文本转为数值格式,可以进行函数计算

明白了,你这个需求是反过来的场景👇:

✅ EasyExcel 动态列导出时
希望:

  • 看起来是“文本”的值(比如"12.5""100"
  • 在 Excel 中是【数值格式】
  • 可以参与公式计算(SUM、AVG 等)
  • 而不是被当成【文本】

也就是说:
❌ 当前问题:被导出成“文本格式”,Excel 公式算不了
✅ 目标:导出成真正的 Number 类型


🎯 核心原则

Excel 是否可参与函数计算,取决于单元格类型是否是 NUMERIC,而不是 STRING

你现在用的是动态列(head + Map / List<List>),常见错误是:

map.put("金额","123.45");// String

Excel 会当成文本。

正确做法是:👇
👉放 Number 类型,而不是 String

map.put("金额",newBigDecimal("123.45"));// 或map.put("金额",123.45);// 或map.put("金额",Integer.valueOf(100));

✅ 方案一(最推荐):Map 中数值字段用 Number 类型

表头

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 → 转成 Number

很多时候数据来自数据库或前端,全是 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()));}

✅ 方案三:自定义 Converter(动态列场景也可用)

如果你想自动把 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 真的是数字,否则会异常。


🚨 不要做的事(会导致不能计算)

❌ 1. 设置成文本格式

writeCellStyle.setDataFormat((short)49);// 文本格式

这会导致 Excel 永远当字符串。

❌ 2. 在前面加'

"'123.45"

❌ 3. 所有值都用 String

Map<String,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 部分),比如:

List<Map<String,Object>>data=...

我可以帮你改成:
✅ 哪些字段是文本
✅ 哪些字段是数值
✅ Excel 中可以直接 SUM 的正确写法

你现在遇到的是:
1️⃣ 所有列都变成文本,公式算不了?
2️⃣ 只有部分列算不了?
3️⃣ 数据来自数据库 String?
4️⃣ 想自动识别数字字符串?

告诉我是哪一种,我给你最精准方案。

http://www.cnnetsun.cn/news/848335.html

相关文章:

  • 用户态/内核态 = 操作系统内核?
  • 从Vue到Spring Boot:一个Java全栈工程师的实战面试实录
  • java项目--智能无人机平台v3pro
  • 彻底爆了!阿里最新大模型,再次拿下第一!
  • 社会网络仿真软件:Gephi_(18).社会网络分析理论基础
  • ES6新增了哪些新特性
  • 目前全网唯一的Autosar TLS文章
  • 工作流程管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 我的思维模型 -- 5.工程学篇
  • 基于SpringBoot+Vue的社区养老服务平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 基于SpringBoot+Vue的文理医院预约挂号系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • SQL注入知识要点总结
  • YOLO26手势识别项目实战3-石头剪刀布实时检测系统数据集说明(含训练代码、数据集和GUI交互界面)
  • 电容式三点式振荡电路/电感式三点振荡电路
  • BUCK降压电路Multisim电路仿真分析
  • 好用的PC电脑流程图软件无需下载在线绘制流程图模板大全
  • 基于SpringBoot+Vue的spring boot校园商铺管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 企业级医药管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 智能球机摄像头自带旋转355度视角
  • 科研人员新工具:gpt-oss-20b-WEBUI助力论文写作与分析
  • 前后端分离spring boot校园商铺管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 3分钟突破付费墙:Bypass Paywalls Clean让优质内容触手可及
  • 显存22GB以内搞定Qwen2.5-7B微调,4090D实测真香
  • Keil添加文件正确方式:针对STM32项目的通俗解释
  • 万物识别-中文镜像工程沉淀:Dockerfile分层构建+缓存优化+CI/CD流水线完备
  • GPEN开源大模型部署教程:适配A10/A100显卡的高效人脸增强方案
  • 无需配置!CV-UNet镜像开箱即用,轻松实现透明背景
  • OFA-large模型镜像深度解析:torch27环境+transformers 4.48.3固化部署实操
  • AutoGen Studio多场景应用:Qwen3-4B-Instruct在IT运维、HR、法务中的Agent实践
  • GTE-Pro行业落地:电力调度规程语义检索,支持‘跳闸’‘断电’‘保护动作’多义召回