![]() |
![]() |
|
Как правильно работать по ole с Excel | ☑ | ||
---|---|---|---|---|
0
Klesk
10.11.08
✎
19:33
|
xls=СоздатьОбъект("Excel.Application");
xls.visible=0; xls.displayalerts=0; book=xls.Workbooks.Open(СокрЛП(ПутьКВрФайлу)); list=book.sheets(СокрЛП(ЛистКниги)); //делаем чтото book.close(); xls.Quit(); xls=""; Если в этот момент у пользователя открыта какая то другая книга, то она закрывается без предупреждения, видимо из за displayalerts Если убрать последнии три строчки, то будут висеть в памяти скрытые процессы excel. Хочется как то это провернуть отдельно, не затрагивая пользователя. Сорри если уже было, по поиску не нашел. |
|||
1
Стрелок
10.11.08
✎
19:37
|
проверяй ексель на открытость вначале. и если он открыт - закрывай... оно спросит про сохранение в книгах открытых
|
|||
2
v_rtex
10.11.08
✎
19:39
|
а Bitterman что говорит?
// может Если xls.Workbooks.Count()=0 Тогда xls.Quit(); КонецЕсли; |
|||
3
Стрелок
10.11.08
✎
19:40
|
(2) а я не то же самое написал?
|
|||
4
AcaGost
10.11.08
✎
19:40
|
//******************************************************************************
// ПолучитьКнигу(Книга, Путь) // // Параметры: // Книга, Путь // // Возвращаемое значение: // Нет // // Описание: // ТекстОписания // Функция ПолучитьКнигу(Путь, ИмяФайла, ФайлОткрыт) //Книга = ""; Попытка Эксель = СоздатьОбъект("Excel.Application"); Исключение Предупреждение("У Вас на компьютере не установлен Microsoft Excel. Импорт невозможен!"); Возврат ""; КонецПопытки; // Проверим, а может быть этот файл уже открыт // Организуем цикл по всем открытым Excel-файлам Для НОФ = 1 По Эксель.Workbooks.Count Цикл // Сравниваем по имени Если Эксель.Workbooks(НОФ).Name = ИмяФайла Тогда Книга = Эксель.Workbooks(НОФ); ФайлОткрыт = 1; Прервать; КонецЕсли; КонецЦикла; Если ФайлОткрыт = 0 Тогда // Откроем выбранный файл Попытка Книга = Эксель.Workbooks.Open(Путь + ИмяФайла); Исключение Предупреждение("Не смогли подключиться к " + ИмяФайла + ". Импорт невозможен!"); Возврат ""; КонецПопытки; КонецЕсли; Возврат Книга; КонецФункции // ПолучитьКнигу() ................................................... Если ФайлОткрыт = 0 Тогда Книга.Close(); Эксель = ""; КонецЕсли; |
|||
5
Ковычки
10.11.08
✎
19:59
|
можно создавать сколь угодно екземпляров екселя
|
|||
6
Стрелок
10.11.08
✎
20:05
|
(5) скажи как? а то юзеры часто пользуются экспортом из екселевских накладных. но забывают его перед этим закрыть. окно весит в фоне с вопросом
|
|||
7
Ковычки
10.11.08
✎
20:33
|
|
|||
8
Torquader Darigha
10.11.08
✎
20:45
|
Когда мы создали Excel и открыли в нём свою "любимую" книгу, то мы всегда можем узнать, а открыто ли ещё что-то
Excel=CreateObject("Excel.Application"); Excel.Visible=0; Excel.DisplayAlerts=0; Workbook=Excel.Open(НашаЗамечательнаяКнига); // чего-то там творим с ней // потом хотим закрыть if Excel.Workbooks.Count>1 then // то есть если открыты ещё какие-то книги, кроме нашей // не забываем восстановить свойство отображения предупреждений Excel.DisplayAlerts=-1; Excel.Visible=-1; Workbook.Close(); else // иначе закрываем приложение Workbook.Close(); Excel.Quit(); endif; Удачи. |
|||
9
Ковычки
10.11.08
✎
20:48
|
(8) а чо будет пользователь делать с этими визибл фалсе и дисплайалертс труе ?
|
|||
10
Torquader Darigha
10.11.08
✎
20:56
|
Если Excel закрыли, то никто об этом и не узнает - данные свойства в реестр не пишутся, а то, что при запуске обработки с экрана пропадёт Excel, так это временно - чтобы пользователь не мешал обработке.
А то ведь он может что-то в Excel-е поменять, когда она по Ele-вяжется. |
|||
11
Ковычки
10.11.08
✎
21:05
|
(10) думай головой голосуй за...(с)
юзер открыл в екселе свой любимый файл "Кто хочет стать миллионером", в адинес нажал загрузить/выгрузить и пля, нету екселя !!! |
|||
12
Ужас бухгалтера
10.11.08
✎
21:28
|
Вот потому специализированные средства для работы с файлами Excel гораздо лучше, чем работа по OLE. Автору лучше попробовать их. Это:
* ADO: http://google.ru * RiKSQL: http://www.rikcenter.ru/downloads.php * Йоксель: http://yoksel.net.ru/HomePage |
|||
13
Torquader Darigha
10.11.08
✎
21:29
|
А я б ему ещё и InternetExplorer на весь экран открыл с надписью "Иди пей чай и не скучай".
IeObject=CreateObject("InternetExplorer.Application"); IeObject.Visible=-1; IeObject.FullScreen=-1; IeObject.Navigate("about:blank"); while(IeObject.Busy); IeObject.Document.innerHTML="<FONT COLOR=RED SIZE=+5>Слушай, дорогой, не видишь, мы думаем, сходи попей чайку</FONT>"; ... что-то выполнить // на всякий пожарный, если Юзверь допёр до ALT+F4. try IeObject.Quit(); IeObject=0; catch endtry; |
|||
14
Ковычки
10.11.08
✎
21:34
|
(12) не пиарься ))) по оле всеравно быстрее чем адо, про твой ёксель не скажу, но за адо уже бился один боец, ничет у него не вышло, мене фих перешибить )))
|
|||
15
Ужас бухгалтера
10.11.08
✎
21:36
|
(14) Зато OLE через Ж работает :(( Такие дела...
|
|||
16
Torquader Darigha
10.11.08
✎
21:41
|
Оно всё через ж работает. Напрямую - это зачитать файл Excel, как бинарник, и в нём найти всё, что нужно.
Быстрее, это если написать Excel сцераний, который будет переносится в открываемый файл и там исполняться - сохранять на диск файл, который 1С потом поднимет и распарсит - получается в разы быстрее. |
|||
17
Ужас бухгалтера
10.11.08
✎
21:42
|
(16) И ADO, и RiK, и Йоксель зачитывают файл Excel как бинарник и находят там все, что нужно......
|
|||
18
Ковычки
10.11.08
✎
21:43
|
(16) ты перегрелся немного...
|
|||
19
Ужас бухгалтера
10.11.08
✎
21:46
|
(18) А у меня точек больше :)))
|
|||
20
Torquader Darigha
10.11.08
✎
21:47
|
ТОлько они находятся в отдельном процессе и просовывают весь обмен с 1С через систему сообщений Windows со всеми вытекающими тормозами и множественным копированием объектов в памяти. Если же DLL в адресном пространстве 1C будет читать Excel-файл как Storage, то никаких копирований и сообщений не будет - не будет торможения.
|
|||
21
Ужас бухгалтера
10.11.08
✎
21:49
|
(20) И ADO, и RiK, и Йоксель - это DLL, которые находятся в адресном пространстве 1С, и ничего ни через какую систему сообщений не просовывается.....................
|
|||
22
Ужас бухгалтера
10.11.08
✎
21:50
|
(18) А ты прав :)))
|
|||
23
Torquader Darigha
10.11.08
✎
22:00
|
Нифига подобного. Excel вообще Exe - отдельный процесс.
ADO для доступа к данным создаёт отдельные потоки, так что выглядит точно также. Вообще, любая COM-компонента выглядит как тормоз. |
|||
24
Ужас бухгалтера
10.11.08
✎
22:08
|
(23) А про Excel мы и не говорим :))) ADO загружается и создает свои "потоки" в адресном процессе 1С. Значит, взаимодействие и обмен данными происходит очень быстро.
Насчет тормозов COM ты, МЯГКО ГОВОРЯ, не в курсе. Например, 1С 8.х использует для работы с MSSQL систему OLE DB. А OLE DB это просто унифицированный набор COM-интерфейсов для взаимодействия с различными источниками данных. Я думаю, тут найдется целая орава товарищей, которая убедит тебя, восьмерка под SQL работает с вполне отличной скоростью. ADO - это OLE Automation шлюз к OLE DB, в частности. Ну и наконец, Йоксель вообще не использует COM для взаимодействия с 1С. Используются внутренние интерфейсы 1С, которые используются всем объектами встроенного языка 1С. Впрочем, эти интерфейсы не слишком отличаются от COM. |
|||
25
Torquader Darigha
10.11.08
✎
22:16
|
ADO для доступа к SQL - это одно, а для доступа к Excel - это другое.
При работе с SQL-сервером клиентская часть библиотеки даёт команды серверу, и, хотя они и перебрасываются через адресные пространства процессов (и даже компьютеров), но они являются командами SQL-серверу, и выполняет работу он (при этом тормоза при переносе данных могут быть только при получении данных запроса, да и то они меньше, чем время отображения этих данных). Когда же мы через ADO "идём" в Excel, то мы обращаемся к самому Excel через транслятор команд ADO, то есть немного медленнее, чем обращение к самой Excel, но при запросе документа по строкам может получиться быстрее, так как мы экономим время на отсутствии запроса каждый раз. Потом, если два потока работают с одним интерфейсом в одном процессе, то помимо трансляции данных существует ещё и блокировки ожидания освобождения объектов, при попытке доступа из двух потоков к одному объекту. |
|||
26
Ужас бухгалтера
10.11.08
✎
22:20
|
(25) Маленькая деталь: для работы с файлами Excel через ADO наличие самого Excel на машине не требуется.....
Эх, блин..... Прям как я в молодости.... |
|||
27
Torquader Darigha
10.11.08
✎
22:35
|
Зато требуется наличия драйвера ADO для доступа к Excel, не уверен, что драйвер быстрее самого Excel. Да и множество вресий Excel предполагают, что драйвер ещё и по ходу разбирается с какой версией Excel ему предстоит сношаться.
P.S. если сохранить Excel как CSV и загрузить как текст не быстрее ли будет ? (Хотя, Microsoft пишет COMMA SEPARATED - разделённый запятыми, а в файле точки с запятой - если они во всём такие правдивые, то понятно, почему Винда - тормоз). |
|||
28
Ужас бухгалтера
10.11.08
✎
22:51
|
(27) Ну, вообще-то, тут все вроде как говорят, что доступ через ADO на порядок быстрее. Драйвер быстрее как раз из-за работы "изнутри" 1С - без накладных расходов, связанных с LRPC, как это происходит с Excel.
А в CSV сохранить не всегда возможно - в каком формате прислали данные, в таком часто и приходится обрабатывать. Ну и насчет CSV еще большой вопрос. Например, взять числовое значение в его бинарном виде всяко быстрее, чем получить это числовое значение конвертацией из текста. А рассматриваемые способы работы с xls работают напрямую с бинарными данными. |
|||
29
Torquader Darigha
10.11.08
✎
23:07
|
А нахрена мне double, если мне нужно знать, что там точно написано.
например, double, который мы видим в Excel как число с двумя знаками после запятой, на деле может оказаться числом с пятью знаками. Если же читать Excel, как прислали, то маловероятно, что что-то получится прочитать быстро - проще открыть пользователю Excel на экран и предложить выбрать диапазон, который он собирается читать. P.S. пользователь не всегда понимает, что Excel - это только формат файлов, и что при вставке столбца в накладную, она потом может не "влезть" в 1С. |
|||
30
Ужас бухгалтера
10.11.08
✎
23:18
|
(29) Кроме double там есть еще несколько интересных вариантов хранения чисел. Если же там именно double, то чтение форматов отображения никто не отменял (хотя это уже больше теоретический вопрос).
А насчет "проще показать" - так ведь и альтернативными средствами тоже все можно прекрасно показать. Мучаться с Excel для этого совсем не обязательно. |
|||
31
Klesk
10.11.08
✎
23:47
|
(8) спасибо, это приемлимо
|
|||
32
Klesk
10.11.08
✎
23:48
|
(7) надо попробывать
|
|||
33
smaharbA
11.11.08
✎
05:32
|
(28) на счет адо и по оле из екселя, тут таварищь както сильно горячо спорил, после сказаного "OLE быстрее чем ADO", после пары попыток сравнения с представленным кодом пришлось ему согласиться, что по оле быстрее... просто надо знать как и в каких случаях...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |