C# 如何在导入到SQL Server数据库时删除Excel电子表格的顶行
你好,堆栈溢出社区。我正在用C编写一个小应用程序,它可以将excel文件直接导入SQL数据库。我可以导入Excel文件中包含当前标题的文件,因为它们与数据库中的列名匹配(请参见下面的第二个图像链接),但是我希望为可以导入的Excel文件增加一些灵活性。例如:我需要导入的某些excel文件顶部有一个图例,该图例与我的数据库中的列标题不匹配(请参见第一个图像链接) 顶部不包含该图例的文件很容易导入 我正在寻找一种在导入时删除前9行(文件顶部的图例)的方法 这里是所有的源代码。任何帮助都将不胜感激C# 如何在导入到SQL Server数据库时删除Excel电子表格的顶行,c#,sql-server,excel,C#,Sql Server,Excel,你好,堆栈溢出社区。我正在用C编写一个小应用程序,它可以将excel文件直接导入SQL数据库。我可以导入Excel文件中包含当前标题的文件,因为它们与数据库中的列名匹配(请参见下面的第二个图像链接),但是我希望为可以导入的Excel文件增加一些灵活性。例如:我需要导入的某些excel文件顶部有一个图例,该图例与我的数据库中的列标题不匹配(请参见第一个图像链接) 顶部不包含该图例的文件很容易导入 我正在寻找一种在导入时删除前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);
}
}
}
}
这是一个很好的小功能,可以将excel电子表格移动到datatable中,然后您可以将datatable插入sql db中。唯一需要更改的是删除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++
}
}
看看这种方法是否有效
这是一个很好的小功能,可以将excel电子表格移动到datatable中,然后您可以将datatable插入sql db中。唯一需要更改的是删除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++
}
}
看看这样是否有效。我会使用ExcelReaderFactory数据集方法,然后您可以从数据表中删除行。谢谢您或您的回复@jdweng,但您愿意澄清一点吗?在数据表配置中使用StartRowPosition=10谢谢您Krishna,但这似乎对我不起作用。我得到一个错误,StartRowPosition不在当前上下文中……我查看了源代码以找到DataSet方法。没有安装库来查找确切的方法。我认为代码是GetExcelDataReader(DataReader)。AsDataSet()我会使用ExcelReaderFactory数据集方法,然后您可以从数据表中删除行。谢谢您或您的回复@jdweng,但您愿意澄清一点吗?在数据表配置中使用StartRowPosition=10谢谢Krishna,但这似乎对我不起作用。我得到一个错误,StartRowPosition不在当前上下文中……我查看了源代码以找到DataSet方法。没有安装库来查找确切的方法。我认为代码是GetExcelDataReader(DataReader)。AsDataSet()感谢数字播放,非常感谢!如果我能使用这种方法,这将非常有效。我非常欣赏这段代码。我必须使用ExcelDataReader作为任务的一部分。我已经更新了上面的代码,以反映现在所有的工作代码。您是否愿意看一看,看看是否可以帮助解决上述源代码中的问题?再次感谢你的帮助@PJValentini是要跳过的总行数,总是一个设定的数量?是的,这是正确的,前9行每次都可以跳过。我将尝试你的更新代码。谢谢你的回复!谢谢您的数字播放,非常感谢!如果我能使用这种方法,这将非常有效。我非常欣赏这段代码。我必须使用ExcelDataReader作为任务的一部分。我已经更新了上面的代码,以反映现在所有的工作代码。您是否愿意看一看,看看是否可以帮助解决上述源代码中的问题?再次感谢你的帮助@PJValentini是要跳过的总行数,总是一个设定的数量?是的,这是正确的,前9行每次都可以跳过。我将尝试你的更新代码。谢谢你的回复!