Значения ячейки Excel усекаются OLEDB-провайдером

Я использую класс OleDbConnection для извлечения данных из книги Excel 2000/2003:

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                          "Data Source=" + filename + ";" +
                          "Extended Properties=\"Excel 8.0;IMEX=1\";";

OleDbConnection connection = new OleDbConnection(connectionString);
connection.Open();

// code to get table name from schema omitted

var dataAdapter = new OleDbDataAdapter(string.Format("SELECT * FROM [{0}]", name),connection);
var myDataSet = new DataSet();
dataAdapter.Fill(myDataSet, "ExcelInfo");

Теперь выясняется, что ячейки на листе длиной более 255 символов усекаются. Это ограничение в Microsoft.Jet.OLEDB-провайдере, или я могу что-то сделать с ним?

Кто-нибудь?

Ответ 1

Поставщик OLEDB для excel попытается автоматически определить типы данных, основанные на первых 8 строках данных, это можно установить с помощью свойства HDR = Yes/No в строке соединения. Кроме того, существует несколько типов, которые могут применяться к текстовым столбцам. Тип memo содержит более 255 символов, поэтому, если ни одна из первых 8 строк не имеет этого, он будет неправильно устанавливать тип данных.

Как изменить это, изменив параметр реестра, называемый TypeGuessRows, как описано здесь: Поддержка Microsoft

ПРИМЕЧАНИЕ. Допустимый диапазон значений для ключа TypeGuessRows составляет от 0 до 16. Однако, если значение равно 0, число отсканированных строк источника составляет 16384. Таким образом, если у вас очень большой файл, убедитесь, что самые большие строки первый.

Ответ 2

Попробуйте OleDBAdapter Excel QA Я отправил через переполнение стека.

Я заполнил ячейку рабочего листа (строки [0] [4]) с 445 символами, и она отлично работала... Добавьте это в конец кода для выхода

// DataSet:          
Object row0Col3 = ds.Tables["xlsImport"].Rows[0][2];
Object row0Col4 = ds.Tables["xlsImport"].Rows[0][4];

string rowZeroColumn3 = row0Col3.ToString();
string rowZeroColumn4 = row0Col4.ToString();

Console.WriteLine("Row 0, Col 4 string length: {0} " + Environment.NewLine + "Excel content: {1}", rowZeroColumn4.Length, rowZeroColumn4);