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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ftp扫描软件下载_ftp扫描文件夹连接失败

    ftp扫描软件下载_ftp扫描文件夹连接失败不知道大家用过哪几种ftp扫描工具,是不是感觉都是大同小异的呢?其实市面上的ftp扫描工具功能都是差不多的,当然也还是有一点差别的,那一点的差别可能就是我们选择那一种ftp扫描工具的原因。不论怎么说,也都是要选择自己喜欢的ftp扫描工具来使用。第一款:IIS7服务器管理工具这款工具里面的ftp扫描工具体验感是比较好的,除了一般ftp扫描工具里面都有的批量管理,它还有很多自己设计的功能。可以说这就是它成功的关键。它还能够进行定时上传下载、定时备份和多任务同时进行。哦对,它还有自动更新的功能。IIS7服务

    2022年10月1日
  • 服务器Hot Spare热备

    服务器Hot Spare热备HotSpare:热备用当一个正在使用的磁盘发生故障后,一个空闲、加电并待机的磁盘将马上代替此故障盘,此方法就是热备用。热备用磁盘上不存储任何的用户数据,最多可以有8个磁盘作为热备用磁盘。一个热备

    2022年7月4日
  • Matlab中axis函数用法总结「建议收藏」

    Matlab中axis函数用法总结「建议收藏」axis主要是用来对坐标轴进行一定的缩放操作,其操作命令主要如下:1、axis([xminxmaxyminymax])设置当前坐标轴x轴和y轴的限制范围2、axis([xminxmaxyminymaxzminzmaxcmincmax])设置x,y,z轴的限制范围和色差范围。3、v=axis返回一个行向量,记录了坐标范围4、axis…

    2022年6月14日
  • MAP遍历_map容器遍历

    MAP遍历_map容器遍历Iterator&lt;Map.Entry&lt;String,String&gt;&gt;iterator=map.entrySet().iterator();while(iterator.hasNext()){ Map.Entry&lt;String,String&gt;entry=iterator.next(); entry.getKey(); entry.ge…

    2022年9月15日
  • android软件开发工具(WiFi破解)

    做为一个多年奋战在Android应用开发一线的程序员来说,程序调试的苦是不言而喻的,在过去的很长一段时间里,我们如果要调试Android应用只能通过USB数据线,一头连着手机,一头联着电脑,不敢让手机离开电脑半步。、         曾经有一段时间,我总是担心天天这样高强度的调试别把手机的USB口给磨坏了。也许有朋友问了,那怎么不用模拟器呢?事实上,不是不想用,而是电脑上开个模似器可能需

    2022年4月13日
  • HTML多行代码搞定微信8.0的炸裂特效!C/C++怎么能输「建议收藏」

    HTML多行代码搞定微信8.0的炸裂特效!C/C++怎么能输「建议收藏」HTML多行代码搞定微信8.0的炸裂特效!C/C++怎么能输是Cpp呀2021-01-2816:00微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和头像也会随之震动。近日,前端工程师华峰用300行代码实现微信表情包炸裂的特效,一起来看看做出来的效果吧:据他描述:项目的核心是使用到了lottie动画库。lottie是.

    2022年10月31日

发表回复

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

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