ADO чтение Excel (тонкости)
Введение
Здесь должен быть пример соединения с xls фалом и чтением через ADO, но видимо появиться он позже(возможно по требованиям читателей).
1. Русские имена и спец. символы в названиях Закладок (Sheet-ов) Чтобы правильно читались имена закладок следует использовать Microsoft.Jet версии 4.0 и выше, а также в Extended Properties прописать Excel 8.0.
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\'filemane\';Extended Properties="Excel 8.0
Кроме того в названии Sheet необходимо кодировать зарезервированные символы (например \'.\').
Если на конце поля не стоит знак \'$\' его следует добавлять.
Для создания SQL запроса название Seet необходимо ставить в квадратных скобках []
Пример:
SheetName = AnsiReplaceStr(SheetName,".","#");
switch(*SheetName.AnsiLastChar()){
case \'\\'\': if(SheetName[SheetName.Length()-1] != \'$\') SheetName +=\'$\';
break;
case \'$\' :break; //add nothing
default: SheetName +=\'$\';
}
SqlStr = SqlStr+ "[" + SheetName + "]";
2. Смешанные данные в колонках (подводный камень способный попортить не мало крови) Из-за настроек по умолчанию Excel ваша программа считывающая данные из таблиц полностью заполненных может сбиться на тех таблицах в первых N (>8) записях которых пустые значения.
В результате, когда доходит до записей с не пустыми полям их значения возвращаются как NULL независимо от реального содержимого в XLS.
Для предотвращения подобной ситуации следует использовать аттрибут IMEX=1 в Extended Properties
При этом поля с неизвестным типом будут обрабатываться Excel как строковые. (При этом надо быть осторожным если вы кроме чтения производите запись в xls файл)
Excel использует для хранения настроек чтения Registry. Приведу интересные для нашего случая ключи
2.1. Ключ HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows определяет сколько записей брать для определения типа данных
При TypeGuessRows = 0 Excel просканирует весь файл.
2.2. HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/ImportMixedTypes
При ImportMixedTypes = Text смешанные поля будут браться как строки (По умолчанию они беруться как числовые значения)
Детали на английском описаны на Сайте Microsoft: здесь