paul_vin Ответов: 1

Я хочу получить столбцы заголовка из листа excel, но для некоторых столбцов он показывает null


Я хочу взять заголовочные строки всех имен столбцов из Excel с помощью кода c#
Но это не дает всего заголовка столбца из Excel

Заголовок столбца листа Excel выглядит следующим образом
aa Aa год "31-Mar-2016[фактический]" " 31-Mar-2015 [фактический]"
"31 Марта 2014 Года[Актуально]"


последние 3 столбца содержат в нем десятичные значения данных, но он не показывает последние 3 столбца
в наборе данных





Он не показывает значение последних 3 столбцов заголовка

следующая строка-это из заданной строки кодов, чтобы взять одну за другой строку заголовка
строка columnName = HeaderColumns.Строки[0] [столбец.Имя_столбца].Метод toString();

Что я уже пробовал:

Для этого я создал следующий код

#region

protected void ReadHeaderRow(string filePath)
{
    string Fpath = filePath;
    string connString = string.Empty;
    if (filePath.EndsWith(".xlsx"))
    {
        //2007 Format
        connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", filePath);
    }
    else
    {
        //2003 Format
        connString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=No'", filePath);
    }
    using (OleDbConnection con = new OleDbConnection(connString))
    {
        using (OleDbCommand cmd = new OleDbCommand())
        {
            //Read the First Sheet
            cmd.Connection = con;
            con.Open();
            DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            con.Close();
            string firstSheet = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

            //Read the Header Row
            cmd.CommandText = "SELECT top 1 * From [" + firstSheet + "]";
            using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
            {
                DataTable HeaderColumns = new DataTable();
                da.SelectCommand = cmd;
                da.Fill(HeaderColumns);
                foreach (DataColumn column in HeaderColumns.Columns)
                {
                    string columnName = HeaderColumns.Rows[0][column.ColumnName].ToString();
                }
            }
        }
    }
}
#endregion

1 Ответов

Рейтинг:
2

Richard MacCutchan

Вы используете column.ColumnName как индекс, но это может не сработать, если значение не является строкой. Вам лучше использовать значение индекса и проверять значение null для каждого имени. Что-то вроде:

for (int index = 0; ; ++index)
{
    string columnName = HeaderColumns.Rows[0][index].Value.ToString();
    if (string.IsNullOrEmpty(columnName))
        break;
// etc
}


[редактировать]
Это то, что я использовал в прошлом для сбора информации через OLEDB:
OleDbCommand command = new OleDbCommand(string.Format("Select * From [{0}]", tableName), dbConnection);
OleDbDataReader reader = command.ExecuteReader();

while (dataGridView.RowCount > 1)
{
	dataGridView.Rows.RemoveAt(0);
}
if (reader.HasRows)
{
	dataGridView.ColumnCount = reader.FieldCount;

	for (int row = 0; reader.Read(); ++row)
	{
		dataGridView.Rows.Add();
		for (int column = 0; column < reader.FieldCount; ++column)
		{
			dataGridView.Columns[column].HeaderText = reader.GetName(column);
			Type columnType = reader.GetFieldType(column);
			dataGridView[column, row].Value = reader.GetValue(column);
			//if (columnType == typeof(String))
			//    dataGridView[column, row].Value = reader.GetString(column);
			//if (columnType == typeof(Int32))
			//    dataGridView[column, row].Value = reader.GetInt32(column);
			//if (columnType == typeof(Double))
			//    dataGridView[column, row].Value = reader.GetDouble(column);
		}
	}
}

[/редактировать]


paul_vin

[индекс].значение здесь значение, показывающее ошибку, то есть красную линию

Код сейчас есть

//foreach (столбец DataColumn в HeaderColumns.Столбцы)
//{
// string columnName = HeaderColumns.Строки[0] [столбец.Имя_столбца].Метод toString();
//}
for (int index = 0;; ++index)
{
строка columnName = HeaderColumns.Строки[0][индекс]. значение.Метод toString();
if (string.IsNullOrEmpty(имя столбца))
перерыв;
// прием
}

Отображение объекта ошибки не содержит определения для "значения", принимающего первый аргумент типа object не удалось найти (вы отсутствуете) директиву using или ссылку на сборку

Richard MacCutchan

Извините,но это работает для взаимодействия с Excel. Я думаю, что вы должны посмотреть на информацию, предоставленную классами OLEDB. Насколько я помню, существует какой-то метод или свойство, которое идентифицирует тип ячейки. И из этого вы можете получить значение в виде строки или любого другого типа объекта, который вам нужен.

paul_vin

хорошо спасибо

Richard MacCutchan

Смотрите мое обновление выше.