1с сохранить печатную форму в файл программно
После манипуляции с файлом необходимо его закрыть. В противном случае он останется захваченным в системе, и мы не сможем его использовать в других приложениях.
Клиент-Серверный вариант в управляемых формах.
1. Считываем данные из файла в массив из структур и затем этот массив передаем на сервер для дальнейших манипуляций с данными.
2-ой способ - это передать файл Excel на сервер через хранилище данных и далее работать с ним уже на сервере.
Очень часто приходится работать с очень большими файлами Excel, и его обработка путем перебора строк занимает огромное количество времени.
В таких случаех удобно в одно действие загрузить всю таблицу в массив и в потом работать уже непосредственно с массивом.
На выходе получаем двумерный массив, который содержит все данные указанного листа Excel
Полезные функции при работе с Excel:
Устанавливает видимость Excel при работе |
Добавление новой книги в файл Excel |
Сохранение книги Excel |
Добавление нового листа к книге |
Переименование листа |
Изменение маштаба листа |
Изменение ориентации листа |
Отступы листа |
Обращение к ячейки чтение/запись |
Обращение к области ячеек |
Очень часто при чтении или записи значений в Excel ставятся лишние пробелы в числе, например, вместо 1502 он читает как 1 502 и в дальнейшем это значение не приводится к числу. Эту проблему можно решить заменой. |
Объединение ячеек |
Работа с именованными ячейками в Excel |
Удаление ячейки |
Удаление области ячеек |
Обращение к строке |
Изменение ширины колонки |
Обращение к колонке |
Удаление Строки |
Фон ячейки / области / Строки / |
Функция переводит цвет из формата RGB в формат Excel |
Управление шрифтом в ячейки/строке/области |
Р азрешает переносить по словам в ячейке |
Управление рамкой ячейки |
Устанавливаем формат ячейки |
Формула в ячейки |
Формула в ячейки |
Формула в ячейки |
Формула в ячейки |
Функция для получения ширины колонки Excel Спасибо пользователю goodwill |
Разрешить перенос слов в ячейке Спасибо пользователю roofless |
Группировки данных на листе Спасибо пользователю dr-wit, ignor |
При работе с Excel мы оперируем столбцами как числом (Например, 1 столбец), а у Excel адресация столбцов производится с помощью символов. И когда нам нужно отредактировать формулу, то нам нужно номер столбца преобразовать в символ. В таких случаях вам пригодится эта функция.
2. Работа с Excel через ТабличныйДокумент 1С
С помощью данного метода можно и загружать из Excel и выгружать в Excel. Но на мой взгляд этот метод идепально подходит когда вам необходимо посто сохранить информацию в Excel без дальнейшей манипуляции.
Итак, приступим: загрузка из Excel:
1. Загружаем файл Excel в табличный документ
2. Производим манипуляции уже с ТабличнымДокументом
Давайте теперь разберем сохранение в Excel с помощью данного метода:
Тут все очень просто сначала мы формируем обычный Табличный документ и затем записываем его в Excel
2. Работа с Excel ADODB
Выражаю особую благодарность коллеги Fragster за хороший комментарий
Данный метод позволяет работать с Excel через ODBC и имеет ряд преимуществ:
- Не требует установки самой Excel, необходима лишь установить ODBC. Но как правило он уже установлен. Это особенность позволяет работать на стороне сервера без дополнительных установок Excel.
- Позволяет работать с таблицой Excel как с БД и строить к ней запросы на T-SQL. Таким образом мы можем делать отборы еще на этапе чтения данных и другие преимущества что дает Т-SQL. Что на мой взгляд огромный плюс.
Подключение к ADO
Отключение от ADO
Выполнение запроса
Пример запроса:
Запись в Excel тоже производится в виде запроса:
Хочу отметить что наименование полей производится по первой строке в таблице
ADODB предоставляет ряд объектов, с которыми мы работаем
ADODB.Recordset
В файле продемонстрированны оба варианта работы с запросами.
На этом пока все. По возможности буду дополнять статью :)
В архиве находится обработка, которая демонстрирует все описанные и другие возможности при работе с Excel.
&НаКлиенте
Процедура ФайлНачалоВыбора ( Элемент , ДанныеВыбора , СтандартнаяОбработка ) //необходимо в событии "НачалоВыбора" поля ввода вызвать ДиалогВыбораФайла
Диалог = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Открытие );
Диалог . Заголовок = "Выберите файл Excel" ;
Диалог . ПредварительныйПросмотр = Ложь;
Диалог . Фильтр = "(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx" ;
Если ЗначениеЗаполнено ( Объект . Файл ) Тогда
Диалог . ПолноеИмяФайла = Объект . Файл ;
КонецЕсли;
Если Диалог . Выбрать () Тогда
Объект . Файл = Диалог . ПолноеИмяФайла ;
КонецЕсли;
&НаСервере
Процедура ЗагрузитьИзXLS () // в документ Поступление материалов
// Попытка открытия файла Excel
Попытка
Excel_App = Новый COMОбъект ( "Excel.Application" );
Excel_App . WorkBooks . Open ( Объект . Файл );
Исключение
Сообщить ( "Произошла ошибка при открытии файла " + СокрЛП ( ОписаниеОшибки ())+ "! Операция прервана!" );
Возврат;
КонецПопытки;
// Попытка выбрать первый лист (можно указать другой)
Попытка
Excel_App . Sheets ( 1 ). Select ();
Исключение
// Если первый лист не найден - закрываем файл
Excel_App . ActiveWorkbook . Close ();
Excel_App = 0 ;
Сообщить ( "Первый лист не найден!" );
ОтменитьТранзакцию ();
Возврат;
КонецПопытки;
// Вычисление количества строк и колонок в зависимости от версии Excel
version_Ex = Лев ( Excel_App . Version , Найти ( Excel_App . Version , "." )- 1 );
Если version_Ex = "8" тогда
Колич_Строк = Excel_App . Cells . CurrentRegion . Rows . Count ;
Колич_Колонок = Макс ( Excel_App . Cells . CurrentRegion . Columns . Count , 13 );
Иначе
Колич_Строк = Excel_App . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Колич_Колонок = Excel_App . Cells ( 1 , 1 ). SpecialCells ( 11 ). Column ;
Конецесли;
// Имена колонок в файле должны совпадать с именами реквизитов табличной части, в которую загружаются данные
// Переменная ТЗ_Колонки содержит список номеров колонок, которые будут перегружаться
ТЗ_Колонки = Новый ТаблицаЗначений ;
ТЗ_Колонки . Колонки . Добавить ( "НомерКолонки" );
ТЗ_Колонки . Колонки . Добавить ( "НазваниеКолонки" );
Для Каждая_Колонка = 1 по Колич_Колонок Цикл
ИмяКолонки = Excel_App . Cells ( 1 , Каждая_Колонка ). Text ;
ИмяБезПробелов = СтрЗаменить ( ИмяКолонки , " " , "" ); // Удаление лишних пробелов из имен колонок
// Проверка наличия реквизитов табличной части "Материалы" в документе "ПоступлениеМатериалов"
Если НЕ ПроверкаРеквизитаТЧ ( ИмяБезПробелов , Метаданные . Документы . ПоступлениеМатериалов , "Материалы" ) Тогда
Сообщить ( "Не найден реквизит с именем " + ИмяБезПробелов + "! Колонка не будет загружена!" );
Иначе
Новая_Строка = ТЗ_Колонки . Добавить ();
Новая_Строка . НомерКолонки = Каждая_Колонка ;
Новая_Строка . НазваниеКолонки = ИмяБезПробелов ;
КонецЕсли;
// Если есть колонки для загрузки и есть колонка "Материалы" (обязательная к заполнению)
Если ТЗ_Колонки . Количество () <> 0 и
ТЗ_Колонки . НайтиСтроки (Новый Структура ( "НазваниеКолонки" , "Материалы" )). Количество () <> 0 Тогда
// Создание документа и заполнение реквизитов шапки
Тек_Документ = Документы . ПоступлениеМатериалов . СоздатьДокумент ();
Тек_Документ . Комментарий = "Загружено из файла " + Объект . Файл ;
Тек_Документ . Дата = ТекущаяДата ();
Тек_Документ . Ответственный = ПараметрыСеанса . ТекущийПользователь ;
Для Тек_Строка = 1 по Колич_Строк Цикл // Заполнение табличной части "Материалы"
Строка_Док = Тек_Документ . Материалы . Добавить ();
Строка_Док . Валюта = Тек_Документ . ТипЦен . ВалютаЦены ;
Для каждого Тек_ТЗ из ТЗ_Колонки Цикл
Тек_Значение = Excel_App . Cells ( Тек_Строка , Тек_ТЗ . НомерКолонки ). Text ;
// Получение имени колонки
ИмяКолонкиДокумента = Excel_App . Cells ( 1 , Тек_ТЗ . НомерКолонки ). Text ;
// Заполнение строки данными
Если ИмяКолонкиДокумента = "Материалы" Тогда
Строка_Док . Номенклатура = Справочники . Материалы . НайтиПоНаименованию ( Тек_Значение , Истина);
ИначеЕсли ИмяКолонкиДокумента = "Цена" Тогда
Строка_Док . Цена = Тек_Значение ;
ИначеЕсли ИмяКолонкиДокумента = "Ставка_НДС" Тогда
Строка_Док . Ставка_НДС = Тек_Значение ;
КонецЕсли;
КонецЦикла;
Тек_Документ . Записать ( РежимЗаписиДокумента . Проведение ); // Запись и проведение документа
Сообщить ( "Записан документ " + СокрЛП ( Тек_Документ ));
Иначе
Сообщить ( "В файле " + СокрЛП ( Объект . Файл )+ " не достаточно данных для заполнения документа!" );
КонецЕсли;
Excel_App . DisplayAlerts = 0 ;
Excel_App . Quit ();
Excel_App . DisplayAlerts = 1 ;
&НаСервере
Функция ПроверкаРеквизитаТЧ ( ИмяРекв , МетаданныеДок , ИмяТЧ )
// Проверка наличия ТЧ
ТаблЧасть = МетаданныеДок . ТабличныеЧасти . Найти ( ИмяТЧ );
Если ТаблЧасть = Неопределено Тогда // Нет такой таб. части в документе
Возврат Ложь; //реквизит не найден
Иначе
Возврат НЕ ( ТаблЧасть . Реквизиты . Найти ( ИмяРекв ) = Неопределено); //реквизит найден
КонецЕсли;
&НаСервере
Процедура ВыгрузитьВXLS ( Выб_Таблица )
Если Выб_Таблица . Количество () = 0 Тогда
Сообщить ( "Пустая таблица! Операция прервана!" );
Возврат;
КонецЕсли;
Попытка
Excel_App = Новый COMОбъект ( "Excel.Application" ); // Подключение к Excel
Исключение
Сообщить ( "Произошла ошибка при открытии файла " + СокрЛП ( ОписаниеОшибки ())+ "! Операция прервана!" );
Возврат;
КонецПопытки;
Попытка
Book_Excel = Excel_App . WorkBooks . Add ();
Sheet_Excel = Book_Excel . WorkSheets ( 1 );
Sheet_Excel . Name = "Test Sheet" ; // Присваиваем имя первому листу
Excel_App . ActiveWindow . View = 2 ; // Режим страничного просмотра
Excel_App . ActiveWindow . Zoom = 100 ; // Масштаб
Sheet_Excel . PageSetup . Orientation = 2 ; // Альбомная ориентация
Sheet_Excel . Columns ( 1 ). ColumnWidth = 20 ; // Ширина первой колонки
Sheet_Excel . Columns ( 2 ). ColumnWidth = 40 ; // Ширина второй колонки
Sheet_Excel . Columns ( 10 ). ColumnWidth = 15 ;
Sheet_Excel . Columns ( 11 ). ColumnWidth = 15 ;
Sheet_Excel . Cells ( 1 , 1 ). Value = "№ ПП" ; //Создаем шапку 1
Sheet_Excel . Cells ( 1 , 2 ). Value = "Текст" ;
Sheet_Excel . Cells ( 1 , 3 ). Value = "Числа" ;
Sheet_Excel . Cells ( 1 , 10 ). Value = "Дата" ;
Sheet_Excel . Cells ( 1 , 11 ). Value = "Формула" ;
Sheet_Excel . Cells ( 2 , 3 ). Value = "Число 1" ; //Создаем шапку 2
Sheet_Excel . Cells ( 2 , 4 ). Value = "Число 2" ;
Sheet_Excel . Cells ( 2 , 5 ). Value = "Число 3" ;
Sheet_Excel . Cells ( 2 , 6 ). Value = "Число 4" ;
Sheet_Excel . Cells ( 2 , 7 ). Value = "Число 5" ;
Sheet_Excel . Cells ( 2 , 8 ). Value = "Число 6" ;
Sheet_Excel . Cells ( 2 , 9 ). Value = "Число 7" ;
Sheet_Excel . Range ( "A1:A2" ). MergeCells = Истина; Sheet_Excel . Range ( "A1:A2" ). WrapText = Истина;
Sheet_Excel . Range ( "B1:B2" ). MergeCells = Истина; Sheet_Excel . Range ( "B1:B2" ). WrapText = Истина;
Sheet_Excel . Range ( "J1:J2" ). MergeCells = Истина; Sheet_Excel . Range ( "J1:J2" ). WrapText = Истина;
Sheet_Excel . Range ( "K1:K2" ). MergeCells = Истина; Sheet_Excel . Range ( "K1:K2" ). WrapText = Истина;
Sheet_Excel . Range ( "C1:I1" ). MergeCells = Истина; Sheet_Excel . Range ( "C1:I1" ). WrapText = Истина;
Sheet_Excel . Range ( "A1:K2" ). Borders . Linestyle = 1 ; //Линия границы
Sheet_Excel . Range ( "A1:K2" ). HorizontalAlignment = 3 ; //Выравнивание по горизонтали
Sheet_Excel . Range ( "A1:K2" ). VerticalAlignment = 2 ; //Выравнивание по вертикали
Sheet_Excel . Range ( "A1:K2" ). Font . Bold = 1 ; //Установим жирный шрифт в шапке
// Выгружаем данные в таблицу
Количество_Строк = 3 ; //Заполнение ТЧ начинаем с третьей строки
Для Каждого ТекСтрока Из Выб_Таблица Цикл
Sheet_Excel . Cells ( Количество_Строк , 1 ). Value = ТекСтрока . НомерПоПорядку ;
Sheet_Excel . Cells ( Количество_Строк , 2 ). Value = ТекСтрока . Табл_Текст ;
Sheet_Excel . Cells ( Количество_Строк , 3 ). Value = ТекСтрока . Табл_Число1 ;
Sheet_Excel . Cells ( Количество_Строк , 4 ). Value = ТекСтрока . Табл_Число2 ;
Sheet_Excel . Cells ( Количество_Строк , 5 ). Value = ТекСтрока . Табл_Число3 ;
Sheet_Excel . Cells ( Количество_Строк , 6 ). Value = ТекСтрока . Табл_Число4 ;
Sheet_Excel . Cells ( Количество_Строк , 7 ). Value = ТекСтрока . Табл_Число5 ;
Sheet_Excel . Cells ( Количество_Строк , 8 ). Value = ТекСтрока . Табл_Число6 ;
Sheet_Excel . Cells ( Количество_Строк , 9 ). Value = ТекСтрока . Табл_Число7 ;
Sheet_Excel . Cells ( Количество_Строк , 10 ). Value = ТекСтрока . Табл_Дата ;
Sheet_Excel . Cells ( Количество_Строк , 11 ). Formula = "=F" + Строка ( Количество_Строк )
+ "+G" + Строка ( Количество_Строк );
Количество_Строк = Количество_Строк + 1 ;
КонецЦикла;
Количество_Строк = Количество_Строк - 1 ; //Последняя строка для форматирования
Sheet_Excel . Range ( "A3:K" + Строка ( Количество_Строк )). Borders . Linestyle = 1 ; //Линия границы
Sheet_Excel . Range ( "A3:K" + Строка ( Количество_Строк )). VerticalAlignment = 2 ; //Выравнивание по вертикали
Для НомерСтроки = 3 По Количество_Строк Цикл // Установка числового формата
Для Столбец = 4 По 9 Цикл
Sheet_Excel . Cells ( НомерСтроки , Столбец ). NumberFormat = "0.00" ;
КонецЦикла;
Sheet_Excel . Cells ( НомерСтроки , 11 ). NumberFormat = "0.00" ;
КонецЦикла;
Исключение
Excel_App . Quit ();
Сообщить ( ОписаниеОшибки ());
Возврат;
КонецПопытки;
Попытка
Book_Excel . SaveAs ( Объект . Файл );
Сообщить ( "Файл " + Объект . Файл + " успешно сохранен" );
Исключение
Сообщить ( ОписаниеОшибки () + " Файл не сохранен!" );
Возврат;
КонецПопытки;
Попытка
Excel_App . Quit ();
Исключение
Сообщить ( ОписаниеОшибки ());
Возврат;
КонецПопытки;
Читайте также: