如何在导入到 SQL Server 数据库时删除 Excel 电子表格的顶部行
Posted
技术标签:
【中文标题】如何在导入到 SQL Server 数据库时删除 Excel 电子表格的顶部行【英文标题】:How to remove the top rows of an Excel Spreadsheet on Import to a SQL Server Database 【发布时间】:2019-07-22 16:05:03 【问题描述】:你好 Stack Overflow 社区。我正在用 C# 编写一个小型应用程序,它可以将 excel 文件直接导入 SQL 数据库。我可以导入具有 Excel 文件中当前标题的文件,因为它们与我的数据库中的列名(参见下面的第二个图像链接)匹配,但是我希望为我可以导入的 excel 文件增加一些灵活性。例如:我需要导入的一些 excel 文件顶部有一个图例,而这个图例与我数据库中的列标题不匹配(参见第 1 个图像链接)
In this Image you can see the portion of the excel sheet I want to remove with code
顶部不包含该图例的文件很容易导入
Without the legend this is where the import can occur at line row 10 in the excel file
我正在寻找一种在导入时删除前 9 行(文件顶部的图例)的方法。
这里是所有的源代码。任何帮助将不胜感激。
using ExcelDataReader;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ProviderBreakfastExcelReader
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void BtnOpen_Click(object sender, EventArgs e)
using (OpenFileDialog ofd = new OpenFileDialog() Filter = "Excel Workbook|*.xlsx", ValidateNames = true )
if (ofd.ShowDialog() == DialogResult.OK)
var ExcelData = ExcelFileRead(ofd.FileName);
cboSheet.Items.Clear();
foreach (DataTable dt in ExcelData.Tables)
cboSheet.Items.Add(dt.TableName);
private void CboSheet_SelectedIndexChanged(object sender, EventArgs e)
string path = @"C:\Desktop\Dir\filename.xlsx";
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = reader.AsDataSet();
dataGridView.DataSource = result.Tables[cboSheet.SelectedIndex];
private DataSet ExcelFileRead(string path)
using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
using (IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs))
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
UseColumnDataType = true,
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
EmptyColumnNamePrefix = "Column",
UseHeaderRow = true,
);
return result;
private void SendExcelToDatabase(string Filename)
var data = ExcelFileRead(Filename);
using (var db = new ProviderBreakfastDBEntities())
foreach (DataRow record in data.Tables[0].Rows)
int rank;
var isValidRank = int.TryParse(record["Ranking"].ToString(), out rank);
db.ProviderBreakfastExcels.Add(new ProviderBreakfastExcel
Ranking = isValidRank ? rank : new int?(),
Contact = record["Contact"].ToString(),
LastName = record["LastName"].ToString(),
FirstName = record["FirstName"].ToString(),
// Bedsize = isValidBedsize ? beds : new int?(),
Bedsize = Convert.ToInt32(record["Bedsize"].ToString()),
City = record["City"].ToString(),
Company = record["Company"].ToString(),
JobTitle = record["JobTitle"].ToString(),
State = record["State"].ToString()
);
db.SaveChanges();
private void import_Click(object sender, EventArgs e)
OpenFileDialog ofd2 = new OpenFileDialog();
if (ofd2.ShowDialog() == DialogResult.OK)
string stringFileName = ofd2.FileName;
textBox1.Text = stringFileName;
SendExcelToDatabase(stringFileName);
【问题讨论】:
我会使用 ExcelReaderFactory DataSet 方法,然后您可以从 DataTable 中删除行。 谢谢您或您的回复@jdweng,但您愿意澄清一下吗? 在数据表配置中使用 StartRowPosition =10 谢谢克里希纳,但这似乎对我不起作用。我收到 StartRowPosition 不在当前上下文中的错误.... 我查看了源代码以找到 DataSet 方法。没有安装库来找到确切的方法。我认为代码是 GetExcelDataReader(DataReader).AsDataSet() 【参考方案1】:static void GetDataTableFromCsv(string path, bool isFirstRowHeader)
string header = isFirstRowHeader ? "Yes" : "No";
string pathOnly = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
string sql = @"SELECT [ColumnNamesFromExcelSpreadSheet] FROM [" + fileName + "]";
using (OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
";Extended Properties=\"Text;HDR=" + header + "\""))
using (OleDbCommand command = new OleDbCommand(sql, connection))
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
DataTable dt = new DataTable();
dt = CultureInfo.CurrentCulture
adapter.Fill(dt);
StringBuilder sb = new StringBuilder();
foreach (DataRow dataRow in dt)
foreach (var item in dataRow.ItemArray)
sb.Append(item);
sb.Append(',');
这是一个很棒的小功能,用于将 Excel 电子表格移动到数据表中,然后您可以将数据表插入到您的 sql 数据库中。唯一需要更改的是删除 x 行。
编辑:
private void SendExcelToDatabase(string Filename)
int rowThread = HowManyRowsYouWouldLikeToSkipInExcel;
var data = ExcelFileRead(Filename);
using (var db = new ProviderBreakfastDBEntities())
foreach (DataRow record in data.Tables[0].Rows)
if (!(rowThreshold >= x))
int rank;
var isValidRank = int.TryParse(record["Ranking"].ToString(), out rank);
db.ProviderBreakfastExcels.Add(new ProviderBreakfastExcel
Ranking = isValidRank ? rank : new int?(),
Contact = record["Contact"].ToString(),
LastName = record["LastName"].ToString(),
FirstName = record["FirstName"].ToString(),
// Bedsize = isValidBedsize ? beds : new int?(),
Bedsize = Convert.ToInt32(record["Bedsize"].ToString()),
City = record["City"].ToString(),
Company = record["Company"].ToString(),
JobTitle = record["JobTitle"].ToString(),
State = record["State"].ToString()
);
db.SaveChanges();
x++
看看这样的方法是否有效。
【讨论】:
感谢 Digit Plays,非常感谢! 如果我可以使用这种方法,这将非常有用。我非常感谢这段代码。我必须使用 ExcelDataReader 作为任务的一部分。我已经更新了上面的代码以反映现在所有的工作代码。您是否愿意看一下是否可以帮助解决上面的源代码?再次感谢您的帮助! @PJValentini 是要跳过的总行数,总是设定的数量? 是的,没错,前9行每次都可以走。我会试试你更新的代码。感谢您的回复!以上是关于如何在导入到 SQL Server 数据库时删除 Excel 电子表格的顶部行的主要内容,如果未能解决你的问题,请参考以下文章
把 Excel 文件导入 SQL Server 中出现大量的空列 如何不出现空列呢,或怎么迅速删除
如何删除大量数据 sql server2005 数据量在8千万左右??