Как сохранить файл Excel на клиенте?

1. maxster545 25.10.17 17:47 Сейчас в теме
На форуме есть ответы на вопрос, но не могу прикрутить к своей реализации.
И так, при нажатии на кнопку получаю Диалог:
&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
     ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
     //......
     Если ДиалогОткрытияФайла.Выбрать() Тогда
           ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
           Файл = СохранитьНаСервере();
           ВыгрузитьДанные(Файл);
           ПолучитьФайл(Файл, ИмяФайла);
     КонецЕсли
КонецПроцедуры

&НаСервере
Функция СохранитьНаСервере()
      Excel = Новый COMОбъект("Excel.Application");
      Excel.DisplayAlerts = 0;
      Книга = Excel.Workbooks.Add();

      ИмяВрем = ПолучитьИмяВременногоФайла(".xls");

      Excel.DefaultSaveFormat = 56;
      Книга.SaveCopyAs(ИмяВрем);

      Возврат ИмяВрем;
КонецФункции
Показать


Сомневаюсь в коде выше, была ошибка о том, что невозможно получить файл из временного хранилища.
Через ДвоичныеДанные пробовал, к какому-то результату не привело.

В итоге после нескольких попыток, случилось так, что пишет ошибку -21477467262(0x80004002) которая говорит о том, что Excel не установлен, хотя ранее подключалось без проблем. Хотелось бы понять как взаимодействовать или может посоветует кто толковый ГАЙД по этой теме?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. maxster545 25.10.17 17:48 Сейчас в теме
также вопрос в данном случае, как перетащить переменную "Книга".
Изначально именно в этом ошибка и была, и пока с ней разбирался, вылезло о том что Excel нету...
3. DarkUser 25.10.17 18:24 Сейчас в теме
В любом случае возвращать имя временного файла некорректно. Ни в виде переменной, ни в виде двоичных данных.
НаСервере вам необходимо сам файл эксель обернуть в двоичные данные и поместить во временное хранилище, после чего ссылку на временное хранилище передать НаКлиент.
user1463007; SeverBaP; +2 Ответить
4. SeverBaP 5 25.10.17 18:25 Сейчас в теме
8. maxster545 25.10.17 21:37 Сейчас в теме
(3) как это делается на практике?
9. DarkUser 25.10.17 22:29 Сейчас в теме
(8) Пример:

&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
	
	// Подготовить файл на сервере
	СсылкаВХранилище = ПодготовитьНаСервере();
	
	// Выбрать файл
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
	ДиалогОткрытияФайла.Фильтр             = НСтр("ru = 'Все файлы(*.*)|*.*'");
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок          = НСтр("ru = 'Выберите файл для сохранения!'");
	
	Если ДиалогОткрытияФайла.Выбрать() Тогда
		ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
	Иначе
		Возврат;
	КонецЕсли;
	
	// Запишем даннные в файл
	ДанныеФайла = ПолучитьИзВременногоХранилища(СсылкаВХранилище);
	ДанныеФайла.Записать(ИмяФайла);
	
	ПоказатьОповещениеПользователя("Файл записан!",,"Файл " + ИмяФайла + " записан.",,СтатусОповещенияПользователя.Информация);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПодготовитьНаСервере()
	
	Excel = Новый COMОбъект("Excel.Application");
	Excel.DisplayAlerts = 0;
	Книга = Excel.Workbooks.Add();
	
	ИмяВрем = ПолучитьИмяВременногоФайла(".xls");
	
	Excel.DefaultSaveFormat = 56;
	Книга.SaveCopyAs(ИмяВрем);
	Книга.Close();
	Excel.Quit();
	
	// Упаковка файла
	ФайлДанных = Новый ДвоичныеДанные(ИмяВрем);	
	СсылкаВХранилище = ПоместитьВоВременноеХранилище(ФайлДанных);
	
	Возврат СсылкаВХранилище;
КонецФункции
Показать


Но вообще работа с COM иногда выходит боком, так как уже сейчас заметная доля серверов работает по Linux. Стоит подумать над вариантом (5) с табличным документом. Вообщем желательно отвязываться от платформы, да и по времени COM работает гораздо дольше.

Ещё примеры: https://infostart.ru/public/398279/
10. maxster545 26.10.17 13:47 Сейчас в теме
(9)
ДанныеФайла.Записать(ИмяФайла);


Значение не является значением объектного типа, почему-то ДанныеФайла = Неопределено...
11. maxster545 26.10.17 14:17 Сейчас в теме
(10) понял почему, потому что обработку файла из клиента вызывал...
12. maxster545 26.10.17 15:21 Сейчас в теме
(9) однако, файл Excel пустой на выходе

&НаСервере
Перем Excel, Книга;

&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
    
    // Подготовить файл на сервере
    СсылкаВХранилище = ПодготовитьНаСервере();
    
    // Выбрать файл
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
    ДиалогОткрытияФайла.Фильтр             = НСтр("ru = 'Все файлы(*.*)|*.*'");
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок          = НСтр("ru = 'Выберите файл для сохранения!'");
    
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        ИмяФайла = ДиалогОткрытияФайла.ПолноеИмяФайла;
    Иначе
        Возврат;
    КонецЕсли;
    
    // Запишем даннные в файл
    ДанныеФайла = ПолучитьИзВременногоХранилища(СсылкаВХранилище);
    ДанныеФайла.Записать(ИмяФайла);
    
    ПоказатьОповещениеПользователя("Файл записан!",,"Файл " + ИмяФайла + " записан.",,СтатусОповещенияПользователя.Информация);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПодготовитьНаСервере()
    
    Excel = Новый COMОбъект("Excel.Application");
    Excel.DisplayAlerts = 0;
    Книга = Excel.Workbooks.Add();
    
    ИмяВрем = ПолучитьИмяВременногоФайла(".xls");
    
    Excel.DefaultSaveFormat = 56;
    Книга.SaveCopyAs(ИмяВрем);
    //Книга.Close();
    //Excel.Quit();
    
    // Упаковка файла
    ФайлДанных = Новый ДвоичныеДанные(ИмяВрем);    
    СсылкаВХранилище = ПоместитьВоВременноеХранилище(ФайлДанных);

    ВыгрузитьДанные(СсылкаВХранилище ); //используется Excel, Книга
    
    Возврат СсылкаВХранилище;
КонецФункции
Показать
5. protexprotex 139 25.10.17 18:28 Сейчас в теме
Точно. Тормоза (при передаче больших файлов), правда будут, но тут от этого никуда. Если есть просто необходимость сохранить что - то в excel - то проще сделать через создание табличного документа и через макет сохранять в формате excel. тут и установленный excel как таковой не понадобится. А еще можно через ADO - тут тоже excel не нужен.
6. maxster545 25.10.17 19:22 Сейчас в теме
(5) дело в том что создаю несколько страниц, используя гиперссылки, без COM тут думаю не обойтись
7. protexprotex 139 25.10.17 19:42 Сейчас в теме
(6) Ну, это да. Тогда - как и советуют через хранилище.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот