我怎样才能跳过一个范围内的空白列?

我正在使用C#和Interop.Excel.Range返回一个工作表使用的列的范围,并将使用的列和行写入到datagrid视图。 一些列正在返回空白/ null。

Microsoft.Office.Interop.Excel.Range excelRange = wWorksheet.UsedRange; TabPage wTabPage = new TabPage(wWorksheet.Name.ToString()); DataGridView wDGV = new DataGridView(); wDGV.Dock = DockStyle.Fill; wTabPage.Controls.Add(wDGV); Sheets_TabControl.TabPages.Add(wTabPage); DataTable dt = new DataTable(); DataRow wNewRow = null; for (int i = 0; i < excelRange.Columns.Count; i++) { dt.Columns.Add(new DataColumn(i.ToString(), typeof(string))); } string wValue = string.Empty; Microsoft.Office.Interop.Excel.Range wRange = null; for (int wRowIndex = 1; wRowIndex <= skipRows; wRowIndex++) { wNewRow = dt.NewRow(); foreach (DataColumn wColumn in dt.Columns) { wRange = excelRange.Cells[wRowIndex, wColumn.Ordinal + 1]; if (wRange != null) { if (wRange.Value2 != null) { wValue = wRange.Value2.ToString(); if (!string.IsNullOrEmpty(wValue)) { wNewRow.SetField(wColumn, wValue); } } } } dt.Rows.Add(wNewRow) } wDGV.DataSource = dt; 

有没有办法在写入包含数据的列时跳过或忽略空白的列?

谢谢您的帮助!

关键是使用VBA工作表函数CountA ,它返回一个值,指示给定范围内有多less个单元格有数据。 基于此,您可以决定是否在DataTable创build一个列。

由于您的表格列和Excel范围列现​​在不同步,因此您需要使用您在代码中设置的列名作为相应Excel范围列的索引。

所以,重新调整你的代码:

 Microsoft.Office.Interop.Excel.Range excelRange = wWorksheet.UsedRange; TabPage wTabPage = new TabPage(wWorksheet.Name.ToString()); DataGridView wDGV = new DataGridView(); wDGV.Dock = DockStyle.Fill; wTabPage.Controls.Add(wDGV); Sheets_TabControl.TabPages.Add(wTabPage); DataTable dt = new DataTable(); DataRow wNewRow = null; // New code to create DataTable columns for (int i = 1; i <= excelRange.Columns.Count; i++) { // If the current column of cells does not contain any data, then don't add a column to the datatable if (xlSpreadsheet.App.WorksheetFunction.CountA(excelRange.Cells[Missing.Value, i]) != 0) { dt.Columns.Add(new DataColumn(i.ToString(), typeof(string))); } } string wValue = string.Empty; Microsoft.Office.Interop.Excel.Range wRange = null; for (int wRowIndex = 1; wRowIndex <= excelRange.Rows.Count; wRowIndex++) { wNewRow = dt.NewRow(); foreach (DataColumn wColumn in dt.Columns) { // Parse the column number we stored earlier as the column name int colNumber = 0; if (int.TryParse(wColumn.ColumnName, out colNumber)) { // We use the parsed column number to index the column in the Excel range wRange = excelRange.Cells[wRowIndex, colNumber]; if (wRange != null) { if (wRange.Value2 != null) { wValue = wRange.Value2.ToString(); if (!string.IsNullOrEmpty(wValue)) { wNewRow.SetField(wColumn, wValue); } } } } } dt.Rows.Add(wNewRow) } wDGV.DataSource = dt;