Значения ячеек Excel усекаются OLEDB-провайдером - PullRequest
14 голосов
/ 22 мая 2009

Я использую класс 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-провайдере, или я могу с этим что-то сделать?

Любой

Ответы [ 2 ]

19 голосов
/ 22 мая 2009

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

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

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

2 голосов
/ 04 мая 2011

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

Я заполнил ячейку листа (Rows [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);           
...