Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 18:33

Сохранение файла excel

Автор Рубен, 22 мар 2018, 10:18

0 Пользователей и 1 гость просматривают эту тему.

Рубен

Здравствуйте.

Необходимо создать файл excel на клиенте и сохранить его на сервере. На сервере операционная система Линукс. Данная операционная система не поддерживает файлы excel. Не могу понять как мне файл передать на сервер через временное хранилище. Код ниже.

&НаКлиенте
Процедура ВыгрузитьДанныеДляСайта(Команда)
   
   ВыгрузитьДанныеДляСайтаНаСервере();
   
   Массив = ПолучитьДанныеЭксель();
   
   Попытка
   
      Excel = Новый COMОбъект("Excel.Application");      
   
   Исключение
      
      Сообщить(ОписаниеОшибки());
      Возврат;
   
   КонецПопытки;


   Книга = Excel.WorkBooks.Add();
   Лист = Книга.WorkSheets(1);
   
   Лист.Cells(1,1).value = "Группа родитель";
   Лист.Cells(1,2).value = "Название группы родителя";
   Лист.Cells(1,3).value = "Дочерняя группа";
   Лист.Cells(1,4).value = "Название дочерней группы";
   Лист.Cells(1,5).value = "Второй родитель";
   Лист.Cells(1,6).value = "Третий родитель";
   Лист.Cells(1,7).value = "Четвёртый родитель";

   СчётчикСтрок = 2;
   
   Для Каждого ТекСтрока Из Массив Цикл
      
      Колонка = 1;
      
      Для Каждого Элемент Из ТекСтрока Цикл
      
         Лист.Cells(СчётчикСтрок,Колонка).value = Строка(Элемент);
      
         Колонка = Колонка + 1;
      
         СчётчикСтрок = СчётчикСтрок + 1;
      
      КонецЦикла;

   КонецЦикла;
   
   Попытка
      
      Книга.SaveAs(ИмяФайла);   
      Сообщить("Файл данных " + ИмяФайла + " успешно сохранён.");
      
   Исключение
      
      Сообщить(ОписаниеОшибки() + " файл не сохранён.");
      Возврат;

   КонецПопытки;
   
   Excel.quit();
   
   ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
   АдресДанных = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
      
   РаботаСХранилищемНаСервере(АдресДанных);
                     
КонецПроцедуры

&НаСервере
Процедура РаботаСХранилищемНаСервере(Файл)
      
   ПутьДанных = "/mnt/smb/dc/_link/Выгрузка/Структура каталога.xlsx";
   Данные = ПолучитьИзВременногоХранилища(Файл);
   Данные.Записать(ПутьДанных);   
   
КонецПроцедуры


sertak

Этот код не работает?

AIFrame

Цитата: Рубен от 22 мар 2018, 10:18&НаСервере
Процедура РаботаСХранилищемНаСервере(Файл)
      
   ПутьДанных = "/mnt/smb/dc/_link/Выгрузка/Структура каталога.xlsx";
   Данные = ПолучитьИзВременногоХранилища(Файл);
   Данные.Записать(ПутьДанных);   
   
КонецПроцедуры
Прозреваю, что писаться он овсе равно будет в контексте клиента, т.е. у клиента будет искать "/mnt/smb/dc/_link/Выгрузка/".
Посему, надо шарить и писать в сетевую шару.


alex0402

это будет писать на сервере.
Цитата: AIFrame от 22 мар 2018, 18:05т.е. у клиента будет искать "/mnt/smb/dc/_link/Выгрузка/".

нет. на сервер будет искать.
повторю вопрос
Цитата: sertak от 22 мар 2018, 13:55Этот код не работает?

выдает ошибки или просто файл не появляется где надо?
Спасибо за Сказать спасибо

AIFrame

Попробовал, да. При условии, что синхронные включены, писать из временного будет на сервере.
&НаСервере
Процедура СохранитьНаСервере(ВрХран)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ВрХран);

Попытка
ДвоичныеДанные.Записать(ПутьФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

КонецПроцедуры

&НаКлиенте
Процедура Сохранить(Команда)
Если НЕ ЗначениеЗаполнено(ПутьФайла) Тогда
Сообщить("Не заполнен путь файла");
КонецЕсли;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("txt");
Текст.Записать(ИмяВременногоФайла);
ВрХран = ПоместитьВоВременноеХранилище(новый ДвоичныеДанные(ИмяВременногоФайла), ЭтаФорма.УникальныйИдентификатор);
СохранитьНаСервере(ВрХран);
КонецПроцедуры

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

Рубен

Ошибку выдавал, что доступ к файлу "ИмяФайла" невозможен. Я его задал как реквизит с типом строка.
Пробовал так:
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
Книга.SaveAs(ИмяФайла);   
ДвочиныеДанные = Новый ДвоичныеДанные(ИмяФайла);

В итоге "Ошибка совместного доступа к файлу".

Мне подсказали, что можно создать файл с форматом "xlsx" c помощью "Новый ТабличныйДокумент" на сервере. Так что если у кого будет проблема, то можно с помощью табличного документа, а не COMОбъекта. Вопрос закрыт.

AIFrame

Цитата: Рубен от 22 мар 2018, 20:29можно с помощью табличного документа, а не COMОбъекта
У 1С плохо с нативным подражанием xls и xlsx. Особенно на 1000+ строк с картинками. На выходе будет каша.
Но, если что, можно писать xml и сохранять его c расширением xls. При должной сноровке получится та же табличка.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск