В проекте Конвертация XLS в CSV для доступа к содержимому XLS файлов используется драйвер Microsoft Access Database Engine, который позволяет через источники данных ODBC открывать файлы Excel как базы данных.
На днях я столкнулся с проблеммой, что некоторые значения ячеек из XLS файла игнорируются и не переносятся в CSV файл.
После детального изучения проблемы я понял, что дело в типах данных, которые драйвер Microsoft Access Database Engine присваивает колонкам. По умолчанию драйвер считывает первых 8 строк таблицы файла XLS и на основе этих значений определяет типы данных колонок.
Например, имеется табличка
Артикул | Наименование | Количество |
39981312344 | Автостекло на HONDA CIVIC 3/5D HB (ДД+VIN) (2005-) | 4,00 |
70184342345 | Автостекло на ROVER 800 4D SED, 5D HB [крепеж] (1991-1998) | 2,00 |
24604324333 | Автостекло на BMW X1 5D (2010-) | 4,00 |
86144343523 | Автостекло на AUDI Q3 (2011-) | 1,00 |
35784355622 | Автостекло на FORD FOCUS III 4D SED, 5D HB, унив. (2011-) | 4,00 |
44413434556 | Автостекло на KIA OPTIMA 4D SED (2012-) | 4,00 |
44393453512 | Автостекло на KIA PICANTO 5D HB (2011-) | 3,00 |
63125224354 | Автостекло на OPEL CORSA D 5D HB (с октября 2006) (2006-) | 2,00 |
8831RGSE5RD | Автостекло на VOLVO XC90 5D [крепеж] (2002-) | 1,00 |
В этой таблице первые 8 артикулов состоят только из цифр, следовательно драйвер установит первой колонке числовой тип данных. В 9 строке для стекла VOLVO использован буквенно-цифровой артикул, а так как система уже установила числовой тип данных, то эта ячейка будет проигнорирована, как ошибочная.
Чтобы избежать подобных коллизий, нужно настроить драйвер Access Database Engine не определять тип данных ячеек. Это делается через системный реестр.
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel] "DisabledExtensions"="!xls" "ImportMixedTypes"="Text" "FirstRowHasNames"=hex:01 "AppendBlankRows"=dword:00000001 "TypeGuessRows"=dword:00000000
Ключ TypeGuessRows отвечает за то количество строк, которое используется для определения типов данных колонок. По умолчанию используется 8 строк: "TypeGuessRows"=dword:00000008. Чтобы отключить эту функцию, нужно установить "TypeGuessRows"=dword:00000000.
Более подробное описание всех ключей драйвера можно найти на странице msdn.microsoft.com.