如何在导入到SQL Server数据库中删除Excel电子表格的顶部行

时间:2019-02-28 17:03:51

标签: c# sql-server excel

Hello Stack Overflow社区。我正在用C#编写一个小型应用程序,可以将excel文件直接导入到SQL数据库中。我可以导入具有Excel文件中当前标头的文件,因为它们与数据库中的列名匹配(请参见下面的第二个图像链接),但是我希望为可以导入的excel文件增加一些灵活性。例如:我需要导入的某些excel文件的顶部带有图例,并且该图例与数据库中的列标题不匹配(请参见第一个图像链接)

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);
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

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 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++
        }
    }

看看这种方法是否可行。