使用反射技术实现的导入Excel文件到数据库的公共方法

2023-11-13

还是干脆、利索直接上代码最实惠。。。。

1. 定义接口类IImportService

public interface IImportService
    {
        /// <summary>
        ///  从XLSX导入信息到数据库
        /// </summary>
        /// <param name="filePath">导入文件的全路径</param>
        /// <param name="propertyDic">Excel文档表头和数据库表字段的对应关系(例如Excel文件的"姓名"——》对应数据库的"Name")</param>
        List<T> ImportEntityListFromXlsx<T>(string filePath, Dictionary<string, string> propertyDic) where T : class,new();
    }

2. 提供默认实现类 IImportService

public class ImportService : IImportService
    {
        private const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
        public List<T> ImportEntityListFromXlsx<T>(string filePath, Dictionary<string, string> propertyDic) where T : class, new()
        {
            List<T> tempList = new List<T>();
            using (OleDbConnection conn = new OleDbConnection(string.Format(cmdText, filePath)))
            {
                conn.Open();
                DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                for (int i = 0; i < schemaTable.Rows.Count; i++)
                {
                    string sheetName = schemaTable.Rows[i]["TABLE_NAME"].ToString().Trim();
                    //查询sheet中的数据
                    string strSql = "select * from [" + sheetName + "]";

                    OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    var dt = ds.Tables[0];

                    foreach (DataRow dr in dt.Rows)
                    {
                        T tempItem = (T)Activator.CreateInstance(typeof(T));
                        foreach (PropertyInfo pop in typeof(T).GetProperties())
                        {
                            if (propertyDic.HasKey(pop.Name))
                            {
                                if (!pop.PropertyType.IsGenericType)
                                {
                                    pop.SetValue(tempItem, Convert.ChangeType(dr[propertyDic[pop.Name]], pop.PropertyType, null));
                                }
                                else
                                {
                                    //泛型Nullable<>
                                    Type genericTypeDefinition = pop.PropertyType.GetGenericTypeDefinition();
                                    if (genericTypeDefinition == typeof(Nullable<>))
                                    {
                                        pop.SetValue(tempItem, string.IsNullOrEmpty(dr[propertyDic[pop.Name]].TryString()) ? null : Convert.ChangeType(dr[propertyDic[pop.Name]], Nullable.GetUnderlyingType(pop.PropertyType)), null);
                                    }
                                }
                            }
                        }
                        tempList.Add(tempItem);
                    }
                }
            }
            return tempList;
        }
    }

3. 使用方法就不用多废话了吧。。。还是贴个图好了~_~


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射技术实现的导入Excel文件到数据库的公共方法 的相关文章

  • ASP.Net 渲染的背景图像样式不正确

    使用 ASP Net 我有一个服务器控件 我想为其添加内联 css 样式 background image none 但是 当我打电话时 writer AddStyleAttribute background image none 生成以下
  • SQL Server 2005 - 应该多久重建一次索引?

    我最近接手了一个项目 他们有一个 SQL 作业设置 每三个小时运行一次 它会重建 ASP NET 会员数据库表中找到的索引 每天重建索引 8 次 这看起来相当高 我每天都会获得大约 2000 个新用户 总共大约有 200 万注册用户 对于正
  • ASP .NET Web 应用程序内存泄漏 - 探查器显示大量字符串

    我的 Web 应用程序经常遇到对分配给应用程序池的虚拟内存设置的 IIS 限制 这会导致 IIS 停止该应用程序 我一直在尝试使用 NET 内存分析器来识别我的应用程序中可能存在的内存泄漏 到目前为止 GC 后保留的最大内存量似乎是在字符串
  • ASP.NET GridView 项目模板

    好的 我有一个 GridView 并且有一个列 如果文件存在 我希望将其作为链接 否则我只想将其作为标签 现在 我正在使用参数中传递的 Row 更改 RowDataBound 事件处理程序上的控件 我不太喜欢这个 因为我对列 ID 进行了硬
  • 如何获取 Visual Studio 的“发布”功能以包含生成后事件中的文件?

    我目前正在尝试使用 Visual Studio 2010 发布 和 MSDeploy 功能来处理我的 Web 部署需求 但在根据我的构建配置自定义包方面遇到了障碍 我在 32 位环境中开发 但需要为 64 位环境创建发布包 因此在 发布 配
  • 如何在网页中显示嵌入的 Excel 文件?

    我想允许在网页中查看嵌入的 Excel 报告 有什么办法吗 我不想使用 ActiveX 或 OWC Office Web 组件 我只想从 Internet Explorer 应用程序打开现有文件 我不希望用户下载然后打开它 使用 ifram
  • 如何在 ASP.NET MVC 中手动设置用户角色?

    我正在从事的这个项目要求我保留管理员用户的本地数据库 并为普通用户使用外部数据库 在管理数据库中通过身份验证的任何人都应被分配 管理员 角色 而通过其他数据库进行身份验证的任何人将始终被分配 用户 角色 我可以手动分配这些角色吗 我不需要角
  • 在 Asp.Net 中以编程方式添加样式表

    我想以编程方式在头部添加样式表 但我看到的示例之一似乎需要多行代码才能添加一个样式表 即使我可能需要很多 示例代码 HtmlLink css new HtmlLink css Href css fancyforms css css Attr
  • ASP.NET Core MVC防伪

    尝试在核心 mvc 项目中打开防伪功能 但没有成功 做了什么 添加过滤器以自动检查每个 POST 请求的防伪令牌 services AddMvc o gt o Filters Add new AutoValidateAntiforgeryT
  • mvc 2中的图像上传和预览

    我正在通过转换 asp net 网站来学习 mvc 2 在我的页面中 我必须上传图像并显示图像的预览 下面给出了我的 asp net 页面的屏幕截图 我将模型创建为 public class Contest public int conte
  • 路径访问被拒绝 VS 2017 无法复制文件

    最近 Visual Studio 遇到了最奇怪的问题 我正在运行 2017 年 我有一个与同事合作了一段时间的存储库 有一天我突然尝试构建 但遇到了一些错误 内容如下 访问路径 function json 被拒绝 然后 在多次尝试构建和清理
  • 在 ASP.NET 更新面板中使用时,文本框回发值中缺少回车符(ASCII 字符 13)

    我有一个 ASP NET TextBox 其 TextMode TextBox Mode Multi Line 在 AJAX 更新面板中使用 Text 值已预设为具有多行的值 当使用 Chrome 7 0 517 41 或 Firefox
  • 错误:“无法在 Web 服务器上开始调试...”ASP.NET 4.0

    当我想在 IIS 服务器上创建网站时出现错误 我使用的是 Windows 7 和 Visual Studio 2010 我是否必须为 IIS 注册或配置 asp net 4 0 这里没有太多细节 但是当我尝试在刚刚从 3 5 更改为 4 0
  • 如何为客户端和服务器缓存设置不同的缓存过期时间

    我想让某些页面为客户端提供 10 分钟缓存 为服务器提供 24 小时缓存 原因是如果页面发生变化 客户端将在 10 分钟内获取更新版本 但如果没有任何变化 服务器只需每天重建一次页面 问题在于输出缓存设置似乎覆盖了客户端设置 这是我的设置
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 如何在 Asp.Net 页面上的一处处理所有错误/消息?

    我在这里寻找一些指导 在我的网站上 我将内容放入 Web 用户控件中 例如 我将有一个新闻项控件 一个文章控件 一个联系表单控件 这些将出现在我网站上的各个位置 我正在寻找一种方法 让这些控件将消息传递到它们所在的页面 我不想将它们紧密结合
  • Microsoft.Extensions.Caching.Redis 选择与 db0 不同的数据库

    一个关于了解使用哪个redis数据库以及如何配置它的问题 我有一个默认值ASP NET Core Web 应用程序和默认配置的本地redis服务器 含15个数据库 通过包管理控制台我已经安装了 Install Package Microso
  • 古老的“字幕”标签的替代品?

    marquee 标签的标准等效项是什么 我正在寻找 HTML C asp NET 或 ASPX jquery java 脚本的解决方案 marquee 标签未包含在标准中 因为它是 视觉 标签 而不是 语义 标签 因此 您想要的任何语言都没
  • Page_ClientValidate 未定义

    我正在使用 ASP NET 2 0 并使用 IE8 作为我的默认浏览器 但无论我尝试多少次 Page ClientValidate一直给我这个错误 它没有定义 我怎么解决这个问题 请帮忙 所以 我想你的页面中可能没有任何RequiredVa
  • 有没有办法使用 ASP.NET 在用户离开页面时始终运行某些服务器端代码?

    我想知道当用户离开 ASP NET 中的页面时是否有任何方法可以始终运行一些服务器端代码 页面卸载事件不好 因为如果有人单击链接 则不会调用该事件 理想情况下 即使用户关闭浏览器 我也希望代码能够运行 我怀疑我所问的问题是不可能的 但问一下

随机推荐