如何在导入到 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 中出现大量的空列 如何不出现空列呢,或怎么迅速删除

sqlserver 用命令如何导入导出表结构和表数据?

如何将EXCEL数据导入到SQL SERVER数据库中

如何删除大量数据 sql server2005 数据量在8千万左右??

如何远程把sql server中的数据导入到本地sql server中?

sql server的数据如何导入到mysql数据库中?