Интересно
Согласно
BUG: Excel ODBC Driver Disregards the FirstRowHasNames or Header Setting для Microsoft Jet OLE DB Provider должна работать возможность отключения с помощью параметра HDR=No этой возможности. Но у меня с такой строкой подключения
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + %1 + ";Extended Properties='Excel 8.0;Ndr=No;IMEX=1'" все равно первая строка принимается как заголовок (MDAC 2.7, ExcelXP)
Код, который я привел выше, не совсем корректно отображает данные в таких ячейках. Во-первых, сортировка идет в алфавитном порядке. Во-вторых, для ячеек, содержащих цифровые данные, имена будут отображаться в видет F1, F2 и т.д. В третьих, если встретятся одинаковые наименования (например, "дата"), то имена будет идти как "дата", "дата1" и т.д.
Сортировку можно побороть с помощью такого метода
X++:
{
ExcelImportADO excel;
Counter fieldCount;
Counter curField;
FileNameOpen fileName;
COM Conn;
COM SchemaTables;
COM TableFields;
COM SchemaColumns;
COM Fields;
COM Item;
int i;
ComVariant var;
Array arr = new Array(Types::Class);
Array values;
str name;
#define.adSchemaColumns(4)
#define.adSchemaTables(20)
;
filename = WinAPI::getOpenFileName(infolog.hWnd(), ["Microsoft Excel","*.xls"], '', "Выберите файл");
if (!filename)
throw error("@SYS26757");
excel = new ExcelImportADO(fileName);
if (excel.openFile())
{
fieldCount = excel.getFieldsCount();
Conn = excel.getConnection();
SchemaTables = Conn.OpenSchema(#adSchemaTables);
while (!SchemaTables.EOF())
{
TableFields = SchemaTables.Fields();
Item = TableFields.Item("TABLE_NAME");
var = Item.value();
info(strfmt("Table name : '%1'", var.bStr()));
arr.value(1, new ComVariant());
arr.value(2, new ComVariant());
arr.value(3, var);
arr.value(4, new ComVariant());
SchemaColumns = Conn.OpenSchema(#adSchemaColumns, ComVariant::createFromArray(arr));
// к сожалению, сортировка для Excel не работает
// SchemaColumns.sort("ORDINAL_POSITION");
values = new Array(Types::String);
while (!SchemaColumns.Eof())
{
Fields = SchemaColumns.Fields();
Item = Fields.Item("COLUMN_NAME");
var = Item.value();
name = var.bStr();
Item = Fields.Item("ORDINAL_POSITION");
var = Item.value();
values.value(var.double(), name);
SchemaColumns.MoveNext();
}
for (i=1;i<=values.lastIndex();i++)
info(values.value(i));
break;
//SchemaTables.MoveNext();
}
}
}
Для цифровых значений для правильной интерпретации необходимо указывать апостроф в начале. Простого указания формата ячейки как текст недостаточно
Общая рекомендация - всегда оставлять первую строку для заголовка (в принципе, наименования столбцов можно не задавать. В этом случае будут использоваться мена F1, F2 и т.д.)