![]() |
![]() |
![]() |
|
открыть печатную форму в 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") - вот, то что искал :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |