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: здесь

0
Your rating: Нет