Как я могу пропустить пустые столбцы в диапазоне? - PullRequest
1 голос
/ 17 февраля 2012

Я использую C # и Interop.Excel.Range, чтобы вернуть используемый диапазон столбцов для рабочего листа и записать использованные столбцы и строки в представление таблицы данных.Некоторые столбцы возвращают пустое / пустое значение.

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;

Есть ли способ пропустить или игнорировать пустые столбцы при записи этих столбцов, содержащих данные?

Спасибо запомощь!

1 Ответ

0 голосов
/ 07 мая 2012

Ключом к этому является использование функции рабочего листа VBA CountA, которая возвращает значение, указывающее, сколько ячеек в данном диапазоне имеет данные. Исходя из этого, вы можете решить, стоит ли создавать столбец в вашем DataTable.

Поскольку ваши столбцы таблицы и столбцы диапазона 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...