C#导入Excel数据的方式(两种)

C#导入Excel数据的方式(两种)方式一、导入数据到数据集对象,只支持Excel的标准格式,即不能合并单元格等等///<summary>///导入数据到数据集中///备注:此种方法只支持excel原文件///

大家好,又见面了,我是你们的朋友全栈君。

方式一、导入数据到数据集对象,只支持Excel的标准格式,即不能合并单元格等等

/// <summary>
    /// 导入数据到数据集中
    /// 备注:此种方法只支持excel原文件
    /// </summary>
    /// <param name="Path">文件路劲</param>
    /// <param name="exceptionMsg">异常信息</param>
    /// <returns></returns>
    public static System.Data.DataTable InputExcel(string Path, ref string exceptionMsg)
    {
        System.Data.DataTable dt = null;
        try
        {
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
            using (OleDbConnection conn = new OleDbConnection(strConn))
            {
                conn.Open();
                System.Data.DataTable sheetDt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string[] sheet = new string[sheetDt.Rows.Count];
                for (int i = 0; i < sheetDt.Rows.Count; i++)
                {
                    sheet[i] = sheetDt.Rows[i]["TABLE_NAME"].ToString();
                }
                string strExcel = string.Format("select * from [{0}]", sheet[0]);
                OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);
                dt = new System.Data.DataTable();
                myCommand.Fill(dt);
                conn.Close();
            }
        }
        catch (Exception ex)
        {
            exceptionMsg = ex.Message;
        }
        return dt;
    }

 

方法二、读取Excel文件,然后根据里面的数据信息拼装

#region 读取Excel表格中数据到DataTable中

    public static System.Data.DataTable ChangeExcelToDateTable(string _path)
    {
        System.Data.DataTable tempdt = new System.Data.DataTable();
        tempdt.TableName = "Excel";
        Application app = new Application();
        object obj = System.Reflection.Missing.Value;
        try
        {
            Workbook _wBook = app.Workbooks.Open(_path, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj, obj);
            Worksheet _wSheet = (Worksheet)_wBook.Worksheets.get_Item(1);
            DataRow newRow = null;
            DataColumn newColumn = null;
            for (int i = 2; i <= _wSheet.UsedRange.Rows.Count; i++)
            {
                newRow = tempdt.NewRow();
                for (int j = 1; j <= _wSheet.UsedRange.Columns.Count; j++)
                {
                    if (i == 2 && j == 1)
                    {
                        //表头
                        for (int k = 1; k <= _wSheet.UsedRange.Columns.Count; k++)
                        {
                            string str = (_wSheet.UsedRange[1, k] as Range).Value2.ToString();
                            newColumn = new DataColumn(str);
                            newRow.Table.Columns.Add(newColumn);
                        }
                    }
                    Range range = _wSheet.Cells[i, j] as Range;
                    if (range != null && !"".Equals(range.Text.ToString()))
                    {
                        newRow[j - 1] = range.Value2;

                    }
                }
                tempdt.Rows.Add(newRow);
            }
            _wSheet = null;
            _wBook = null;
            app.Quit();
            Kill(app);
            int generation = System.GC.GetGeneration(app);
            app = null;
            System.GC.Collect(generation);
            return tempdt;
        }
        catch (Exception ex)
        {
            app.Quit();
            Kill(app);
            int generation = System.GC.GetGeneration(app);
            app = null;
            throw ex;
        }
    }
   
    #endregion

    #region 结束进程

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
    private static void Kill(Microsoft.Office.Interop.Excel.Application excel)
    {
        IntPtr t = new IntPtr(excel.Hwnd);   //得到这个句柄,具体作用是得到这块内存入口
        int k = 0;
        GetWindowThreadProcessId(t, out k);   //得到本进程唯一标志k
        System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);   //得到对进程k的引用
        p.Kill();     //关闭进程k
    }

    #endregion

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155377.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot整合RabbitMQ 实现五种消息模型 详细教程

    SpringBoot整合RabbitMQ 实现五种消息模型 详细教程今天说下了消息队列中间件,各种队列性能对比,RabbitMQ队列,交换机(Exchange)以及消息中间件的应用场景,然后带着大家一起实现RabbitMQ的五种消息模型。消息队列中间件消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和终一致性[架构]使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,K…

    2022年5月15日
    42
  • win10中使用sqlserver2008r2 SQL Server 配置管理器[通俗易懂]

    win10中使用sqlserver2008r2 SQL Server 配置管理器[通俗易懂]win10打开sqlserver2008r2的SQLServer配置管理器,直接运行次文件就可:“C:\Windows\SysWOW64\SQLServerManager10.msc”在win10中是安装sqlserver2008r2,有时候安装成功之后会发现sqlserver的1433端口访问不了,通过sql语句查看端口号,发现找不到1433端口号–查询端口号

    2022年7月20日
    14
  • c++学生管理系统源代码_学校运营管理系统

    c++学生管理系统源代码_学校运营管理系统C#学员管理系统C#学员管理系统是在控制台输出的项目,和OOP学员管理系统相似。①创建一个学员的实体类Student,实现其构造方法和封装:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;///<summary>///实体类///</sum…

    2022年9月20日
    3
  • 固态硬盘各种受损,数据恢复一个对策,你值得拥有!「建议收藏」

    固态硬盘各种受损,数据恢复一个对策,你值得拥有!「建议收藏」大家好,我是效哥。前几天,效率源发布了福利:(【技术视界】受损固态硬盘(SSD)数据恢复方法)。一时间,很多朋友都找到效哥:“哎呀呀,我的固态硬盘坏了,里面还有我的博士论文”、“刚买的固态硬盘才用半年就坏了,数据库文件急需要恢复”、“固态硬盘做的系统开不了机,桌面上还有财务报表”···看到这里,效哥要给大家一个人生忠告:“重要数据千万要做好备份!忠告,忠告啊!”那么,固态硬盘已经损坏且…

    2022年9月19日
    2
  • docker容器端口映射到服务器_阿里云外网端口映射

    docker容器端口映射到服务器_阿里云外网端口映射本篇文章通过具体案例讲解了Docker容器服务访问的两大基本操作,包括基础的容器端口映射机制和容器互联机制。同时,Docker目前可以成熟地支持Linux系统自带的网络服务和功能,这既可以利用现有成熟的技术提供稳定支持,又可以实现快速的高性能转发。………

    2022年10月10日
    2
  • js对数字数组排序[通俗易懂]

    js对数字数组排序[通俗易懂]js中经常需要用到对数组进行排序的操作,当数组中的元素均为数字时,直接使用sort()进行排序得到的结果可能不是你想要的结果。假如我有数组arrayNums=[15,2,16],直接使用arrayNums.sort()的排序结果将是[15,16,2],这是因为Javascript的sort()函数在默认情况下是按照字符串顺序对值进行排序的。正因如此,sort()方法在对数值排序时会产生…

    2022年5月15日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号