C#获取Excel中的数据到DataTable

作者:袖梨 2022-06-25

例1

 代码如下 复制代码

#region 获取Excel中指定工作薄的数据到DataTable
///


/// 获取Excel中指定工作薄的数据到DataTable
///

/// excelPath" />Excel路径
/// 工作薄名称
/// 返回结果为DataTable
private DataTable ExcelToDataTable(string excelPath, string sheetName)
{
  string strConnExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
 + excelPath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
  OleDbConnection connExcel = new OleDbConnection(strConnExcel);
  OleDbDataAdapter daExcel = null;
  DataTable dtExcel = new DataTable();
  string strSqlExcel = string.Format("SELECT * FROM [{0}$]", sheetName);
  try
  {
    connExcel.Open();
    daExcel = new OleDbDataAdapter(strSqlExcel, connExcel);
    daExcel.Fill(dtExcel);
    return dtExcel;
  }
  catch (Exception ex)
  {
    //写错误日志
    return dtExcel;
  }
  finally
  {
    connExcel.Close();
    daExcel.Dispose();
    connExcel.Dispose();
  }
}
#endregion

例2

代码

 代码如下 复制代码
    ///
    /// 获取指定路径、指定工作簿名称的Excel数据:取第一个sheet的数据
    ///

    /// 文件存储路径
    /// 工作簿名称
    /// 如果争取找到了数据会返回一个完整的Table,否则返回异常
    public DataTable GetExcelData(string astrFileName)
    {
        string strSheetName = GetExcelWorkSheets(astrFileName)[0].ToString();
        return GetExcelData(astrFileName, strSheetName);
    }


代码

 代码如下 复制代码

    ///


    /// 返回指定文件所包含的工作簿列表;如果有WorkSheet,就返回以工作簿名字命名的ArrayList,否则返回空
    ///

    /// 要获取的Excel
    /// 如果有WorkSheet,就返回以工作簿名字命名的ArrayList,否则返回空
    public ArrayList GetExcelWorkSheets(string strFilePath)
    {
        ArrayList alTables = new ArrayList();

        OleDbConnection odn = new OleDbConnection(GetExcelConnection(strFilePath));
        odn.Open();

        DataTable dt = new DataTable();

        dt = odn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

        if (dt == null)
        {
            throw new Exception("无法获取指定Excel的架构。");
        }

        foreach (DataRow dr in dt.Rows)
        {
            string tempName = dr["Table_Name"].ToString();

            int iDolarIndex = tempName.IndexOf('$');

            if (iDolarIndex > 0)
            {
                tempName = tempName.Substring(0, iDolarIndex);
            }

            //修正了Excel2003中某些工作薄名称为汉字的表无法正确识别的BUG。
            if (tempName[0] == ''')
            {
                if (tempName[tempName.Length - 1] == ''')
                {
                    tempName = tempName.Substring(1, tempName.Length - 2);
                }
                else
                {
                    tempName = tempName.Substring(1, tempName.Length - 1);
                }

            }
            if (!alTables.Contains(tempName))
            {
                alTables.Add(tempName);
            }
        }

        odn.Close();

        if (alTables.Count == 0)
        {
            return null;
        }

        return alTables;
    }


代码

 代码如下 复制代码

    ///


    /// 获取指定路径、指定工作簿名称的Excel数据
    ///

    /// 文件存储路径
    /// 工作簿名称
    /// 如果争取找到了数据会返回一个完整的Table,否则返回异常
    public DataTable GetExcelData(string FilePath, string WorkSheetName)
    {
        DataTable dtExcel = new DataTable();
        OleDbConnection con = new OleDbConnection(GetExcelConnection(FilePath));
        OleDbDataAdapter adapter = new OleDbDataAdapter("Select * from [" + WorkSheetName + "$]", con);

        //读取
        con.Open();
        adapter.FillSchema(dtExcel, SchemaType.Mapped);
        adapter.Fill(dtExcel);
        con.Close();
        dtExcel.TableName = WorkSheetName;

        //返回
        return dtExcel;
    }

代码

 代码如下 复制代码

     ///


    /// 获取链接字符串
     ///

    ///
    ///
    public string GetExcelConnection(string strFilePath)
    {
        if (!File.Exists(strFilePath))
        {
            throw new Exception("指定的Excel文件不存在!");
        }
        return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + ";Extended properties="Excel 8.0;Imex=1;HDR=Yes;"";

         //@"Provider=Microsoft.Jet.OLEDB.4.0;" +
         //@"Data Source=" + strFilePath + ";" +
         //@"Extended Properties=" + Convert.ToChar(34).ToString() +
         //@"Excel 8.0;" + "Imex=1;HDR=Yes;" + Convert.ToChar(34).ToString();    

相关文章

精彩推荐