Проблема с форматированием ячеек Excel - PullRequest
6 голосов
/ 21 июня 2010

Я использую OleDB DataReader для получения данных из моих файлов Excel (но эта проблема возникает и в DataTable.Fill). Дело в том, что у меня есть столбец, который должен возвращать строки. Все хорошо и работает, но недавно возникла проблема, потому что ячейки столбца имели разные форматы. Некоторые были в цифрах, а другие в тексте. Когда я проверил, используя dataReader.GetSchema (), он показал, что рассматриваемый столбец был выведен как тип System.String. Проблема с этим заключалась в том, что все нетекстовые ячейки были немедленно установлены в нуль.

Есть ли способ предложить читателю, чтобы этот столбец просто анализировал столбцы как System.Object, вместо того, чтобы выводить его как System.String и выводить все не строковые ячейки?

Используемая строка подключения:

string connString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Источник данных =" + filePath + ";" + «Расширенные свойства = Excel 8.0;»;

и код:

using ( OleDbConnection connection = new OleDbConnection( connString ) )
{
    connection.Open();
    foreach ( string worksheetName in worksheetNames )
    {
        using ( OleDbCommand command = 
            new OleDbCommand( "SELECT * FROM [" + worksheetName + "]", connection ) )
        {
            TEntity entity;
            using ( OleDbDataReader dataReader = command.ExecuteReader() )
            {
                while ( dataReader.Read() )
                {
                    entity = GetDataFromDataTable( dataReader );

                    if ( entity != null )
                    {
                        entityList.Add( entity );
                    }
                }
            }
        }
    }
    connection.Close();
}

Ответы [ 2 ]

7 голосов
/ 21 июня 2010

Вам необходимо добавить IMEX или MAXSCANROWS в строку подключения.

MAXSCANROWS - Количество строк для сканирования, чтобы определить тип данных каждого столбца.Тип данных определяется с учетом максимального количества найденных типов данных.Если обнаружены данные, которые не соответствуют типу данных, угаданному для столбца, тип данных будет возвращен как значение NULL.

Для драйвера Microsoft Excel можно ввести число от 1 до 16 длястроки для сканирования.Значение по умолчанию равно 8;если он установлен в 0, все строки сканируются.(Число, превышающее ограничение, приведет к ошибке.)

Кроме того, проверьте реестр [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel] REG_DWORD "TypeGuessRows".Это ключ к тому, чтобы Excel не использовал только первые 8 строк, чтобы угадать тип данных столбцов.Установите это значение в 0 для сканирования всех строк.Это может ухудшить производительность.

2 голосов
/ 21 июня 2010

Две вещи, которые приходят на ум:

  1. Какой тип 'TEntity'. Это ограничено строками или другим типом?

  2. Какой тип списка - entityList. Это общий или список (TEntity), или какой-то другой тип?

...