2011-06-17 82 views

回答

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. 喷气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 =是”在连接字符串中表示该供应商将不包括单元格区域的第一行(其可能是一个标题行)在RecordSet中。因此,如果标题行为您提供了需要构建sqlbulkcopy命令的信息,则应将其设置为“HDR = No”。

+0

感谢您的回复,我想知道表中的表的模式,以便我可以创建一个具有相同列的精确表,以便它可以很容易地使用SqlBulkcopy。 – 2011-06-17 11:48:54