【发布时间】:2019-09-30 04:19:16
【问题描述】:
我正在构建一个需要以下功能的程序:
- 将 Excel 文件导入数据库 -- 勾选
- 避免重复 --- 处理它
- 忽略 Excel 文件标题和底部的一些行 --- 这就是我想问你们的问题
这是我的代码
protected void Upload_Click(object sender, EventArgs e)
{
string excelPath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
string filepath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.FileName);
string filename = Path.GetFileName(filepath);
FileUpload1.SaveAs(excelPath);
string strConnection = @"Data Source=PEDRO-PC\SQLEXPRESS;Initial Catalog=costumizado;Persist Security Info=True;User ID=sa;Password=1234";
string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0 Xml;HDR=NO,IMEX=1;\"";
OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
excelConnection.Open();
DataTable schema = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string sheetName = schema.Rows[0]["TABLE_NAME"].ToString();
OleDbCommand cmd = new OleDbCommand("Select * from [" + sheetName + "]", excelConnection);
OleDbDataReader dReader;
dReader = cmd.ExecuteReader();
using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
{
sqlBulk.ColumnMappings.Add(0,0);
sqlBulk.ColumnMappings.Add(1,1);
sqlBulk.ColumnMappings.Add(2,2);
sqlBulk.ColumnMappings.Add(3,3);
sqlBulk.DestinationTableName = "Dados";
sqlBulk.WriteToServer(dReader);
}
excelConnection.Close();
}
而我正在苦苦挣扎的是,我需要在我的代码中找到 excel 中的列并忽略我不需要的行......
我认为这行足以胜任这项工作:
sqlBulk.ColumnMappings.Add(0,0);
sqlBulk.ColumnMappings.Add(1,1);
sqlBulk.ColumnMappings.Add(2,2);
sqlBulk.ColumnMappings.Add(3,3);
sqlBulk.DestinationTableName = "Dados";
这是我要导入的表:
【问题讨论】:
-
欢迎来到 Stackoverflow!了解您尝试导入的表格的结构将有助于回答您的问题(您当然可以匿名化单元格,但它应该足够详细,以便人们可以看到页眉、页脚和数据区域)。
-
您已经删除了足够多的重复帖子 Pedro/OverKnown/Holmes,知道您需要在这里做什么。制作重复帐户以避免站点/模组强制执行的警告、限制等是违反规则的。为避免出现标题,只需指定您的文档在连接字符串中包含标题(将
HDR=NO更改为HRD=YES)。如果您想从第 14 行开始(应该在您的问题中),请将您的SELECT更改为"Select * from [" + sheetName + ":$A14:S]"其中A和S是您要导入的列。如果您想忽略空白单元格,请添加WHERE。 -
@Larnu 谢谢Larnu!但是我无法识别单元格,我必须对列进行本地化,因为想象一下,如果客户想要放置相同的表模式但在开始时有更多单元格?
-
如果你不能标准化工作表,你怎么能希望标准化代码呢?如果你不能做一个,你可以做另一个。 you 如何知道标题何时开始,如果标题实际上可以在任何地方?如果你不能回答这个问题,那么这里的其他人也不能。
-
@Larnu 已经尝试将 ``` HDR =NO``` 改为 ``` HDR =YES```` 没有发生任何事情
标签: c# asp.net sql-server excel database