Как ускорить чтение из Экселя? #303438


#0 by Гений 1С
В общем большие файлы (7000 строк на 15 столбцов) читаются долго. Насильно ли ускорится загрузка, если юзать АДО?
#0 by Гений 1С
В общем большие файлы (7000 строк на 15 столбцов) читаются долго. Насильно ли ускорится загрузка, если юзать АДО?
#1 by zbv
Abrahams - предлагал считывать с помощью массива... реально ускоряет...
#2 by 774816
по карйне мере не придеться загружать весь application, а работать через адо надо что б файл имел  структуры эксель бд, + если выборка данных по условию то скул запрос и цикл по рекодсету на порядок быстрее должно быть
#3 by Гений 1С
может переконвертить в CSV?
#4 by Гений 1С
а потом читать как обычный текстовый? меня ведь только значения в ячейках интересуют...
#5 by Lendy
ускорится очень. Пример из жизни - 5 минут чтения файла 50тыс строк на 60 столбцов. Кусками через СОМ, через АДО 5-7 секунд.
#6 by Scooter
сохрани в ДБФ, если возможно
#7 by smaharbA
заспорим что по ОЛЕ быстрее ? а еще у адо есть неприятное ограничение (правдо оно невсегда мешает)
#8 by Lendy
не готов )) Понравилось, что одним запросом можно быстро получить данные с любым фильтром, объединить данные с разных листов и т.п.
#9 by nii
Подскажите, а записывать данные из 1с в Execl можно с помощью массива?
#10 by smaharbA
да, но это медленнее, чем читать
#11 by Kasper076
Если использовать компоненту GameWithFire, то можно сразу ТЗ получить. Я последнее время с Ехелем только через нее работаю.
#12 by Гений 1С
77/80 фри или за бабки?
#13 by Гений 1С
Пытаюсь читать через АДО, выдает ошибку: {Обработка.ЧтецЭлектронныхТаблиц}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft JET Database Engine): Не был задан текст команды для командного объекта. Можно вместо имени таблицы указывать ее номер, или причина не в этом?
#14 by Гений 1С
Разобрался, надо так:
#15 by Гений 1С
Интересно, а можно, чтобы дата преобразовывалась в строку по нужному правилу? И число тоже по определенному формату?
#16 by Гений 1С
т.е. я хочу чтобы при чтении по ADO дата преобразовывалась в строку YYYYMMDDHHMMSS, а число - строго в NNNNNNNNNNNNNNNNNN.NNNNNNNN т.е. без разделителей триад и с точкой как разделителем дробной части?
#17 by Гений 1С
алле, все еще актуально!
#18 by asady
у меня так крутится ЗначениеПоля=Строка(RecordSet.Fields(ИмяПоля).Value);
#19 by smaharbA
cast(field as varchar)
#20 by Гений 1С
АДОЗапись.Fields(iCount).Value - для поля типа дата выдает строку, видимо из-за IMEX=1 в строке коннекта: Смархаб, не говори загадками, я из АДО получаю уже преобразованную в строку значение, а мне нужно чтобы оно преобразовывалось как-то однообразно, независимо от локальных настроек...
#21 by Гений 1С
Хотя и без IMEX=1 тоже выдает дату как строку.
#22 by Гений 1С
Аппну, все еще актуально.
#23 by Sasha_H
И я Апну. Так как интересно мне тоже нуно :)
#24 by Гений 1С
Записывайтесь, товарисчы...
#25 by Sasha_H
И еще где можно почитать как работать с АДО и 8.х ???
#26 by lamme
0 ни у одного тебя проблемы ...
#27 by lamme
а покажи весь код работы с АДО т.е. - открыть excel файл пройтись по строчкам получить из строчки N параметр из колкни M ?
#28 by RKx
Специально для фиксина:) Кусок рабочего кода: Для 8-ки тоже работает. Пробовал.    db=CreateObject("ADODB.Connection");
#29 by Леха Дум
Драйвер MS читает первые 8 строк и, в зависимости от того какого типа данных больше, такой тип и выставляет для всей колонки, не соответствующие типу данные заменяются на NULL. IMEX=1 нужен чтобы сохранить формат разных данных и сами данные в колонке.
#30 by lamme
эта ... хм ... сообщить (НомерПП) должно выдавать что находиться в колонке 1 ?
#31 by lamme
а что означает строка Для сч=0 По cat.Tables.Count-1 Цикл в отладчике показывает что cat.Tables.Count = 0
#32 by lamme
приколньо ... :)
#33 by Гений 1С
Пожалста, вот код:
#34 by Гений 1С
чтение файла у меня работает, но мне нужно чтобы даты и числа преобразовывались по фиксированному формату, а не по локальному формату компа... Чтобы на разных компах я получал преобразование даты и числа по одному формату. Так что вы меня не поняли, код у меня есть. Вот о режиме IMEX=1 и идет речь.
#35 by Гений 1С
Да, оттуда я и взял каркас кода...
#36 by Гений 1С
число листов в экселе.
#37 by lamme
да ... я уж разобрался. только не понятно вот что ... у меня лист имеет название не Лист 1 - как обычно, а timesheet_freelance_sales_ret_l и водоная структура доступа - не видит лист вообще. Говоит - что листов 0
#38 by Гений 1С
Попробуй для теста переименовать лист, но здается у тебя дело в другом...
#39 by lamme
при переименовании - все нормально читаеться.
#40 by Гений 1С
Гыгыгы, х.з. АДО тупит
#41 by 774816
#42 by 774816
в ацессе такой код работает в экселе не знаю пробуй
#43 by lift
Попробуй кинуть из Excel в текстовый формат, а потом считать, с текстовиком 1С шустро работает, быстрее чем с дбф.
#44 by Гений 1С
Для этого нужно заранее знать тип данных в колонке, а если в колонке есть и даты и числа и строки, не катит, ведь АДО как-то догоняет... Не катит. АДО тоже летает, при преобразовании в текст будут такие же траблы с форматами, что и при АДО, так что проблема ВИСИТ.
#45 by 774816
не очень понял <а если в колонке есть и даты и числа и строки>  значение колонок зависят от типа колонки в одной колонке не может быть значение с типом дата или число если конечно это обычный текст и значения текстовые, а что бы определить тип колонок  для этого есть АДОЗапись.Fields.Type, что именно ты пытаешься сделать универсальную обработку чтения из экс файла?
#46 by Гений 1С
Товарищ, у меня в экселе хранится не таблица значений, а некая форма, поэтому тип колонок не катит... Неужели непонятно - АДО по локальным правилам преобразовывает дату и число в строку, а мне надо, чтобы он преобразовывал по глобальным правилам.
#47 by Гений 1С
То бишь я например знаю, что в ячейке 100-45 хранится дата, но она мне дает дату в локальном формате, поэтому я не знаю, как ее преобразовать в нормальную дату...
#48 by Гений 1С
К тому же заказчики не очень аккуратны и числа не всегда соответствуют формату, кроме того данные грузятся не из таблицы, а скорее из печатной формы, где таблица начинается гдето на 20-й строке, а в шапке - разные реквзииты...
#49 by Eugene555
Кстати установка IMEX=1 почему-то не помогает с типами...ситуация: выборка делается из Excel файла: c61661    111 c68001    121 В последней строке, где  значение = "Н/М" как получить то что нужно, т.е "Н/М"???
#50 by Fragster
Вопрос на многа денег, а работает ли это без установленного екселя?
#51 by nii
кстати, протестил варианты у себя через массив и ADO.... простой лист Excel, 15000 строк, 9 столбцов - через массив 3 сек - это с загрузкой в таблицу значений... через Ado ощутимо дольше.. даже дожидаться не стал... (массив супер!!!) :)
#52 by Гений 1С
Адо работает без экселя
#53 by Гений 1С
кинь код с массивом, я тоже протесчу
#55 by Sasha_H
Я у себя сделал вот такого универсального типа: Это Обработка в конфе. Далее с нужной мне обработины я использую данную функцию: Я это проганял через тест. А вот теперь хочу сказать в защиту 1С 7.7, она быстрее работает с АДО и быстрей работает с апликацией Екселя я был ошеломлен. Если сравнить загрузку с ексель СОМ-присоединением 8.х и Е = СоздатьОбъект("Excel.Application"); в 7.7 то семерка обходит по скорости адназначна с чтением Екселя. Аналогично прописал у себя в глобнике 7.7 Оттестил обращение: В загрузке участвовало 5000 строк, да 7.7 отсало на: === НАЧАЛО ТЕСТА ЕКСЕЛЬ-чтение через 1С === Начало тестирования: 29.10.07 10:13:19 Окончание тестирования: 29.10.07 10:13:36 ===================== === НАЧАЛО ТЕСТА ЕКСЕЛЬ-чтение через ADO === Начало тестирования: 29.10.07 10:13:53 Окончание тестирования: 29.10.07 10:13:57 =====================
#56 by Гений 1С
Гы, надо пощупать COm-Safe-Array, но в АДО так и остается непонятки с типизацией
#57 by Sasha_H
Заметил причину тяжелости работы 8.х с апликацией Екселя. 8.х может работать только с формаьтами Ексель 97-2003 на 2007 не пробовал. 7.7 работает с апликацией Екселя 5.0/95
#58 by Гений 1С
Ндык корифеи таки АДО есть? Ответят таки по локальным форматам даты и чисел? Неужели это не лечится?
#59 by Sasha_H
с необходимостью форматов пока не сталкивался и помочь в этом извени не смогу.
#60 by Гений 1С
т.е. ты вытягивал из Экселя через АДО только таблицы?
#61 by Гений 1С
алле, эксперты АДО, так что там с форматированием чисел и дат?
#62 by Гений 1С
алле, все еще актуально
#63 by Гений 1С
утренний ап, ибо нужно знать...
#64 by vde69
полезно полазить в папочке C:Program FilesCommon FilesSystemado там гораздо больше интересного чем кажеться на перый взгляд тоже вместо апа
#65 by Гений 1С
там только список констант
#66 by BabySG
Когда очень давно делал так на VBA: Format([ДатаОформления]," + Chr$ + "Short Date" + Chr$ + ") AS ДатаО, Format([ДатаВыдачи]," + Chr$ + "Short Date" + Chr$ + ") AS ДатаВ
#67 by Гений 1С
Не катит, ибо у меня в экселе не таблица из колонок, а таблица с шапкой (печатная форма документа)... Все еще интересно... Неужели мелкософтовцы не предусмотрели управление конвертацией форматов? Вот идиоты.
#68 by Гений 1С
ап в надежде на проходящего мимо знатока АДО...
#69 by Гений 1С
ап, ибо актуально...
#70 by Гений 1С
Чувак, огромное спасибо, через ComSafeArray все буквально летает, АДО нервно курит в сторонке, единственно на компе должен быть установлен Эксель. ;-) Так что буду юзать CSA, большое спасибо. Но вопрос про форматы АДО остается открытым, в CSA кстати типизация исходного файла передается...
#71 by Pashkaa
Гений подскажи как тебе помог пост 54 и как выглядит конечный код с ComSafeArray ?
#72 by Гений 1С
Кстати, я не уверен, что CSA быстрее ADO... В общем он у меня работает с такой же скоростью, как обычное чтение из Экселя, т.к. обычное чтение читает по 2-3 позиции в строке, а CSA грузит весь файл, хоть и быстро, но по времени то на то выходит. ;-)
#73 by nii
так это не мне, это smaharbA спасибо
#74 by nii
а насчет че быстрее...если обычная простенькая таблица то CSA быстрее чем АДО
#75 by Леха Дум
мои 5 копеек:
#76 by Гений 1С
Неа, батенько, це планируется как универсальный загрузчик, в том числе и для Star Office...
#77 by Леха Дум
я за оптимизацию кода. Кроме того можно использовать методы вызываемых сом-объектов для определения числа строк и столбцов. Одно дело планировать, а другое дело использовать в ожидании запланированного чего то еще - нет более постоянного чем временное :)
#78 by Гений 1С
Леха, не тупи, мне это 9999 нисколечко не мешает... Это всего лишь задание рамки... Как грится, слышал звон, да не знаешь где он... Короче, проехали...
#79 by Леха Дум
да уж, твоя гениальность не знает границ. Хотя может кому для начала и поможет...
#80 by Гений 1С
Гы, нарвался на засаду АДО. У него оказывается ограниченное число колонок только может считываться, трандец. Вот режимы подключения: Выдает ошибку, когда в файле у меня BD колонок...
#81 by Гений 1С
Ха, прикиньте, нашел еще способ ускорить через CSA. У меня грузилось штук 200 файлов. Ндык я каждый раз создавал приложение, открывал книгу, читал, закрывал книгу, закрывал приложение. Профайлер показал на строке Excel=Неопределено 56% времени. Трандец. Теперь я изменю цикл: создавал приложение, открывал книгу, читаю, закрываю, .... и так со всеми книгами и только в конце закрою приложение эксель. Предполагаю экономию в 50%. О, как , если с мозгами!
#82 by Гений 1С
Гы, сэкономить 50% времени за счет получилось! ;-) В общем результат трудов оформил в виде обработки, лазайте на infostart, качайте, изучайте. ;-)   А АДО Зараза - не дает открывать файл, где много колонок, вот сволочь Бил гейтс!
#83 by Pashkaa
Может продолжить развитие проекта
#84 by dk
С чтением не проверял, но при записи на больших объемах можно ускориться в 2-3 раза, если снизить приоритет процесса Excel. Т.е. приоритет процесса "1cv7s.exe" записывающего в Excel должен быть выше, чем у процесса "Excel.exe". Запись от абрахамса через массив будет шустрее, но не получится использовать форматирование, ... и прочие прелести OLE.
#85 by Pashkaa
Как бы еще ускорить метод Excel ExcelЛист.Cells(Строка, Столбец).Locked Это проверка защищена ли ячейка от записи
#86 by Pashkaa
Я понимаю что конфа писалась быстро и исключительно для тестирования скорости и в помощь другим, но предлагаю Гению 1С доработать вещи которые бросились мне в глаза: 1. Выбор файла xls. Пришлось писать руками путь. Ну добавь ты у реквизита ИмяФайла кнопку выбора по типу xls 2. Добавь выбор загружаемого листа (хотя бы номер что бы можно было указывать или имя)
#87 by у лю 427
специальная цена для гения - $997.89
#88 by у лю 427
предлагаю экономию 80% времени...
#89 by Гений 1С
Конфа писалась для программистов и пока находится в завершенном виде. ;-) Лень дописывать. Вот если кто драйвер для доков опен-офиса в этом же формате накидает, тогда вставлю и поправлю. Долой коммерцию на любовном фронте... Я и так 50% сэкономил за счет возможности держать коннекшн в открытом состоянии (и драйвер такой режим поддерживает)... см.
#90 by Pashkaa
Гений объясни почему ТекЛист.UsedRange.Rows.Count не правильно получает последнюю строку на листе? Какие есть предположения? Есть другие методы получения последней строки, например ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row; но как показала практика, если на листе есть связи с другими файлами Excel то метод выдает ошибку.
#91 by Гений 1С
Почему же, у меня выдает правильно. А что он выдает?
#92 by Pashkaa
Он выдает больше чем есть на самом деле (в доке 1525 строка а выдает 1570), т.е. 45 последних пустые а Ексель говорит что типа нет. Пробовал в доке выделить строки с 1526 по .... пока хватило нервов, и удалил их. Один чёрт выдает 1570. Может есть какая то особенность этого метода?
#93 by Pashkaa
Кстати спасибо за метод через CSA, использоваю в своей обработке, стало шустрее. Теперь всё тормозит ExcelЛист.Cells(Строка, Столбец).Locked может есть альтернатичные способы определения защиты ячейки?
#94 by Гений 1С
а зачем тебе LOcked?
#95 by Гений 1С
а если посмотреть вид для печати, эти строки показываются? Ну больше - это не меньше, не страшно... Может у этих ячеек заполнено форматирование, попробуй удалить их
#96 by Pashkaa
на предварительном просмотре этих строк нет. Удалять пробовал, не помогло. Я тоже подумал что больше это не меньше. Но боюсь, а вдруг выдас меньше :( Locked нужен по условию задачи, нужно заполнять ячейки только те которые не защищены в Excel. Этот метод дает возможность определения. Но поскольку он Excel-вский, то и работает это определение как черепаха
#97 by Гений 1С
Попробуй FindFormat юзать чтобы найти все Locked ячейки... или пробуй занести значение в ячейки, потом прочитай изменения, если изменились,значит не локед.
#98 by Pashkaa
А используя CSA можно ли назад запихать данные в Excel Или какие есть способы ускорить ExcelЛист.Cells(Строка.Номер, Столбец.Номер).Value = 0;
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С