Excel数据动态获取与映射

处理代码

动态映射

动态读取 excel 中的数据,并通过 json 配置 指定对应列的值映射到模板中的什么字段上

private void GetFreightFeeByExcel(string filePath)
{
    // 文件名需要以快递公司命名 便于映射查询
    string fileName = Path.GetFileNameWithoutExtension(filePath).ToUpper();
    string jsonString = _securityService.QueryByIdAsync("excelConvert" + fileName).Result?.KeyValue ?? throw new RunInterceptException($"缺失 {fileName} 配置json");
    string templatePath = _securityService.QueryByIdAsync("excelConvertTemplatePath").Result.KeyValue ?? throw new RunInterceptException($"缺失 excelConvertTemplatePath 配置");
    // 将JSON字符串解析为JObject
    JObject jsonObject = JObject.Parse(jsonString);
    // 做动态对象属性的存储
    var objectDic = new Dictionary<string, object>();
    // 遍历JObject的所有属性
    foreach (JProperty property in jsonObject.Properties())
    {
        // 获取属性名和属性值 存到字典中,迭代字典总比迭代JObject快吧
        objectDic.Add(property.Name, property.Value.ToString());
    }
    // 存储每行需要的数据
    List<object> dataList = new List<object>();

    // MiniExcel 当判断文件 SharedString 大小超过 5MB,预设会使用本地缓存,空间换时间
    // 若需关闭 var config = new OpenXmlConfiguration { EnableSharedStringCache = false };
    foreach (IDictionary<string, object> row in MiniExcel.Query(filePath, true, "账单明细"))
    {
        // 深拷贝一个字典,作为数据的存储
        var dataDic = new Dictionary<string, object>(objectDic);
        foreach (var item in objectDic)
        {
            string key = item.Value.ToString();
            if (key.IsNullOrEmpty())
                continue;
            string cellValue = row[key].ToString() ?? "";
            if (item.Key == "到件地区") // SF的到件地址可能是多个市的组合 取一个即可
                cellValue = cellValue.Split('/')[0];
            // 修改值
            dataDic[item.Key] = cellValue;
        }
        // 这一步的转换是必须的 因为 MiniExcel 的模板导出依赖对象反射
        dataList.Add(dataDic.DictionaryToDynamicObject());
    }
    string convertFilePath = Path.GetDirectoryName(filePath) + $"\\ConvertedData-{fileName}.xlsx";
    ExportExcelByTemplate(dataList, convertFilePath, templatePath, fileName);
}

字典转动态对象

public static dynamic DictionaryToDynamicObject(this IDictionary<string, object> dictionary)
{
    IDictionary<string, object> expandoDict = new ExpandoObject() as IDictionary<string, object>;
    foreach (var kvp in dictionary)
    {
        expandoDict.Add(kvp);
    }
    return expandoDict;
}

导出代码

private void ExportExcelByTemplate(List<object> dataList, string convertFilePath, string templatePath, string fileName)
{
    var value = new Dictionary<string, object>
    {
        ["data"] = dataList
        };
    try
    {
        MiniExcel.SaveAsByTemplate(convertFilePath, templatePath, value);
    }
    catch (Exception ex)
    {
        // 异常时 删除有问题的Excel
        File.Delete(convertFilePath);
        throw new RunInterceptException($"导出 {fileName} Excel数据异常:{ex.Message}", ex);
    }
}

JSON 映射格式

key:模板的字段

value:数据源的字段

{
  "ExpressNumber": "运单号码",
  "ShippingMethod": "产品类型",
  "ShippingDate": "寄件时间",
  "ShippingAgent": "",
  "CalculationType": "",
  "FeeType": "服务",
  "OtherFeeType": "",
  "Recipients": "收件人",
  "ShipAddress1": "国家或地区",
  "ShipAddress2": "始发地(省名)",
  "ShipAddress3": "寄件地区",
  "DeliveryAddress1": "国家或地区",
  "DeliveryAddress2": "目的地(省名)",
  "DeliveryAddress3": "到件地区",
  "ActualWeight": "实际重量",
  "CalculatedWeight": "计费重量",
  "Discounts": "折扣/促销",
  "Length": "长",
  "Width": "宽",
  "Height": "高",
  "ActualFreightFee": "应付金额"
}

模板样式

数据源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博客文章怎么设计分类与标签

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;博客文章怎么设计分类与标签 新网站基本上算是迁移完了&#xff0c;迁移之后在写文章的过程中&#xff0c;发现个人的文章分类和标签做的太混乱了&#xff0c;分类做的像标签&#xff0c;标签也不是特别的丰富&#x…

solana链上智能合约开发案例一则

环境搭建 安装Solana CLI&#xff1a;Solana CLI是开发Solana应用的基础工具。你可以通过官方文档提供的安装步骤&#xff0c;在本地环境中安装适合你操作系统的Solana CLI版本。安装完成后&#xff0c;使用命令行工具进行配置&#xff0c;例如设置网络环境&#xff08;如开发网…

腾讯云存储COS上传视频报错

bug表现为&#xff1a;通过COS上传视频时报错"Class \"QCloud\\COSSTS\\Sts\" not found" 修复办法为&#xff1a;找到文件crmeb/services/upload/storage/Cos.php 将Sts引入由QCloud\COSSTS\Sts;改为crmeb\services\upload\extend\cos\Sts; 修改后重启服…

已有docker增加端口号,不用重新创建Docker

已有docker增加端口号&#xff0c;不用重新创建Docker 1. 整体描述2. 具体实现2.1 查看容器id2.2 停止docker服务2.3 修改docker配置文件2.4 重启docker服务 3. 总结 1. 整体描述 docker目前使用的非常多&#xff0c;但是每次更新都需要重新创建docker&#xff0c;也不太方便&…

Win11 24H2新BUG或影响30%CPU性能,修复方法在这里

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; 一招提升Win11 24H2 CPU 30%性能&#xff0c;小BUG大影响 就在刚刚&#xff0c;小江在网上冲浪的时候突然发现了这么一则帖子&#xff0c;标题如下&#xff1a;基准测试&#xff08;特别是 Time…

C#桌面应用制作计算器

C#桌面应用制作简易计算器&#xff0c;可实现数字之间的加减乘除、AC按键清屏、Del按键清除末尾数字、/-按键取数字相反数、%按键使数字缩小100倍、按键显示运算结果等...... 页面实现效果 功能实现 布局 计算器主体使用Panel容器&#xff0c;然后将button控件排列放置Pane…

Cloud Native 云原生后端的开发注意事项

在云原生后端开发里&#xff0c;数据管理和存储这块得好好弄。数据库选型得综合考虑&#xff0c;像关系型数据有复杂查询需求就选 MySQL、PostgreSQL&#xff0c;海量非结构化数据就可以考虑 MongoDB、Cassandra 这些。设计数据库得遵循规范化原则&#xff0c;像设计电商订单表…

25.UE5时间膨胀,慢动作,切换地图,刷BOSS

2-27 时间膨胀、慢动作、切换地图、刷BOSS_哔哩哔哩_bilibili 目录 1.刷新BOSS逻辑 2.时间膨胀实现慢动作 3.胜利画面&#xff0c;下一关 3.1胜利画面UI 3.2第一关、第二关游戏模式 3.3下一关按钮事件的绑定 1.刷新BOSS逻辑 实现当场上的怪物都死亡后&#xff0c;进行刷…

汽车资讯新动力:Spring Boot技术革新

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足&#xff0c;创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

Pytest-Bdd-Playwright 系列教程(12):步骤参数 parsers参数解析

Pytest-Bdd-Playwright 系列教程&#xff08;12&#xff09;&#xff1a;步骤参数 & parsers参数解析 前言一、什么是步骤参数&#xff1f;二、pytest-bdd 的步骤参数用法2.1 简单字符串解析2.2 自定义正则表达式解析2.3 参数类型转换 三、案例&#xff1a;基于 pytest-bdd…

EHOME视频平台EasyCVR多品牌摄像机视频平台监控视频编码H.265与Smart 265的区别?

在视频监控领域&#xff0c;技术的不断进步推动着行业向更高效、更智能的方向发展。特别是在编码技术方面&#xff0c;Smart 265作为一种新型的视频编码技术&#xff0c;相较于传统的H.265&#xff0c;有明显优势。这种技术的优势在EasyCVR视频监控汇聚管理平台中得到了充分的体…

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求&#xff1a; 要求在任务截止日期的前3天时&#xff0c;系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单&#xff0c;没有使用消息列队&#xff0c;也不能使用延时队列来做。 用Timer的话开销还挺大的&a…

数造科技亮相第26届高交会并接受媒体采访,以数据智能赋能未来

11 月 14 日至 16 日&#xff0c;第二十六届中国国际高新技术成果交易会&#xff08;简称“高交会”&#xff09;在深圳成功举办。本届大会以“科技引领发展&#xff0c;产业融合聚变”为主题&#xff0c;汇聚了全球最新的科技成果&#xff0c;打造了一场科技界的盛大聚会。 在…

Facebook广告投放如何提高过审率?

在Facebook进行广告投放活动时&#xff0c;如何让广告过审应该是让很多人头疼的事情&#xff0c;前期花时间准备文案素材等&#xff0c;结果广告不过审&#xff0c;等于一切的前期准备都打水漂了&#xff0c;特别是黑五类的一些产品。许多独立站会架设斗篷&#xff0c;根据市场…

springBoot插件打包部署

打包插件spring-boot-maven-plugin 不使用插件&#xff0c;运行时&#xff0c;异常信息为“没有主清单属性” 本地部署 杀进程

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;2&#xff09;第一个工程 LED心跳灯 前言1.新建工程2.编写控制LED代码3.LED控制独立成.c和.h文件 前言 实际开发中很多时候我们需要有一个类似心跳灯或运行指示灯的灯以不同的状态闪烁以表示程序的运行状态&#xff0c;所以第…

【金融风控项目-06】:风控建模流程

文章目录 2 风控建模流程2.1 ABC评分卡简介2.2 机器学习模型工作的完整流程2.3 项目准备期2.3.1 明确需求 2.4 模型设计2.4.1 业务抽象成分类/回归问题2.4.2 模型算法2.4.3 模型输入2.4.4 Y标签定义2.4.5 样本选取2.4.6 样本采样2.4.7 观察期和表现期2.4.8 Y标签阈值确定2.4.9 …

Gartner发布中国PAM特权访问管理创新洞察:PAM的8个主要目标和国内9个主要提供商

特权账户是攻击者的主要目标&#xff0c;对每个组织来说都是重大的安全风险。安全和风险管理领导者可以利用这项研究来了解技术前景并降低特权访问风险。 主要发现 合规在推动中国采用特权访问管理 (PAM) 工具方面发挥着重要作用。然而&#xff0c;这些工具的实施经常遭到IT管理…

mayo介绍和QTqmake编译基于Opencascade开发的mayo工程-小白配置

目录: 一、mayo介绍:zap: 最新功能&#xff08;截止7.8.2&#xff09;在这里插入图片描述 二、编译准备三、编译过程3.1QT Creator打开源码的pro工程3.2修改几处pro配置3.3复制所需的动态链接库3.4编译完成 一、mayo介绍 1️⃣mayo是一个基于opencascade开源库开发的一个开源CA…