Имя: Пароль:
1C
 
Как правильно работать по 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

Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Ексель=Скрипт.Eval("new ActiveXObject('Excel.Application')");
Книга=Ексель.Worksheets.Add();
//тут еще ченить
Ексель.Quit();
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", после пары попыток сравнения с представленным кодом пришлось ему согласиться, что по оле быстрее... просто надо знать как и в каких случаях...