Excelfile для DataGridview с ClosedXML - PullRequest
0 голосов
/ 09 января 2020

В моем проекте мне нужно импортировать Excelfile. Тип .xlsx. В файле есть таблица с 4 столбцами. Я должен добавить дополнительные столбцы в этот файл Excel. Моя проблема в том, что с моим решением DataGridview дважды имеет текст заголовка. И каждый раз, когда я снова читаю файл, я получаю новую строку с текстом заголовка. Я думаю, что проблема в foreach (ячейка IXLCell в строке. Ячейки ()), но я не могу найти там ошибку.

try
{

    OpenFileDialog OpenDataList = new OpenFileDialog();// Erzeugen einen OpenFileDialog-Objektes
    OpenDataList.Title = "Datenpunktliste öffnen"; // Initialisiert den Namen des Fensters
    OpenDataList.InitialDirectory = @"C:\Users\AdministratorOSMO\Desktop\Testordner"; // Legt den Default Dateipfad fest
    OpenDataList.Filter = "Excel Files|*.xls;*.xlsx"; // Filter für die zur Auswahl stehenden Dateitypen
    OpenDataList.FilterIndex = 2;// Legt den Standardfilter beim Öffnen fest

    if (OpenDataList.ShowDialog() == DialogResult.OK)//Abfrage ob der ShowDialog mit OK bestätigt wurde
    {
        string PathName = OpenDataList.FileName;// die Variable pathName wird mit dem Inhalt von Filename initialisiert
        using (XLWorkbook workBook = new XLWorkbook(PathName))//Arbeitmappe wird erstellt
        {

            IXLWorksheet workSheet = workBook.Worksheet(1);//Tabelle 1 der Excel-Datei wird in workSheet geschrieben
            DataTable dt = new DataTable();// neuer DataTable dt wird erzeugt
            bool firstRow = true;// Boolsche Variable für Erste Reihe ?
            foreach (IXLRow row in workSheet.Rows())
            {
                while (firstRow)

                {
                    foreach (IXLCell cell in row.Cells())
                    {
                    dt.Columns.Add(cell.Value.ToString());
                    }

                    dt.Columns.Add(new DataColumn("OK", typeof(bool)));
                    dt.Columns.Add(new DataColumn("Datum", typeof(string)));
                    firstRow = false;
                }

                dt.Rows.Add();

                int i = 0;
                foreach (IXLCell cell in row.Cells())
                {
                    dt.Rows[dt.Rows.Count-1][i] = cell.Value.ToString();
                    i++;
                }

                Dgv_Data_List.DataSource = dt;
                Dgv_Data_List.ReadOnly = true;

            }

        }                                       
    }
}
catch (Exception ex)
{
    MessageBox.Show("Error: " + ex.Message);
}

1 Ответ

1 голос
/ 09 января 2020

После установки заголовков столбцов из первой строки вы также обрабатываете ту же строку, что и обычная строка данных. Вы можете остановить это, используя continue до go до следующего ряда. (Также последние две строки ниже могут go вне foreach l oop.)

foreach (IXLRow row in workSheet.Rows())
{
    if (firstRow)       
    {
        foreach (IXLCell cell in row.Cells())
        {
            dt.Columns.Add(cell.Value.ToString());
        }

        dt.Columns.Add(new DataColumn("OK", typeof(bool)));
        dt.Columns.Add(new DataColumn("Datum", typeof(string)));
        firstRow = false;
        continue;  // go to next row
    }

    dt.Rows.Add();

    int i = 0;
    foreach (IXLCell cell in row.Cells())
    {
        dt.Rows[dt.Rows.Count-1][i] = cell.Value.ToString();
        i++;
    }
}

Dgv_Data_List.DataSource = dt;
Dgv_Data_List.ReadOnly = true;
...