使用oledb上载具有指定工作表名称的Excel工作表

时间:2011-06-17 09:54:35

标签: c# asp.net

如何使用asp.net上传Excel工作表,并了解工作表中列的结构,以便使用sqlbulkcopy上传到具有类似结构的表格有帮助。

任何答案都将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我假设你知道如何上传部分,所以我专注于Excel部分。

有许多第三方工具可以在.NET中读取Excel文件,根据我的经验,这种工具比使用.NET开箱即用的功能更灵活。然而,这是你可以做到的一种方式:

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");

using (DbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
    connection.Open();

    using (DbCommand command = connection.CreateCommand())
    {
        command.CommandText = "SELECT * FROM [Sheet1$]";

        using (DbDataReader dr = command.ExecuteReader())
        {
            while (dr.Read())
            {
                /* read data here */
            }
        }
    }
}

请记住:

  1. Jet OLE DB提供程序读取注册表项以确定要读取的行数以猜测源列的类型。注册表设置为:HKLM \ Software \ Microsoft \ Jet \ 4.0 \ Engines \ Excel \ TypeGuessRows。默认情况下,此键的值为8.因此,提供程序扫描源数据的前8行以确定列的数据类型(请参阅http://support.microsoft.com/kb/281517)TypeGuessRows键的有效值范围是0到16.但是,如果值为0,则扫描的源行数为16384。

  2. 在64位系统上,目前不支持Microsoft.Jet.OLEDB.4.0驱动程序。

  3. 有关连接字符串中使用的参数的详细信息,请参阅此处:http://www.connectionstrings.com/excel

  4. 连接字符串中的“HDR = Yes”表示提供程序不会在RecordSet中包含单元格区域的第一行(可能是标题行)。因此,如果标题行为您提供了构建sqlbulkcopy命令所需的信息,则应将其设置为“HDR = No”。