Имя: Пароль:
1C
 
открыть печатную форму в Excel
0 556
 
13.10.05
14:34
Добавил на печатную форму отчета кнопку/ячейку "Открыть в Excel"

Обработка ячейки таблицы следующая:

Попытка
   Excel = СоздатьОбъект("Excel.Application");
Исключение
   Сообщить("Нет возможности подключиться к Excel!");
   Excel = 0;
   Возврат;
КонецПопытки;

ИмяФайла = КаталогПользователя()+"\temp.xls";
Таблица.Записать(ИмяФайла,"XLS");

Excel.Workbooks.Open(ИмяФайла);
Excel.ScreenUpdating = 1;
Excel.EnableEvents = 1;
Excel.Visible = 1;        

Нужно чтобы пользователь мог открыть более одной печатной формы в екселе. Можно ли открывать новый, не записанный файл, т.е. не "temp.xls"?
1 Ковычки
 
13.10.05
14:35
Excel.Workbooks.Add()
2 skunk
 
13.10.05
14:53
Кстати учтите, что Эксель не дает открывать два файла с одинаковыми именами, даже если они находятся в разных папках.
3 skunk
 
13.10.05
14:54
надеюсь IUnknown простит
4 556
 
13.10.05
14:54
А можно ли получить новую, не сохраненную книгу экселя, содержимое которой будет  как "temp.xls"?
5 skunk
 
13.10.05
14:57
можно...
6 556
 
13.10.05
15:02
Думаю, что-то типа

Excel.Workbooks.<ОткрытьКакКопию>(ИмяФайла);

<ОткрытьКакКопию> - как правильно?
7 skunk
 
13.10.05
15:03
нет ... создавть новую... и скопировать в нее листы... temp.xls
8 556
 
13.10.05
15:05
Спасибо, буду пытаться.
9 skunk
 
13.10.05
15:15
да не за что....
10 avb
 
13.10.05
15:17
Ищи на проклабе обработку, автор - Natalia ...
11 556
 
13.10.05
17:19
Совсем запарился, не могу решение найти.
Напишите, пожалуйста, как скопировать существующие листы в новую книгу.
12 skunk
 
13.10.05
17:39
//*******************************************
// GetShortName(Name)
//
// Параметры:
//  Name     - Строка. Полное имя файла.
//
// Возвращаемое значение:
//  Строка. Короткое имя файла.
//
// Описание:
//  Функция извлекает из длинного имени файла
//  его короткое.
//
function GetShortName(Name)
   Answer = Name;
   // Получим длину переданной нам строки.
   LenName = strlen(Answer);
   // Установим указатель на последний символ.
   Pos = LenName;
   // Начнем искать самый последний слэш.
   // Если таковой имеется.
   Make = "yes";
   while Make = "yes" do
       // Посмотрим текущий символ.
       // Не слэш ли он.
       if mid(Answer, Pos, 1) = "\" then
           // Получим строку от слэша и до конца.
           // Это и есть короткое имя файла.
           Answer = right(Answer, LenName - Pos);
           // Выходим из цикла
           Make = "no";
       endif;
       // Уменьшим указатель на текущий символ.
       Pos = Pos - 1;
       // Если он равен нулю, то просмотрели все.
       // Слэша нет. Значит нам передали короткое имя.
       if Pos = 0 then
           // Выходим из цикла
           Make = "no";
       endif;
   enddo;
   return Answer;
endfunction

//*******************************************
// CopyWorsheetExcel(vlParameter)
//
// Параметры:
//  vlParameter - Список значений. Должен содержать
//                следующие значения:
//                InBook  - Строка. Полное имя файла источника.
//                OutBook - Строка. Полное имя файла цели.
//                Sheet   - Строка. Имя листа.
//
// Возвращаемое значение:
//  Число. 0 - лист скопирован. Иначе код ошибки:
//         1 - Не пердали ни одного файла.
//         2 - Файл источник не существует.
//         3 - Файл цель не существует.
//         4 - Не передали имя листа.
//         5 - Excel не установлен.
//         6 - В файле источника отсутсвует лист с
//             переданным наименованием.
//
// Описание:
//  Функция копирует лист Excel из одной книги в другую.
//  Если передали только одно имя, то создается копия листа
//  в этой же книге.
//
function CopyWorsheetExcel(vlParameter);
   // Получим из списка имя файлов.
   InFile = vlParameter.Get("InBook");
   OutFile = vlParameter.Get("OutBook");
   // Проверим правильность полученных параметров.
   if (emptyvalue(InFile) = 1) and (emptyvalue(OutFile) = 1) then
       // Если не передали не одного имени файла,
       // то закончим с ошибкой.
       return 1;
   elsif emptyvalue(InFile) = 1 then
       // Если получили только OutBook скопируем его
       // значение. Будем копировать лист в одной книге.
       InFile = OutFile;
   elsif emptyvalue(OutFile) = 1 then
       // Аналогично.
       OutFile = InFile;
   endif;
   // Проверим существование файла источника.
   if fs.ExistFile(InFile) = 0 then
       return 2;
   endif;
   // Проверим существование файла цели.
   if fs.ExistFile(OutFile) = 0 then
       return 3;
   endif;
   // Получим имя листа.
   InWorksheet = vlParameter.Get("Sheet");
   if emptyvalue(InWorksheet) = 1 then
       // Если значение пустое, то закончим с
       // ошибкой.
       return 4;
   endif;
   // Пробуем подключиться к OLE Server Excel
   try
       Excel = createobject("Excel.Application");
   except
       return 5;
   endtry;
   // Откроем файл источника.
   Excel.Workbooks.Open(InFile);
   // Если источник не равен цели, то
   if InFile <> OutFile then
       // откроем и файл цели.
       Excel.Workbooks.Open(OutFile);
   endif;
   // Получим указатели на открытые нами книги.
   InBook = Excel.Workbooks.Item(ShortName(InFile));
   OutBook = Excel.Workbooks.Item(ShortName(OutFile));
   // Посмотрим есть ли у источника лист с нужным
   // нам наименованием.
   try
       // Если есть, то получим указатель на него.
       InSheet = InBook.Sheets(InWorksheet);
   except
       // Иначе, говорим об ошибке.
       return 6;
   endtry;
   // Копируем лист.
   InSheet.Copy(OutBook.Worksheets(1));
   // Покажем результат пользователю.
   Excel.Visible = 1;
   Excel.EnableEvents = 1;
   Excel.ScreenUpdating = 1;
   return 0;
endfunction
13 skunk
 
13.10.05
17:40
интересно сработало )))


и это последнии строчки лучше так...

   // Покажем результат пользователю.
   Excel.EnableEvents = 1;
   Excel.ScreenUpdating = 1;
   Excel.Visible = 1;
14 556
 
13.10.05
17:55
skunk, великий тебе рахмат! В смысле, спасибо, помог!
15 skunk
 
13.10.05
17:57
это снипера... я просто с пастил... а за рахмат я знаю... сам не русский )))
16 556
 
13.10.05
18:47
Вот, может пригодится кому:

// открывает существующую таблицу 1С в екселе

ИмяФайла = "temp.xls";

Попытка
   Excel = createobject("Excel.Application");
Исключение
   message("Нет возможности подключиться к Excel!");
   Excel = 0;
   Возврат;
КонецПопытки;

Таблица.Записать(КаталогВременныхФайлов()+ИмяФайла,"XLS");

Excel.ScreenUpdating = 0;
Excel.EnableEvents = 0;
Excel.Visible = 0;

Excel.Workbooks.Open(КаталогВременныхФайлов()+ИмяФайла);

TempBook = Excel.Workbooks.Item(ИмяФайла);
OutBook = Excel.Workbooks.Add();

InSheet = InBook.Sheets(1);
InSheet.Copy(OutBook.Worksheets(1));

InBook.Close();
OutBook.Activate();

Excel.EnableEvents = 1;
Excel.ScreenUpdating = 1;
Excel.Visible = 1;  

Фс.УдалитьФайл(КаталогВременныхФайлов()+ИмяФайла);

Ещё возник вопрос. Как открыть новую книгу, чтобы на панели задач кнопка добавлялась после открытых книг, а не перед, как сейчас?
17 556
 
13.10.05
19:01
Все, понял, это происходит из-за Excel.Visible = 0. После Excel.Visible = 1 книги появляются не в том порядке
В примере вместо TempBook - InBook
18 clappa
 
14.10.05
12:01
(16)
Есть подводные камни.

Попробуй таким образом открыть "разноцветную" печатную форму.
Увидишь много интересного.

Есть ещё проблема с колонтитулами: у 1С свои спецсимволы - #P, #Q, #T, #D,
у Экселя свои - &P, &N, &T, &D

Кроме того, сомневаюсь, что у тебя срабатывает
Фс.УдалитьФайл(КаталогВременныхФайлов()+ИмяФайла);

Посмотри глОткрытьТаблицуВExcel() в
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3597
Может, пригодится
19 skunk
 
14.10.05
12:05
(18)он вообщето из экселя... в экселе... просто средствами 1С...


не много промазала...
20 clappa
 
14.10.05
12:09
(19) Да я не против, но если исходный xls он создает как в (0):
Таблица.Записать(ИмяФайла,"XLS")

то всё сказанное в (18) имеет силу
21 556
 
14.10.05
14:20
(20) посмотрел твою обработку - классно!

глОткрытьТаблицуВExcel() - то что надо, спасибо.
Думаю, будешь не против, если код выложу:

//_____________________________________________________________________________
//Функция открывает таблицу в MS Excel
//Таблица            - печатная форма 1С
//ИмяЛиста            - имя, которое будет присвоено листу книги MS Excel (если не задано, то остается "Sheet1")
//ОтображатьЯрлычки    - показывать/скрыть ярлычки листов в MS Excel
//ОтображатьСетку    - показывать/скрыть линии сетки в MS Excel
//УдалитьСтроки        - позволяет удалить указанное количество верхних строк таблицы
//УдалитьСтроки        - позволяет удалить указанное количество левых столбцов таблицы
Функция глОткрытьТаблицуВExcel(Таблица, ИмяЛиста = "", ОтображатьЯрлычки = 1, ОтображатьСетку = 1, УдалитьСтроки = 0, УдалитьСтолбцы = 0) Экспорт
   Перем Excel, ExcelWB, ExcelSh, ExcelPS, ИмяФайла, Рез, Зн, Зн1;
   Если ТипЗначенияСтр(Таблица) <> "Таблица" Тогда Возврат 0 КонецЕсли;
   Попытка Excel = СоздатьОбъект("Excel.Application") Исключение Сообщить("Не удалось открыть MS Excel","!"); Возврат 0 КонецПопытки;
   Пока 1=1 Цикл
       //Подберем уникальное имя для временного файла
       ИмяФайла = КаталогВременныхФайлов() + "1c" + СтрЗаменить(ТекущееВремя(), ":", "");
       Если (ФС.СуществуетФайл(ИмяФайла+".tmp") = 1) или (ФС.СуществуетФайл(ИмяФайла+".xls") = 1) Тогда ФС.УдалитьФайл(ИмяФайла+".tmp"); ФС.УдалитьФайл(ИмяФайла+".xls") Иначе Прервать КонецЕсли
   КонецЦикла;
   Таблица.Записать(ИмяФайла+".tmp", "XLS");
   Если ФС.СуществуетФайл(ИмяФайла+".tmp") = 0 Тогда Сообщить("Ошибка записи файла """ + ИмяФайла + "tmp""","!"); Excel = ""; Возврат 0 КонецЕсли;
   Рез = 1;
   Попытка
       ExcelWB = Excel.Workbooks.Add(ИмяФайла+".tmp");    //Откроем временный файл в Excel в режиме шаблона (чтобы не блокировать файл)
       Попытка                                            //Если на клиентской машине не установлен принтер, обращение к настройкам страницы вызывает ошибку. Поэтому работаем в "Попытка ... КонецПопытки"
           ExcelPS = ExcelWB.Sheets(1).PageSetup;        //Исправим спецсимволы в колонтитулах
           Зн = ExcelPS.LeftHeader;    Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.LeftHeader    = Зн1 КонецЕсли;
           Зн = ExcelPS.CenterHeader;    Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.CenterHeader    = Зн1 КонецЕсли;
           Зн = ExcelPS.RightHeader;    Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.RightHeader    = Зн1 КонецЕсли;
           Зн = ExcelPS.LeftFooter;    Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.LeftFooter    = Зн1 КонецЕсли;
           Зн = ExcelPS.CenterFooter;    Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.CenterFooter    = Зн1 КонецЕсли;
           Зн = ExcelPS.RightFooter;    Зн1 = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Зн, "#P", "&P"), "#Q", "&N"), "#T", "&T"), "#D", "&D"); Если Зн <> Зн1 Тогда ExcelPS.RightFooter    = Зн1 КонецЕсли;
       Исключение КонецПопытки;
       ExcelWB.SaveAs(ИмяФайла+".xls", -4143);            //Сохраним, чтобы обновить формат файла до текущего (xlNormal = -4143)
       ExcelWB.Close(0);                                //Закроем книгу ...
       ExcelWB = Excel.Workbooks.Add(ИмяФайла+".xls");    //... и вновь откроем в режиме шаблона
       Попытка
           ExcelSh = ExcelWB.Sheets(1);
           Если ПустаяСтрока(ИмяЛиста) = 0 Тогда            //Зададим имя ярлычка
               ExcelSh.Name = ИмяЛиста
           КонецЕсли;
           Если ОтображатьЯрлычки = 1 Тогда                //Сделаем видимыми ярлычки листов
               ExcelWB.Windows(1).DisplayWorkbookTabs = 1;
               ExcelWB.Windows(1).TabRatio = 0.6            //... и отодвинем горизонтальную полосу прокрутки от левого края
           КонецЕсли;
           Если ОтображатьСетку = 0 Тогда                    //Скроем линии сетки
               ExcelWB.Windows(1).DisplayGridlines = 0
           КонецЕсли;
           Если УдалитьСтроки > 0 Тогда                    //Удалим верхние строки
               ExcelSh.Range(ExcelSh.Rows(1), ExcelSh.Rows(УдалитьСтроки)).Delete()
           КонецЕсли;
           Если УдалитьСтолбцы > 0 Тогда                    //Удалим левые столбцы
               ExcelSh.Range(ExcelSh.Columns(1), ExcelSh.Columns(УдалитьСтолбцы)).Delete()
           КонецЕсли;
       Исключение КонецПопытки;
       ExcelWB.Saved = 0;
   Исключение
       Сообщить("Ошибка открытия файла в MS Excel","!"); Рез = 0
   КонецПопытки;
   Попытка Excel.Visible = 1 Исключение КонецПопытки;
   ExcelWB = ""; ExcelSh = ""; ExcelPS = ""; Excel = "";
   ФС.УдалитьФайл(ИмяФайла+".tmp");
   ФС.УдалитьФайл(ИмяФайла+".xls");
   Возврат Рез
КонецФункции //глОткрытьТаблицуВExcel
// (c) clappa

Действительно, у меня цветные формы открываются в екселе не в том виде. В случае с этой обработкой такого не наблюдается, не понял пока, в чем различия.

Excel.Workbooks.Add(ИмяФайла+".xls") - вот, то что искал :)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс