如何使用asp.net上传Excel工作表,并了解工作表中列的结构,以便使用sqlbulkcopy上传到具有类似结构的表格有帮助。
任何答案都将不胜感激。
提前致谢。
答案 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 */
}
}
}
}
请记住:
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。
在64位系统上,目前不支持Microsoft.Jet.OLEDB.4.0驱动程序。
有关连接字符串中使用的参数的详细信息,请参阅此处:http://www.connectionstrings.com/excel
连接字符串中的“HDR = Yes”表示提供程序不会在RecordSet中包含单元格区域的第一行(可能是标题行)。因此,如果标题行为您提供了构建sqlbulkcopy命令所需的信息,则应将其设置为“HDR = No”。