|
02.09.2010, 02:38 | #1 |
Участник
|
Используя класс ExcelImportADO столкнулся со следущей проблемой - если Excel файл содержит более 65536 строк, то первый вызов функции excelImportADO.eof() возвращает TRUE - что НЕ ВЕРНО, т.к. ещё прохода по строкам не было и соотв. импорт заканчивается не начавшись.
Кто-нибудь сталкивался с подобной проблемой? Заранее спасибо! |
|
02.09.2010, 10:48 | #2 |
Moderator
|
Цитата:
Сообщение от erudit
Используя класс ExcelImportADO столкнулся со следущей проблемой - если Excel файл содержит более 65536 строк, то первый вызов функции excelImportADO.eof() возвращает TRUE - что НЕ ВЕРНО, т.к. ещё прохода по строкам не было и соотв. импорт заканчивается не начавшись.
Кто-нибудь сталкивался с подобной проблемой? X++: #CCADO static void Job333_gl00mieExcelImportADO(Args _args) { ExcelImportADO doc = new ExcelImportADO(@'C:\Test_gl00mie.xlsx', #adOpenStatic); ; doc.openFile(false); while(!doc.eof()) { print doc.getFieldValue(1,false); doc.moveNext(); } } Ну и в Class Declaration класса надо заменить шаблон строки подключения на рекомендацию AndyD'а: А вы openFile не забыли у себя сделать? А то .eof() возвращает true и когда recordset = null. |
|
|
За это сообщение автора поблагодарили: erudit (1). |
02.09.2010, 18:19 | #3 |
Участник
|
Спасибо огромное!
С меня причитается! Буду в Питере, обязательно свяжусь! Заменил строку соединения и всё заработало как аптеке! Ещё раз спасибо за скорую помощь! |
|
04.10.2010, 16:53 | #4 |
Участник
|
Всем доброго времени суток.
Ax3 SP3 Обнаружился непонятный глюк: Все файлы, что пока трогал, грузятся нормально (идёт загрузка из прайсов поставщиков цен во внутреннюю табличку). Кроме одного. В нём столбец цены подгружается без сотых. Везде всегда формат столбца стоял "общий". Изменение формата на "число" не помогало. Вот такой инфолог: X++: info(strFmt("%1",xlImport.getFieldValue(8,false))); info(strFmt("%1",xlImport.getFieldValue(8,true))); info(strFmt("%1",any2real(xlImport.getFieldValue(8,false)))); info(strFmt("%1",any2real(xlImport.getFieldValue(8,true)))); X++: 6713,08 6713,08 6 713,00 6 713,00 X++: SalesDDP = xlImport.getFieldValue(8,false); Есть ли идеи у кого-нибудь? |
|
24.08.2010, 11:37 | #5 |
Участник
|
Надо использовать не Jet, а ACE
http://www.microsoft.com/downloads/d...displaylang=en Строка подключения будет выглядеть так X++: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + %1 + ";Extended Properties='Excel 12.0'"
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Zabr (6), sukhanchik (6), gl00mie (5). |
24.08.2010, 11:48 | #6 |
Участник
|
Цитата:
Сообщение от AndyD
Надо использовать не Jet, а ACE
http://www.microsoft.com/downloads/d...displaylang=en Строка подключения будет выглядеть так X++: "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + %1 + ";Extended Properties='Excel 12.0'" |
|
24.08.2010, 11:58 | #7 |
Участник
|
Стоп. Поторопился. Работает, но.. как быть вот этими параметрами:
Цитата:
HDR=No;FirstRowHasNames=0;IMEX=1'
Цитата:
Error Сообщение (11:55:05) Метод "Open" в COM-объекте класса "ADODB.Connection" возвратил код ошибки 0x80004005 (E_FAIL), который означает: Невозможно найти устанавливаемый ISAM.
Error Сообщение (11:55:05) Набор таблиц недоступен. Приложение Excel инициализировано? Error Сообщение (11:55:05) Метод "Open" в COM-объекте класса "ADODB.Connection" возвратил код ошибки 0x80004005 (E_FAIL), который означает: Невозможно найти устанавливаемый ISAM. Error Сообщение (11:55:05) Невозможно открыть файл «c:\2007.xlsx» |
|
24.08.2010, 12:07 | #8 |
Участник
|
Вот здесь расписаны параметры подключения к Excel 2007
__________________
Axapta v.3.0 sp5 kr2 |
|
24.08.2010, 13:44 | #9 |
Участник
|
Цитата:
Сообщение от AndyD
Вот здесь расписаны параметры подключения к Excel 2007
Получается, что подключение к Excel 2003 и Excel 2007 делается по-разному. Получается, что для всех функций, загружающих что-либо в Аксапту с помощью класса ExcelImportADO, нужно предусмотреть выбор пользователем формата загружаемого файла Excel. Притом что уровень многих пользователей таков, что они вообще не имеют понятия о каких-то форматах файлов Excel, тем более не смогут их различить хотя бы по расширению файла. Неудобно. |
|
24.08.2010, 19:48 | #10 |
Administrator
|
Ну система-то сможет различить форматы - хотя бы по расширению. И в зависимости от расширения применить соответствующий механизм.
__________________
Возможно сделать все. Вопрос времени |
|
04.10.2010, 17:59 | #11 |
Участник
|
Похоже, у вас из этих ячеек значение выгружается как строка. А так как для преобразования any2real() десятичный разделитель ожидается точка, то, по-этому, и обрезаются копейки при преобразовании.
Может быть, в файле числа заколочены с апострофом впереди? Тогда будет игнорироваться тип ячейки, а визуально будет как число
__________________
Axapta v.3.0 sp5 kr2 |
|
05.10.2010, 12:25 | #12 |
Участник
|
Спасибо за ответ, правда не помогло насчёт апострофов - в экселе всё стандартно
А про any2real не знал, спасибо! В итоге тупо отбрутфорсил - поменял запятые на точки и any2real |
|
02.02.2011, 16:30 | #13 |
Участник
|
Не знаю, насколько это будет актуально для других, у нас при использовании класса ExcelImportADO (переосмысленного немного) выпадала в своё время ошибка:
Цитата:
Метод 'Open' в COM-объекте класса 'ADODB.Recordset' возвратил код ошибки 0x80004005 (E_FAIL), который означает: Определено слишком много полей.
Может кому съэкономит немного времени. |
|
07.03.2011, 12:46 | #14 |
Участник
|
Да, есть такое дело... оказывается, я это давно подправил у себя, но так и не выложил исправление на форуме (см. также это сообщение). В getExcelSheetNames() внутри цикла обработки названий таблиц, возвращаемых ADOX.Catalog, достаточно дописать небольшую проверку:
X++: for (i = 0; i < cnSheets; i++) { sheet = sheets.item(i); strSheet = sheet.name(); // если в имени не содержится '$', то это именованный диапазон, а не лист книги if (!strfind(strSheet, '$', 1, maxint())) continue; |
|
21.06.2011, 13:52 | #15 |
Moderator
|
Коллеги, добрый день!
А никто не сталкивался при использовании данного класса импорта со следующей проблемой? DAX 4.0SP2 (ядра пробовал разные), Excel2007. При импорте из файла, если одна из ячеек записи имеет длину более 256 символов, то запись просто пропускается и обрабатывается сразу следующая запись! Т.е. MoveNext() перескакивает запись с длинным полем, молча без какой-либо ошибки.Пробовал использовать Move(), разные типы курсоров, подключался через Jet и ACE, импортировал из 2003го формата - ничего не помогает. Посоветуйте плиз, что можно сделать. Или попробуйте кто-нибудь загрузить файл с ячейкой более 256 символов.
__________________
Андрей. |
|
21.06.2011, 17:02 | #16 |
Молодой, подающий надежды
|
Dax 2009 RU6
MS Office 2007 Строка подключения: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + _fileName + ";;Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1' Тип курсора: #adOpenForwardOnly 958 бездумнонабранных символов загружает без проблем, как в формате .xls, так и .xlsx Последний раз редактировалось pedrozzz; 21.06.2011 в 17:05. |
|
|
За это сообщение автора поблагодарили: Dron AKA andy (2). |
23.06.2011, 12:28 | #17 |
Moderator
|
Докладываю о результатах экспериментов.
Во-первых, спешу покаяться: в моем конкретном случае нужен был курсор с возможностью предварительного подсчета кол-ва записей, поэтому #adOpenForwardOnly я не проверял Во-вторых, проблема решилась, и виновным оказалось определение типа столбца по первым строкам. Предполагаю, что т.к. в начале стояли короткие строки, то для всего столбца устанавливался укороченный строковый тип. И далее курсор глючил при переборе. Вышеописанная правка параметра в реестре полностью убрала проблему.
__________________
Андрей. |
|
12.08.2011, 15:22 | #18 |
Участник
|
а у меня не заработало, все исправления, которые есть использовал, всё равно не хочет нормально работать
использовал вот этот job X++: static void CorrectADOFileImport(Args _args) { ExcelImportADO excel; Counter fieldCount; Counter curField; FileNameOpen fileName; COM adoxCatalog = new COM(@"ADOX.Catalog"); COM Tables; COM Table; COM Columns; COM Column; int i; ; filename = WinAPI::getOpenFileName(infolog.hWnd(), ["Microsoft Excel","*.xls"], '', "Выберите файл"); if (!filename) throw error("@SYS26757"); excel = new ExcelImportADO(fileName); if (excel.openFile()) { fieldCount = excel.getFieldsCount(); adoxCatalog.ActiveConnection(excel.getConnection()); Tables = adoxCatalog.Tables(); Table = Tables.Item(0); if (Table) { Columns = Table.Columns(); for (i=0;i<Columns.Count();i++) { Column = Columns.Item(i); if (Column) info(Column.Name()); } box::info(int2str(fieldCount)); while (!excel.eof()) { info(excel.getFieldValue(1, true)); info(excel.getFieldValue(2, true)); info(excel.getFieldValue(3, true)); info(excel.getFieldValue(4, true)); info(excel.getFieldValue(5, true)); for (curField = 6; curField < fieldCount; curField++) { info(excel.getFieldValue(curField, true)); } return; //только первую строку //excel.moveNext(); } } } } пробегая дебаггером заметил, что он даже не читает его, вылетая вот с этой ошибкой Цитата:
Метод "Open" в COM-объекте класса "ADODB.Recordset" возвратил код ошибки 0x80004005 (E_FAIL), который означает: Недопустимое имя '0$'. Проверьте, что оно не содержит недопустимые символы или знаки препинания, а также не является слишком длинным.
p.s. dax 2009, строка в declaration "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + %1 + ";Extended Properties='Excel 8.0;HDR=No;FirstRowHasNames=0;IMEX=1'" p.p.s. а так хочется использовать этот класс для того, чтобы записывать данные в таблицы через классы Ax типа AxInventTable и им подобные хочу сам немного доработать этот класс, чтобы в первой ячейка например указывалась таблица, в которую вставлялись поля, а дальше список полей во второй строке, после чего строчки с данными. Думаю тогда импорт через стандартные группы определений Excel сам собой бы отпал с его низкой скоростью. Последний раз редактировалось niksen; 12.08.2011 в 16:48. |
|
16.08.2011, 13:03 | #19 |
Участник
|
Цитата:
лучше расскажите: = какой версией excel пользуетесь. = файл какой версии загружаете. = содержатся ли макросы в файле = включена ли защита от макросов в экселе см. также обсуждение про xlsx в этой ветке. вопрос: ответ 1 и ответ 2. |
|
16.08.2011, 18:07 | #20 |
Участник
|
Цитата:
Сообщение от niksen
а у меня не заработало, все исправления, которые есть использовал, всё равно не хочет нормально работать
(...) вместе с файлом импорт.xls, который выложил propeller. пробегая дебаггером заметил, что он даже не читает его, вылетая вот с этой ошибкой Цитата:
Метод "Open" в COM-объекте класса "ADODB.Recordset" возвратил код ошибки 0x80004005 (E_FAIL), который означает: Недопустимое имя '0$'. Проверьте, что оно не содержит недопустимые символы или знаки препинания, а также не является слишком длинным.
Последний раз редактировалось Владимир Максимов; 16.08.2011 в 18:26. |
|
|
За это сообщение автора поблагодарили: niksen (1). |