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)
上一篇 2022年7月2日 上午9:36
下一篇 2022年7月2日 上午9:36


相关推荐

  • java getclassloader_java-关于getClass().getClassLoader()

    java getclassloader_java-关于getClass().getClassLoader()InputStreamis=getClass().getClassLoader().getResourceAsStream(“helloworld.properties”);中getClass()和getClassLoader()都是什么意思呀.getClass():取得当前对象所属的Class对象getClassLoader():取得该Class对象的类装载器类装载器负责从Java字符文件…

    2022年5月2日
    41
  • html font 设置 字体_html font-weight

    html font 设置 字体_html font-weightCSS布局HTML小编今天和大家分享助如何在latex写粗体的希腊字母怎样用latex加黑数学公式中的小写希腊字母?像是\mathbf{\tau}\boldsymbol{\tau}\pmb{\tau}都使用过了,都不行。将以下几行代码保存成一个文件,如test_bold.tex,在winedt下运行,就会出带黑体小些希腊字母的高斯公式。\documentclass[journal]{IE…

    2022年10月13日
    4
  • c#数组「建议收藏」

    c#数组「建议收藏」C#数组要注意的事项:1.([])必须跟在类型后面,而不是标识符后面,在C#中,将方括号放在标识符后是不合法的。eg:int[]table;2.数组大小不是其类型的一部分,而在C语言中却

    2022年7月1日
    25
  • Spark Streaming Join「建议收藏」

    Spark Streaming Join「建议收藏」多数据源Join思路多数据源Join大致有以下三种思路:数据源端Join,如Android/IOS客户端在上报用户行为数据时就获取并带上用户基础信息。计算引擎上Join,如用SparkStreaming、Flink做Join。结果端Join,如用HBase/ES做Join,Join键做Rowkey/_id,各字段分别写入列簇、列或field。三种思路各有优劣,使用时注意…

    2022年6月30日
    35
  • TP90、TP95、TP99性能指标含义及计算

    TP90、TP95、TP99性能指标含义及计算前言在性能测试中 我们经常会选择 TP90 TP95 或者 TP99 等水位线作为性能指标 首先 我们先解释一下 TP90 TP95 和 TP99 的含义 TP90 toppercent90 即 90 的数据都满足某一条件 TP95 toppercent95 即 95 的数据都满足某一条件 TP99 toppercent99 即 99 的数据都满足某一条件 在这里 我们之所以说其 满足某一条件 是因为在计算的时候 我们既可以向前计算也可以向后计算 例如 1 2 3

    2026年3月18日
    2
  • 腾讯ai助手怎么打开

    腾讯ai助手怎么打开

    2026年3月13日
    2

发表回复

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

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