导入到 SQL Server 后在数据库中显示额外的行
Posted
技术标签:
【中文标题】导入到 SQL Server 后在数据库中显示额外的行【英文标题】:Showing extra rows in database after importing to SQL Server 【发布时间】: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";
这是我要导入的表:
【问题讨论】:
欢迎来到 ***!了解您尝试导入的表格的结构将有助于回答您的问题(您当然可以匿名化单元格,但它应该足够详细,以便人们可以看到页眉、页脚和数据区域)。 您已经删除了足够多的重复帖子 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```` 没有发生任何事情
【参考方案1】:
处理波动的源文件很棘手。也许尝试将文件作为一个整体加载到原始表中,然后在加载表后调用 proc 以仅将与完整行匹配的列移动到您的产品或最终表中。例如,仅在 Data Mov、Data Valor、Descricao do Movimento 和 Valor em EUR 不为空的情况下从 raw 中选择。如果需要,您可以根据需要添加更多验证,例如检查前两列的日期格式和最后一列的数值。我只是认为在 SQL 中比在 .NET 代码中更容易。
【讨论】:
以上是关于导入到 SQL Server 后在数据库中显示额外的行的主要内容,如果未能解决你的问题,请参考以下文章
将excel数据导入sql server数据库表并在gridview中显示