使用 ClosedXML 将 Excelfile 转换为 DataGridview
Excelfile to DataGridview with ClosedXML
在我的项目中,我必须导入一个 Excel 文件。类型为 .xlsx。该文件中有一个 table,有 4 列。我必须向这个 excel 文件添加额外的列。我的问题是,在我的解决方案中,DataGridview 有两次标题文本。每次我再次阅读文件时,我都会得到一个带有标题文本的新行。我认为问题出在 foreach(row.Cells() 中的 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);
}
从第一行开始设置列 headers 后,您还将处理同一行作为普通数据行。您可以使用 continue
转到下一行来停止它。 (下面的最后两行也可以在 foreach 循环之外。)
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;
在我的项目中,我必须导入一个 Excel 文件。类型为 .xlsx。该文件中有一个 table,有 4 列。我必须向这个 excel 文件添加额外的列。我的问题是,在我的解决方案中,DataGridview 有两次标题文本。每次我再次阅读文件时,我都会得到一个带有标题文本的新行。我认为问题出在 foreach(row.Cells() 中的 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);
}
从第一行开始设置列 headers 后,您还将处理同一行作为普通数据行。您可以使用 continue
转到下一行来停止它。 (下面的最后两行也可以在 foreach 循环之外。)
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;