Значения ячейки 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);