使用反射技术实现的导入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文件到数据库的公共方法 的相关文章

  • bin 文件夹内任何文件的任何更改是否会导致 ASP.NET Web 应用程序中的应用程序回收?

    我知道在 ASP NET Web 应用程序中 更改位于bin文件夹会导致应用程序回收 但我想知道 正如主题所暗示的那样 是否any文件更改会导致这种行为吗 此场景中是否包含简单的文本文件 那么子文件夹呢 bin文件夹 它们的内容呢 我知道我
  • 我们可以将哪些类型的对象放置在视图状态中?

    我想知道为什么我们必须设置可序列化属性才能将对象保存在视图状态 另外 我们可以在视图状态中存储哪种类型的对象 ViewState使用二进制序列化进行序列化对象状态格式化程序 http msdn microsoft com en us lib
  • 访问动态创建的控件 (c#)

    在我的代码后面 c 中 我动态创建了一些RadioButtonList 每个RadioButton中有更多RadioButton 我将所有控件放在一个特定的面板中 我需要知道的是稍后如何访问这些控件 因为它们不是在 aspx 文件中创建的
  • 扩展授权属性

    我实施了 CustomAuthorization 属性基于 Authorize 属性 我的属性如下所示 public class CustomAuthorizeAttribute AuthorizeAttribute public eUse
  • 是否有正确的方法将自定义 Javascript 添加到 ASP.NET MVC 5 页面?

    目前 我已将 jQuery 源文件添加到 ASP NET 项目的 Scripts 文件夹中 在 Layout cshtml 页面中 我包含了 Scripts jquery 2 1 1 min js 现在 我可以在我制作的每个页面上包含 jQ
  • 如何从 GridView TemplateColumn 单击触发 UpdatePanel?

    我有以下情况 我的所有控件都在页面上的更新面板上 这些控件之一是 GridView 该 GridView 在标题模板字段上包含一个复选框 以进行全部选中 autopostback 是 true 但是当检查更改时 没有任何更改 更新面板会触发
  • 如何通过ConfigurationManager找到配置文件位置?

    如何通过ConfigurationManager找到配置文件位置 我在代码中有 ConfigurationManager 类 并且正在调试它 我想知道它指向哪个配置文件 web config 或 app config 等 Configura
  • 在 ASP.NET MVC 2 中使用 name="array_name[]" 作为表单元素发布数组

    再会 在 PHP 中 可以使用方括号将 name 属性分配给输入元素 如下所示 name my value PHP 会在服务器端自动将其转换为数组 这在 ASP NET MVC 中可能吗 如果没有 是否有其他方法可以在 ASP NET MV
  • UpdatePanel 破坏 JQuery 脚本

    这是我想做的事情的简化版本 基本上我有一个数据列表 里面有很多东西 当你将鼠标悬停在数据列表中的项目上时 我希望 jquery 隐藏 显示东西 问题是 在我进行数据绑定后 如果 gridview repeater datalist 位于更新
  • 使用 .net 3.5 和 C# 检测 Chrome

    好的 我正在使用此代码来检测浏览器 使用 chrome 时 它 给我浏览器 苹果MAC Safari 我需要它说 chrome Ater 环顾四周 我发现了这个 Google Chrome Safari 相同的浏览器名称和版本 https
  • 通过 JavaScript 单击按钮/页面提交

    我想了解 asp net 框架如何知道何时单击了按钮 因此一旦收到请求 就会在服务器上触发其单击事件 我需要了解它是如何工作的 因为我想从 JavaScript 触发按钮的服务器单击事件 我能够从 JavaScript 执行页面提交 doc
  • 作出选择之后、提交上传之前的 asp.net FileUpload 事件

    我想显示通过 FileUpload 控件的浏览按钮选择的文件的大小 理想情况下 该值在用户选择文件后但在单击 上传文件 按钮之前立即显示 我有一个网络表格 按钮看起来像这样
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 如何在嵌套列表视图中编辑数据

    我使用列表视图来显示项目列表 并使用嵌套列表视图来显示每个项目的功能列表 父列表视图和子列表视图都需要能够进行插入 编辑和删除操作 它适用于父列表视图 但是 当我尝试编辑子项目时 编辑按钮不会将其带入编辑模式 您能建议我代码中缺少什么吗
  • c#/asp.net - 如何捕获“System.Web.HttpException:请求超时”?

    在我的 asp net c 项目中 我使用 iTextsharp dll 从许多 pdf 文档中读取文本 但有时会出现此错误 System Web HttpException 请求超时 但实现它的代码是 public static bool
  • 这段代码有什么问题。如果用户选择或不选择复选框,为什么它仍然显示 MsgBox? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 无论我是否选择复选框 它仍然会给出
  • 我可以将 JSON 字符串转换为 JsonResult 吗?

    我在数据库中存储了一些存储的 JSON 字符串 我想将其作为 JsonResult 返回给客户端 我知道 Json object 将对象转换为 JsonResult 但如果我已经将结果存储在字符串中怎么办 我可以将其转换为 JsonResu
  • 装配和产品版本不匹配

    我正在尝试在 asp net 网站中使用 Ajax 控件工具包 我从之前的一个示例项目中复制了 dll 它有以下详细信息 Assembly Version 3 5 40412 0 File Version 3 5 40412 2 Inter
  • URL 中的点 (.) 字符错误

    当我点击编辑具有此 url 的用户时遇到问题ASP NET MVC 3项目 http domain com 8089 User EditUser username surname IDUser e11a621p df11 4687 9903

随机推荐