C#通过反射导出任意Model实体类中的数据到Excel
需求:通过ComboBox选择要导出的数据表,然后导出成Excel。
程序中因偷懒已经使用EF,Spring.Net。
配置好spring.net,在程序中手动创建容器
IApplicationContext ctx = ContextRegistry.GetContext();
根据选择的不同表创建不同对象,通过反射根据拿到类和类中的属性,将数据从数据库中取出到DataTable。平时因用List<T>比较多,Dal中没有直接将数据库数据转成DataTable的方法,这里将List<T>再转成的DataTable,这里写的有些繁琐。
var table = ctx.GetObject(tableName + "Service"); var bll = table as IS_ACTIONINFOService; var datas = bll.GetEntitiesAsNoTracking().ToList(); if (datas.Count > 0) { var properties = datas[0].GetType().GetProperties(); foreach (var property in properties) { dt.Columns.Add(property.Name, property.PropertyType); } for (int i = 0; i < datas.Count; i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo property in properties) { object obj = property.GetValue(datas[i], null); tempList.Add(obj); } object[] array = tempList.ToArray(); dt.LoadDataRow(array, true); } }
导出使用的NOPI将DataTable批量写入Excel,比用List<T>写入要快
COMMON.ExcelHelper.DataTable2Excel(dt, sheetName, fileName, headerRows, ref errorMsg)
目前已经可以将部分数据库中的数据表导出到Excel了,但是出现了Bug。
DataSet不支持System.Nullable<>,查找原因是因为DataSet不支持泛型。
在通过EF生成实体类的时候,会将数据库中非varchar的可空字段生成可空值类型的属性。
这些类型保存的是Nullable<>的泛型类型。
这里需要提取出其中的值类型。
Type currentType = property.PropertyType; if (currentType.IsGenericType && currentType.GetGenericTypeDefinition() == typeof(Nullable<>)) { currentType = currentType.GetGenericArguments()[0]; } dt.Columns.Add(property.Name, currentType);
修改后目前程序可以跑通了,不知道后面会不会出现新的bug。
每天写bug,改bug,生命不息,bug不止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!