0
1С 8.x : Создание документа Excel по имеющемуся шаблону, оформлению.
Попытка
// Создать объект.
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Не удалось инициализировать Excel");
Возврат;
КонецПопытки;
Попытка
// Если при отработке следующего фрагмента кода произойдет ошибка
// объект "Excel.Application" будет закрыт.
// Открыть книгу, содержащую шаблон оформления.
Excel.Workbooks.Open("c:doc.xls");
НомерКниги = Excel.Workbooks.Count;
Книга = Excel.Workbooks.Item(НомерКниги);
Лист = Excel.ActiveSheet;
// Создать новую книгу (в нее будем записывать данные).
Excel.Application.Workbooks.Add(1);
НомерКниги = Excel.Workbooks.Count;
КнигаНовая = Excel.Workbooks.Item(НомерКниги);
ЛистНовый = Excel.ActiveSheet;
// Установить ширину колонки в новой книге.
ЛистНовый.Columns("B").ColumnWidth = 40;
// Копировать область из книги-шаблона в новую книгу.
Лист.Range("Шапка").Copy(ЛистНовый.Range("A1:E3"));
ЛистНовый.Cells(1, 1).Value = "Наименование контрагента";
// Считаем, что в нашем случае необходимо сформировать только
// две строки табличной части
Для НомерСтроки = 1 По 2 Цикл
Лист.Range("Строка").Copy(ЛистНовый.Range(ЛистНовый.Cells(3 + НомерСтроки,1), ЛистНовый.Cells(3 + НомерСтроки, 5)));
// Записать значение в ячейку листа новой таблицы
// в реальном примере данные будут браться из информационной базы
ЛистНовый.Cells(3 + НомерСтроки, 1).Value = НомерСтроки;
ЛистНовый.Cells(3 + НомерСтроки, 2).Value = "Наименование номенклатурной позиции " + Строка(НомерСтроки);
ЛистНовый.Cells(3 + НомерСтроки, 3).Value = НомерСтроки;
ЛистНовый.Cells(3 + НомерСтроки, 4).Value = НомерСтроки;
ЛистНовый.Cells(3 + НомерСтроки, 5).Value = НомерСтроки;
КонецЦикла;
Excel.Visible = Истина;
Исключение
Сообщить(ОписаниеОшибки());
Excel.Quit();
КонецПопытки;
4 — 07.08.10 — 11:58
Перем Эксель, Книга, Лист;
Перем ТабСпр;
Перем Листы;
Перем СпСпрВыгр, СпСпрРегл;
Перем СпНеРегСчетов;
Перем ТабНеРег;
Перем Таб10, Таб43, Таб60, Таб62, Таб76;
//*********************************************************
//
Процедура ВыборФайла(ИмяФайла, Фильтр=»txt»)
Каталог = «»;
Стр = «Файл настройки (*.» + Фильтр + «)|*.» + Фильтр + «»;
Если ФС.ВыбратьФайл(0, ИмяФайла, Каталог, «Выберите файл», Стр, , ) = 1 Тогда
ИмяФайла = Каталог + ИмяФайла;
КонецЕсли;
КонецПроцедуры
//*********************************************************
//
Процедура ПриНачалеВыбораЗначения( Элемент, Флаг )
Если Элемент = «ФайлДляЗагрузки» Тогда
Флаг = 0;
ВыборФайла(ФайлДляЗагрузки, «xls»);
КонецЕсли;
КонецПроцедуры
//******************************************************************************
// ЗапуститьПриложениеЭксель(Знач Путь)
//
// Параметры:
//
//
// Описание:
// Процедура
//
Процедура ЗапуститьПриложениеЭксель(Знач Путь,ТекЛист=»»)
Если ФС.СуществуетФайл(Путь)=0 Тогда
Предупреждение(«Неверно задан путь или не существует файл по пути » + СокрЛП(Путь));
Возврат;
КонецЕсли;
Попытка
// запускаем Эксель-Server
Эксель = СоздатьОбъект(«Excel.Application»);
Исключение
Сообщить(ОписаниеОшибки(),»!»);
КонецПопытки;
Попытка
// открываем файл
Путь=СокрЛП(Путь);
Книга=Эксель.Application.Workbooks.Open(Путь);
Если ТекЛист=»» Тогда
Книга.Worksheets(1).Activate();
Иначе
Книга.Worksheets(ТекЛист).Activate();
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки(),»!»);
КонецПопытки;
Эксель.Visible=0;
Эксель.DisplayAlerts = 0;
КонецПроцедуры //ЗапуститьПриложениеЭксель(Знач Путь)
//*********************************************************
Процедура СоздатьЗакладки()
Для СчетчикЦикла = -Книга.Worksheets.Count По -2 Цикл
Книга.Worksheets(-СчетчикЦикла).Delete();
КонецЦикла;
Книга.Worksheets(1).Name = «Лист1»;
Для СчетчикЦикла = 1 По Листы.РазмерСписка() Цикл
Книга.Worksheets.Add();
Книга.Worksheets(1).Name = Листы.ПолучитьЗначение(СчетчикЦикла);
КонецЦикла;
Книга.Worksheets(Книга.Worksheets.Count).Delete();
КонецПроцедуры
//*********************************************************
//
Процедура ПриОткрытии()
Если (ПустоеЗначение(НачДата)=1) Тогда
НачДата = КонГода(ДобавитьМесяц(ТекущаяДата(), -12));
КонецЕсли;
КонецПроцедуры
Функция ВернутьЗначениеРеквизита(ЗнРекв)
Перем ВозврЗнач;
Если ТипЗначенияСтр(ЗнРекв) = «Перечисление» Тогда
ВозврЗнач = Строка(ЗнРекв);
ИначеЕсли ТипЗначенияСтр(ЗнРекв) = «Справочник» Тогда
Если СпСпрРегл.НайтиЗначение(ЗнРекв.Вид()) = 0 Тогда
Если ЗнРекв.Вид() = «Подразделения» Тогда
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(ЗнРекв.Вид());
Таб.Вывести();
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если СокрЛП(Таб.Область(СчетчикЦикла,1).Текст) = СокрЛП(ЗнРекв.Код) Тогда
ВозврЗнач = «П» + СокрЛП(Таб.Область(СчетчикЦикла,2).Текст);
Если Прав(ВозврЗнач, 1) = «.» Тогда
ВозврЗнач = Лев(ВозврЗнач, СтрДлина(ВозврЗнач) — 1);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
//ВозврЗнач = «П» + ЗнРекв.IDD;
Иначе
ВозврЗнач = ЗнРекв.IDD;
КонецЕсли;
Иначе
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(ЗнРекв.Вид());
Таб.Вывести();
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если СокрЛП(Таб.Область(СчетчикЦикла,1).Текст) = СокрЛП(ЗнРекв.Код) Тогда
ВозврЗнач = СокрЛП(Таб.Область(СчетчикЦикла,2).Текст);
Если Прав(ВозврЗнач, 1) = «.» Тогда
ВозврЗнач = Лев(ВозврЗнач, СтрДлина(ВозврЗнач) — 1);
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИначеЕсли ТипЗначенияСтр(ЗнРекв) = «Счет» Тогда
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(«МэпСчета»);
Таб.Вывести();
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если СокрЛП(Таб.Область(СчетчикЦикла,1).Текст) = СокрЛП(ЗнРекв.Код) Тогда
ВозврЗнач = СокрЛП(Таб.Область(СчетчикЦикла,2).Текст);
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
ВозврЗнач = ЗнРекв;
КонецЕсли;
Возврат ВозврЗнач;
КонецФункции
//*******************************************
Процедура ВыгрузитьПеремещения()
Док = СоздатьОбъект(«Документ.ТребованиеНакладная»);
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ПеремещениеТМЦ» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
Таб = СоздатьОбъект(«Таблица»);
Таб.ИсходнаяТаблица(«ВидЗатрат»);
Таб.Вывести();
НомСтр = 0;
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
Если Док.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
Если Док.ВидПеремещения = 1 Тогда
Продолжить;
КонецЕсли;
НомСтр = НомСтр + 1;
Лист.Cells(НомСтр, 1).Value = «‘» + Док.IDD;
Подр = «»;
Для СчетчикЦикла = 1 По 3 Цикл
Рекв = Док.ПолучитьАтрибут(«Субконто» + СчетчикЦикла);
Если ТипЗначенияСтр(Рекв) = «Справочник» Тогда
Если Рекв.Вид() = «Подразделения» Тогда
Лист.Cells(НомСтр, 2).Value = «‘» + ВернутьЗначениеРеквизита(Рекв);
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Для СчетчикЦикла = 1 По Таб.ВысотаТаблицы() Цикл
Если лев(Док.СчетЗатрат, 2) = Таб.Область(СчетчикЦикла, 1).текст Тогда
Лист.Cells(НомСтр, 3).Value = «‘» + Таб.Область(СчетчикЦикла, 2).текст;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура ВыгрузитьВыписки()
Док = СоздатьОбъект(«Документ.Выписка»);
ТабКонтр = СоздатьОбъект(«ТаблицаЗначений»);
ТабКонтр.НоваяКолонка(«ИДД»);
ТабКонтр.НоваяКолонка(«ДДС»);
ТабКонтр.НоваяКолонка(«Комментарий»);
ТабКонтр.НоваяКолонка(«Контрагент»);
ТабКонтр.НоваяКолонка(«Договор»);
ТабКонтр.НоваяКолонка(«Поступление»);
ТабКонтр.НоваяКолонка(«Списание»);
ТабКонтр.НоваяКолонка(«ДатаДок»);
ТабКонтр.НоваяКолонка(«НомерДок»);
ТабКонтр.НоваяКолонка(«ВидОплаты»);
ТабПодотчет = СоздатьОбъект(«ТаблицаЗначений»);
ТабПодотчет.НоваяКолонка(«ИДД»);
ТабПодотчет.НоваяКолонка(«ДДС»);
ТабПодотчет.НоваяКолонка(«Комментарий»);
ТабПодотчет.НоваяКолонка(«КоррСчет»);
ТабПодотчет.НоваяКолонка(«Сотрудники»);
ТабПодотчет.НоваяКолонка(«Субконто2»);
ТабПодотчет.НоваяКолонка(«Субконто3»);
ТабПодотчет.НоваяКолонка(«Поступление»);
ТабПодотчет.НоваяКолонка(«Списание»);
ТабПроч = СоздатьОбъект(«ТаблицаЗначений»);
ТабПроч.НоваяКолонка(«ИДД»);
ТабПроч.НоваяКолонка(«ДДС»);
ТабПроч.НоваяКолонка(«Комментарий»);
ТабПроч.НоваяКолонка(«КоррСчет»);
ТабПроч.НоваяКолонка(«Субконто1»);
ТабПроч.НоваяКолонка(«Субконто2»);
ТабПроч.НоваяКолонка(«Субконто3»);
ТабПроч.НоваяКолонка(«Поступление»);
ТабПроч.НоваяКолонка(«Списание»);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Если Док.ПометкаУдаления() = 1 Тогда
Продолжить;
КонецЕсли;
Если Док.Проведен() = 0 Тогда
Продолжить;
КонецЕсли;
док.ВыбратьСтроки();
Пока док.ПолучитьСтроку() = 1 Цикл
Если (Лев(Док.КоррСчет, 2) = «60»)
ИЛИ (Лев(Док.КоррСчет, 2) = «62»)
ИЛИ (Лев(Док.КоррСчет, 2) = «76») Тогда
ТабКонтр.НоваяСтрока();
ТабКонтр.ИДД = Док.IDD;
ТабКонтр.ДДС = ВернутьЗначениеРеквизита(Док.ВидДвижения);
ТабКонтр.Комментарий = Док.НазначениеПлатежа;
ТабКонтр.Контрагент = ВернутьЗначениеРеквизита(Док.Субконто1);
ТабКонтр.Договор = ВернутьЗначениеРеквизита(Док.Субконто2);
ТабКонтр.Поступление = Док.Приход;
ТабКонтр.Списание = Док.Расход;
ТабКонтр.ДатаДок = Док.ДатаДокВходящий;
ТабКонтр.НомерДок = Док.НомерДокВходящий;
Если Док.Приход <> 0 Тогда
Если (Лев(Док.КоррСчет, 2) = «60») Тогда
ТабКонтр.ВидОплаты = «Возврат от поставщика»;
Иначе
ТабКонтр.ВидОплаты = «Оплата от покупателя»;
КонецЕсли;
ИначеЕсли Док.Расход <> 0 Тогда
Если (Лев(Док.КоррСчет, 2) = «60») Тогда
ТабКонтр.ВидОплаты = «Оплата поставщику»;
Иначе
ТабКонтр.ВидОплаты = «Возврат покупателю»;
КонецЕсли;
КонецЕсли;
ИначеЕсли (Лев(Док.КоррСчет, 2) = «71») Тогда
ТабПодотчет.НоваяСтрока();
ТабПодотчет.ИДД = Док.IDD;
ТабПодотчет.ДДС = ВернутьЗначениеРеквизита(Док.ВидДвижения);
ТабПодотчет.Комментарий = Док.НазначениеПлатежа;
ТабПодотчет.КоррСчет = ВернутьЗначениеРеквизита(Док.КоррСчет);
ТабПодотчет.Сотрудники = ВернутьЗначениеРеквизита(док.Субконто1);
ТабПодотчет.Субконто2 = ВернутьЗначениеРеквизита(док.Субконто2);
ТабПодотчет.Субконто3 = ВернутьЗначениеРеквизита(док.Субконто3);
ТабПодотчет.Поступление = Док.Приход;
ТабПодотчет.Списание = Док.Расход;
Иначе
ТабПроч.НоваяСтрока();
ТабПроч.ИДД = Док.IDD;
ТабПроч.ДДС = ВернутьЗначениеРеквизита(Док.ВидДвижения);
ТабПроч.Комментарий = Док.НазначениеПлатежа;
ТабПроч.КоррСчет = ВернутьЗначениеРеквизита(Док.КоррСчет);
ТабПроч.Субконто1 = ВернутьЗначениеРеквизита(док.Субконто1);
ТабПроч.Субконто2 = ВернутьЗначениеРеквизита(док.Субконто2);
ТабПроч.Субконто3 = ВернутьЗначениеРеквизита(док.Субконто3);
ТабПроч.Поступление = Док.Приход;
ТабПроч.Списание = Док.Расход;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ВыпискаКонтрагенты» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
ТабКонтр.ВыбратьСтроки();
Пока ТабКонтр.ПолучитьСтроку() = 1 Цикл
Для СчетчикЦикла = 1 По ТабКонтр.КоличествоКолонок() Цикл
Лист.Cells(ТабКонтр.НомерСтроки, СчетчикЦикла).Value = «‘» + ТабКонтр.ПолучитьЗначение(ТабКонтр.НомерСтроки, СчетчикЦикла);
КонецЦикла;
КонецЦикла;
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ВыпискаПодотчет» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
ТабПодотчет.ВыбратьСтроки();
Пока ТабПодотчет.ПолучитьСтроку() = 1 Цикл
Для СчетчикЦикла = 1 По ТабПодотчет.КоличествоКолонок() Цикл
Лист.Cells(ТабПодотчет.НомерСтроки, СчетчикЦикла).Value = «‘» + ТабПодотчет.ПолучитьЗначение(ТабПодотчет.НомерСтроки, СчетчикЦикла);
КонецЦикла;
КонецЦикла;
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «ВыпискаПрочее» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
ТабПроч.ВыбратьСтроки();
Пока ТабПроч.ПолучитьСтроку() = 1 Цикл
Для СчетчикЦикла = 1 По ТабПроч.КоличествоКолонок() Цикл
Лист.Cells(ТабПроч.НомерСтроки, СчетчикЦикла).Value = «‘» + ТабПроч.ПолучитьЗначение(ТабПроч.НомерСтроки, СчетчикЦикла);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура ВыгрузитьРКО()
Док = СоздатьОбъект(«Документ.РасходныйОрдер»);
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «РасходныйОрдер» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
НомСтр = 0;
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
НомСтр = НомСтр + 1;
Лист.Cells(НомСтр, 1).Value = «‘» + Док.IDD;
Если (Лев(Док.КоррСчет.Код, 2) = «60») ИЛИ (Лев(Док.КоррСчет.Код, 2) = «76») Тогда
Лист.Cells(НомСтр, 2).Value = «Расчеты с контрагентами»;
Лист.Cells(НомСтр, 3).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто1);
Лист.Cells(НомСтр, 4).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто2);
ИначеЕсли Лев(Док.КоррСчет.Код, 2) = «71» Тогда
Лист.Cells(НомСтр, 2).Value = «Расчеты с подотчетными лицами»;
Лист.Cells(НомСтр, 3).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто1);
ИначеЕсли Лев(Док.КоррСчет.Код, 2) = «70» Тогда
Лист.Cells(НомСтр, 2).Value = «Прочие операции»;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура ВыгрузитьАО()
Для СчетчикЦикла = 1 По Книга.Worksheets.Count Цикл
Если СокрЛП(Книга.Worksheets(СчетчикЦикла).Name) = «АвансовыйОтчет» Тогда
Лист = Книга.Worksheets(СчетчикЦикла);
Прервать;
КонецЕсли;
КонецЦикла;
НомСтр = 0;
Док = СоздатьОбъект(«Документ.АвансовыйОтчет»);
Док.ВыбратьДокументы(НачДата, КонДата);
Пока Док.ПолучитьДокумент() = 1 Цикл
Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
НомСтр = НомСтр + 1;
Лист.Cells(НомСтр, 1).Value = «‘» + Док.IDD;
Лист.Cells(НомСтр, 2).Value = «‘» + ВернутьЗначениеРеквизита(Док.Сотрудник);
Лист.Cells(НомСтр, 3).Value = «‘» + ВернутьЗначениеРеквизита(Док.НаименованиеАванса);
Лист.Cells(НомСтр, 4).Value = «‘» + ВернутьЗначениеРеквизита(Док.КоррСчет);
Лист.Cells(НомСтр, 5).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто1);
Лист.Cells(НомСтр, 6).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто2);
Лист.Cells(НомСтр, 7).Value = «‘» + ВернутьЗначениеРеквизита(Док.Субконто3);
Лист.Cells(НомСтр, 8).Value = «‘» + ВернутьЗначениеРеквизита(Док.КомуЗаЧто);
Лист.Cells(НомСтр, 9).Value = «‘» + ВернутьЗначениеРеквизита(Док.ДатаС);
Лист.Cells(НомСтр, 10).Value = «‘» + ВернутьЗначениеРеквизита(Док.НомерДокумента);
Лист.Cells(НомСтр, 11).Value = ВернутьЗначениеРеквизита(Док.Сумма);
Лист.Cells(НомСтр, 12).Value = ВернутьЗначениеРеквизита(Док.СуммаПоОтчету);
Лист.Cells(НомСтр, 13).Value = ВернутьЗначениеРеквизита(Док.НДС);
Лист.Cells(НомСтр, 14).Value = ВернутьЗначениеРеквизита(Док.Количество);
Лист.Cells(НомСтр, 15).Value = ВернутьЗначениеРеквизита(Док.НаименованиеАванса);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура Сформировать()
Если ПустоеЗначение(НачДата) = 1 Тогда
Предупреждение(«Необходимо указать дату остатков!», 60);
Возврат;
КонецЕсли;
Если ПустоеЗначение(ФайлДляЗагрузки) = 1 Тогда
Предупреждение(«Необходимо указать файл для выгрузки остатков!», 60);
Возврат;
КонецЕсли;
ЗапуститьПриложениеЭксель(ФайлДляЗагрузки);
СоздатьЗакладки();
Лист = Эксель.Worksheets(1);
ВыгрузитьПеремещения();
ВыгрузитьВыписки();
ВыгрузитьРКО();
ВыгрузитьАО();
Книга.Save();
Эксель.DisplayAlerts = 1;
Эксель.Quit();
КонецПроцедуры
ТабСпр = СоздатьОбъект(«ТаблицаЗначений»);
Листы = СоздатьОбъект(«СписокЗначений»);
Листы.ДобавитьЗначение(«ПеремещениеТМЦ»);
Листы.ДобавитьЗначение(«ВыпискаКонтрагенты»);
Листы.ДобавитьЗначение(«ВыпискаПодотчет»);
Листы.ДобавитьЗначение(«ВыпискаПрочее»);
Листы.ДобавитьЗначение(«РасходныйОрдер»);
Листы.ДобавитьЗначение(«АвансовыйОтчет»);
СпСпрВыгр = СоздатьОбъект(«СписокЗначений»);
СпСпрРегл = СоздатьОбъект(«СписокЗначений»);
СпСпрРегл.ДобавитьЗначение(«СтатьиЗатратНаПроизводство»);
СпСпрРегл.ДобавитьЗначение(«ВидыНоменклатуры»);
СпСпрРегл.ДобавитьЗначение(«ПрочиеДоходыИРасходы»);
СпСпрРегл.ДобавитьЗначение(«ДвиженияДенежныхСредств»);
СпНеРегСчетов = СоздатьОбъект(«СписокЗначений»);
СпНеРегСчетов.ДобавитьЗначение(СчетПоКоду(«01.1»));
СпНеРегСчетов.ДобавитьЗначение(СчетПоКоду(«02.1»));
На чтение 9 мин Просмотров 26.4к. Опубликовано 09.11.2017
MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.
Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.
Содержание
- Обмен через табличный документ
- Обмен через OLE
- Использование COMSafeArray
- Обмен через ADO
- Выгрузка без программирования
Обмен через табличный документ
Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:
- Записать(<ИмяФайла>, <ТипФайлаТаблицы>) для выгрузки данных в файл;
- Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>) для загрузки данных из файла.
Внимание!
Метод Записать() доступен как на клиенте, так и на сервере. Метод Прочитать() доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.
Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:
- XLS95 — формат Excel 95;
- XLS97 — формат Excel 97;
- XLSX — формат Excel 2007.
Загрузка из файла осуществляется также достаточно просто:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:
- Значение;
- Текст.
Обмен через OLE
Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:
- На компьютере конечного пользователя, если обмен происходит на стороне клиента;
- На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.
Пример выгрузки:
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель.WorkBooks.Add();
// Позиционирование на первом листе
Лист = Книга.Worksheets(1);// Запись значения в ячейку
Лист.Cells(НомерСтроки, НомерКолонки).Value = ЗначениеЯчейки;// Сохранение файла
Книга.SaveAs(ИмяФайла);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;
Примеры чтения:
// —— ВАРИАНТ 1 ——
// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Открытие книги
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Close(0);// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;// —— ВАРИАНТ 2 ——
// Открытие книги
Книга = ПолучитьCOMОбъект(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;// Закрытие книги
Книга.Application.Quit();
Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:
// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
КонецЦикла;// —— ВАРИАНТ 2 ——
НомерСтроки = 0;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Если НЕ ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:
ВсегоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();
В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:
Действие | Код | Комментарий |
Работа с приложением | ||
Установка видимости окна приложения | Эксель.Visible = Ложь; | |
Установка режима вывода предупреждений (выводить/не выводить) | Эксель.DisplayAlerts = Ложь; | |
Закрытие приложения | Эксель.Quit(); | |
Работа с книгой | ||
Создание новой книги | Книга = Эксель.WorkBooks.Add(); | |
Открытие существующей книги | Книга = Эксель.WorkBooks.Open(ИмяФайла); | |
Сохранение книги | Книга.SaveAs(ИмяФайла); | |
Закрытие книги | Книга.Close(0); | |
Работа с листом | ||
Установка текущего листа | Лист = Книга.WorkSheets(НомерЛиста); | |
Установка имени | Лист.Name = Имя; | |
Установка защиты | Лист.Protect(); | |
Снятие защиты | Лист.UnProtect(); | |
Установка ориентации страницы | Лист.PageSetup.Orientation = 2; | 1 — книжная, 2 — альбомная |
Установка левой границы | Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка верхней границы | Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка правой границы | Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Установка нижней границы | Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | |
Работа со строками, колонками, ячейками | ||
Установка ширины колонки | Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | |
Удаление строки | Лист.Rows(НомерСтроки).Delete(); | |
Удаление колонки | Лист.Columns(НомерКолонки).Delete(); | |
Удаление ячейки | Лист.Cells(НомерСтроки, НомерКолонки).Delete(); | |
Установка значения | Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | |
Объединение ячеек | Лист.Range(Лист.Cells(НомерСтроки, НомерКолонки), Лист.Cells(НомерСтроки1, НомерКолонки1)).Merge(); | |
Установка шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Name = ИмяШрифта; | |
Установка размера шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Size = РазмерШрифта; | |
Установка жирного шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Bold = 1; | 1 — жирный шрифт, 0 — нормальный |
Установка курсива | Лист.Cells(НомерСтроки, НомерКолонки).Font.Italic = 1; | 1 — курсив, 0 — нормальный |
Установка подчеркнутого шрифта | Лист.Cells(НомерСтроки, НомерКолонки).Font.Underline = 2; | 2 — подчеркнутый, 1 — нет |
Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.
Использование COMSafeArray
При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.
// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом.SetValue(Кол, Стр, Значение);
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value = МассивКом;
Обмен через ADO
Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.
Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.
Пример выгрузки:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для команды
Команда = Новый COMОбъект(«ADODB.Command»);
Команда.ActiveConnection = Соединение;// Присвоение текста команды для создания таблицы
Команда.CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)»;
Команда.Execute(); // Выполнение команды// Присвоение текста команды для добавления строки таблицы
Команда.CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)»;
Команда.Execute(); // Выполнение команды// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение.Close();
Соединение = Неопределено;
Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:
// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект(«ADOX.Catalog»);
Книга.ActiveConnection = Соединение;// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект(«ADOX.Table»);
Таблица.Name = «Лист1»;
Таблица.Columns.Append(«Колонка1», 202);
Таблица.Columns.Append(«Колонка2», 7);
Таблица.Columns.Append(«Колонка3», 5);
Таблица.Columns.Append(«Колонка4», 5);// Создание в книге листа с описанной структурой
Книга.Tables.Append(Таблица);
Таблица = Неопределено;
Книга = Неопределено;
В приведенном примере в методе
Таблица.Columns.Append(«Колонка1», 202);
во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:
- 5 — adDouble;
- 6 — adCurrency;
- 7 — adDate;
- 11 — adBoolean;
- 202 — adVarWChar;
- 203 — adLongVarWChar.
Пример чтения:
// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект(«ADODB.Recordset»);
ТекстЗапроса = «SELECT * FROM [Лист1$]»;// Выполнение запроса
Выборка.Open(ТекстЗапроса, Соединение);// Обход результата выборки
Пока НЕ Выборка.EOF() Цикл
ЗначениеКолонки1 = Выборка.Fields.Item(«Колонка1»).Value; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка.Fields.Item(0).Value; // Обращение по индексу колонки
Выборка.MoveNext();
КонецЦикла;Выборка.Close();
Выборка = Неопределено;
Соединение.Close();
Соединение = Неопределено;
В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:
- YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
- NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.
В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:
- Connection;
- Command;
- Recordset;
- Record;
- Fields;
- Stream;
- Errors;
- Parameters;
- Properties.
Выгрузка без программирования
Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.
Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.
В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.
Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:
- Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
- Сохранить табличный документ в требуемый формат.
Как осуществить чтение/запись данных из/в Excel на языке 1с (используя COM-объект)
Здесь можно скачать шаблонную обработку, разработанную в среде «1С:Предприятие v8″ для работы с файлами Excel: [download id=»5»] В обработке осуществляются все основные действия с файлом Excel. Даны подробные комментарии. Можно использовать в качестве шаблона для разработки собственных выгрузок/загрузок в/из Excel.
Чтение данных из Excel
Доступ из 1С к Excel производится посредством OLE. Создание COM-объекта:
Попытка Эксель =Новый COMОбъект("Excel.Application"); // для v7 код будет: Эксель = СоздатьОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки;
Теперь используя переменную Эксель можно управлять приложением Excel.
- Внимание! Microsoft Excel должен быть установлен на компьютере!
Следующая команда откроет книгу:
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
Перед тем, как начать считывание данных, укажем лист книги, с которого будем считывать данные:
Лист = Книга.WorkSheets(НомерЛиста);
Нумерация листов книги начинается с 1. Общее количество листов можно получить, используя следующую команду:
КоличествоЛистов = Книга.Sheets.Count;
Лист можно выбрать по имени листа в книге:
Лист = Книга.WorkSheets(ИмяЛиста);
Имя листа в книге можно получить по номеру:
ИмяЛиста = Книга.Sheets(НомерЛиста).Name;
Точно так же можно задать имя листа:
Книга.Sheets(6).Name = "6 Резерв на отпуск";
Итак, мы открыли книгу и выбрали лист, теперь посмотрим, сколько строк и колонок на выбранном листе:
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Получим значения ячейки листа в строке НомерСтроки и в колонке НомерКолонки:
Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Ниже приведен отрывок кода, запустив который мы прочитаем все данные с первой страницы:
Эксель = СоздатьОбъект("Excel.Application"); Книга = Эксель.WorkBooks.Open(ПутьКФайлу); Лист = Книга.WorkSheets(1); ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; Для Строка = 1 По ВсегоСтрок Цикл Для Колонка = 1 По ВсегоКолонок Цикл Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value); КонецЦикла; КонецЦикла;
Где ПутьКФайлу — полный путь к файлу книги Excel (включая имя).
После выполнения действий необходимо закрыть книгу:
Эксель.Application.Quit();
Выгрузка данных в Excel
Для вывода (выгрузки) данных в Excel необходимо либо открыть существующую книгу, либо создать новую, и выбрать рабочий лист для вывода данных.
Для создания новой книги можно использовать следующий код:
Книга = Excel.WorkBooks.Add();
При создании книги автоматически создаются листы (по умолчанию 3). Нам остается только выбрать нужный:
Лист = Книга.WorkSheets(НомерЛиста);
Или добавить в книгу новый лист:
Лист = Книга.Sheets.Add();
Добавим в ячейку на листе значение:
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Запишем книгу:
Попытка Книга.SaveAs(ПутьКФайлу); Исключение Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); КонецПопытки;
Где ПутьКФайлу — полный путь к файлу книги Excel (включая имя).
После выполнения действий необходимо закрыть книгу:
Эксель.Application.Quit();
Как программно сохранить файл Excel в формате 2003 года
Синтаксис команды «SaveAs» во втором параметре разрешает указать формат сохраняемого файла.
Числовое значение фрмата файла Excel 2003: FileFormatNum = -4143
Т.е. команду сохранения для этого можно написатьтак:
Книга.SaveAs(ПутьДляЗаписиФайла, -4143);
Часто используемые методы Excel
Эксель.Visible = Видимость; | 0 — Excel не виден, 1 — виден. |
Книга = Эксель.WorkBooks.Add(); | Создание новой книги (файла) Excel. |
Книга = Эксель.WorkBooks.Add(ИмяФайлаШаблона); | Создание новой книги (файла) Excel по шаблону «ИмяФайлаШаблона» |
Книга.SaveAs(ИмяФайла); | Сохранение книги Excel. |
Лист = Книга.WorkSheets.Add(); | Добавление нового листа в книгу. |
Книга = Эксель.WorkBooks.Open(ИмяФайла); | Открытие существующей книги (файла) Excel. |
Лист = Книга.WorkSheets(НомерЛиста); | Установка листа в качестве рабочего с номером НомерЛиста. |
Лист.Name = ИмяЛиста; | Задание рабочему листу имени ИмяЛиста |
Лист.PageSetup.Zoom = Масштаб; | Задание параметра страницы «Масштаб» (от 10 до 400). |
Лист.PageSetup.Orientation = Ориентация; | Ориентация: 1 — книжная, 2 — альбомная. |
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание левой границы (в сантиметрах). |
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание верхней границы (в сантиметрах). |
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание правой границы (в сантиметрах). |
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание нижней границы (в сантиметрах). |
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | Задание ширины колонке. |
Лист.Cells(НомерСтроки,НомерКолонки).ColumnWidth = 0; | Скрыть всю колонку, в которой расположена ячейка |
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | Ввод данных в ячейку. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; | Установка шрифта в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Color = ЦветШрифта; | Установка цвета шрифта в ячейке. Тип переменной ЦветШрифта — число десятичное. |
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Color = ЦветРамки; | Установка цвета рамки в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Interior.Color = ЦветФона; | Установка цвета фона в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; | Установка размера шрифта в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; | 1 — жирный шрифт, 0 — нормальный. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; | 1 — наклонный шрифт, 0 — нормальный. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; | 2 — подчеркнутый, 1 — нет. |
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; | Установка формата данных ячейки. |
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; | Установка рамок ячейки. 1 — тонкая сплошная. |
Лист.Cells(НомерСтроки,НомерКолонки).WrapText = Истина; | Осуществлять перенос по словам в указанной ячейке |
Лист.Protect(); | Установка защиты на лист |
Лист.UnProtect(); | Снятие защиты с листа |
Лист.Cells(Строка, Столбец).Locked=0; | Ячейка будет доступной (и после установки защиты на лист) |
ПолучитьCOMОбъект(<Имя файла>, <Имя класса COM>); | Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу. |
Хитрости Excel
Как выборочно разрешить / запретить редактирование ячеек листа
//Создаем объект EXCEL Эксель = СоздатьОбъект("Excel.Application"); Книга = Эксель.WorkBooks.Open(ФайлВыгрузки); Лист =Книга.Worksheets("Список сотрудников"); // Выбор листа Книга.ActiveSheet.UnProtect(); //делаем шаблон незащищенным // Заполняем лист // ................................... // Снимаем защиту с области ввода сумм Для Перем = 1 По 10 Цикл // Прописываем, какие ячейки будут доступными Книга.ActiveSheet.Cells(Перем, 2).Locked=0; КонецЦикла; Книга.ActiveSheet.Protect(); // ставим защиту на лист
Как запретить появление на экране всяких вопросов от Excel
Excel, чтоб вопрос не задавал:
Excel.DisplayAlerts = False;
Как добавить лист Excel в конец списка листов книги или после конкретного листа (а не в начало книги)
Метод работает для платформ 1С v8.
Файл = Новый COMОбъект("Excel.Application"); Файл.DisplayAlerts = False; Попытка ОбщаяКнига = Файл.WorkBooks.Open(Объект.ПутьКОбщемуФайлу); Исключение Сообщить("Excel: Неудачная попытка открытия файла Excel" + ОписаниеОшибки()); //ЗаписьЖурналаРегистрации("Excel: Неудачная попытка открытия файла Excel", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки()); Возврат; КонецПопытки; КоличествоЛистов = ОбщаяКнига.Sheets.Count; //2 ПоследнийЛист = ОбщаяКнига.Worksheets(КоличествоЛистов); // необходимо получить сам лист (не его номер) Если КоличествоЛистов < 8 Тогда // к примеру, нужно сделать так, чтобы в книге было 8 листов, если листов меньше, то добавляем их Пока 8 - КоличествоЛистов > 0 Цикл ОбщаяКнига.Sheets.Add(Null,ПоследнийЛист,Null,Null); // добавляем лист в конец книги КоличествоЛистов = КоличествоЛистов +1; ПоследнийЛист = ОбщаяКнига.Worksheets(КоличествоЛистов); // получаем ссылку на очередной последний лист книги КонецЦикла; КонецЕсли;
Как программно скрыть колонку файла Excel
// ПРИМЕР как скрыть колонку программно - скроется колонка №2: ЛистОшибок.Cells(ПозицияШапкиФайла, 2).ColumnWidth = 0; // скрыть колонку №2
Как программно назначить ячейке файла Excel перенос по словам
// ПРИМЕР как осуществлять перенос в ячейке по словам программно ячейка в строке ПозицияШапкиФайла, колонке №2: ЛистОшибок.Cells(ПозицияШапкиФайла, 2).WrapText = Истина; // осуществлять перенос в ячейке по словам
Как обработать файл xls, если Excel не установлен на компьютере
Для этого можно использовать метод
СоздатьОбъект("ADODB.Connection");
Код для 7.7, решающий такую задачу, будет выглядеть примерно так:
db = СоздатьОбъект("ADODB.Connection"); ConectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ИмяФайла+";Extended Properties="+"Excel 8.0;"; rs=CreateObject("ADODB.Recordset"); db.Open(ConectionString); rs.ActiveConnection = db; rs.CursorType = 3; rs.LockType = 2; //Чтобы задать Область, надо выделить область в екселе и нажать Вставка-Имя-Присвоить... rs.Source = "Select * from [Лист$1]"; rs.Open(); КоличествоПолей = rs.Fields.Count; Сообщить(КоличествоПолей); КоличествоЗаписей = rs.RecordCount; Сообщить(КоличествоЗаписей); Если rs.Eof()=0 Тогда Сообщить(rs.Fields(0).Value); rs.MoveNext(); Иначе ТЗ.УстановитьЗначение(1,1,rs.Fields(1).Value); КонецЕсли; rs.Close(); db.Close();
Как указать цвет шрифта в ячейке, цвет рамки, цвет фона
Книга.Sheets(1).Cells(1,1).Borders.Color = 25525124; // цвет рамки Книга.Sheets(1).Cells(1,1).Font.Color = 255000000; // цвет шрифта Книга.Sheets(1).Cells(1,1).Interior.Color = 255045; // цвет фона
Организация автоматической обработки файлов xls из выбранной папки
// В v8 код обработки файлов выглядит примерно так: // примеры задания пути к файлам: ПримерПапкиВСети = "Adsf01PublicЗАГРУЗКА ЗАКАЗОВ"; ПримерПапкиЛокал = "C:1сОбмен"; // задаем путь загрузки: ПутьЗагрузки = ПримерПапкиЛокал; // Файлы - Массив из значений типа Файл, содержащий найденные файлы: Файлы = НайтиФайлы(ПутьЗагрузки,"*.xls*"); // организовываем перебор файлов: Для Каждого Файл ИЗ Файлы Цикл // обрабатываем файлы.... // ... // В конце можно удалить бработанный файл: Попытка УдалитьФайлы(Файл.ПолноеИмя); Исключение Сообщить("Не удалось удалить файл " + ОписаниеОшибки()); КонецПопытки; // или в конце можно переместить обработанный файл в специально предназначенную подпапку исходной папки: Попытка ПереместитьФайл(Файл.ПолноеИмя, ПутьЗагрузки+"Arhiv" + Файл.Имя); // папка архива: "C:1сОбменArhiv" Исключение Сообщить("Не удалось переместить файл " + ОписаниеОшибки()); КонецПопытки; КонецЦикла; // в 7.7 для аналогичных действий используются команды: ФС.НайтиПервыйФайл() ФС.НайтиСледующийФайл() ФС.УдалитьФайл() ФС.ПереименоватьФайл(,,);
Создание кнопки в Excel в 7.7
ТекущийЛист.Shapes("CommandButton").Select ТекущийЛист.OLEObjects("CommandButton").Object.Caption = "Кнопуля";
Процедура открывает Эксель, втавляет на первый лист кнопку «Очистить» и назначает ей макрос,
устанавливающий автофильтр на колонку Е по не нулевым значениям. Текст макроса любой,
главное разделять Симв(13) строки
Попытка Ex=CreateObject("Excel.Application"); Исключение Сообщить(ОписаниеОшибки(),"!!!"); Предупреждение("Не удалось запустить MS Excel!"); Возврат; КонецПопытки; Состояние("Открытие файла..."); Попытка Wb=Ex.WorkBooks.Add(); Исключение Возврат; КонецПопытки; Ex.Visible=-1; Wb.Sheets(1).OLEObjects.Add("Forms.CommandButton.1",,,10, 99.75, 120.75, "Очистить");//27.75 st = "Private Sub CommandButton1_Click()" + Chr(13) + " ThisWorkbook.Sheets(1).Columns(""E:E"").AutoFilter Field:=1, Criteria1:="">0"", Operator:=xlAnd" + Chr(13) + "End Sub"; Ex.VBE.ActiveVBProject.VBComponents(Wb.Sheets(1).Name).CodeModule.AddFromString(st)
текст макроса пишется в переменную st
Как подключиться к запущенному Excel-евскому файлу в реальном времени, изменить его и даже не сохранять, а просто переключить окно на 1С и сразу же выгружать данные в табличную часть, лишь переключив окна
Excel = ПолучитьCOMОбъект(, "Excel.Application");
При этом первый параметр нужно оставить пустым. В этом случае при этом подцепится тот файл экселя, который был открыт последним, даже если порядок переключения окон был таким:
Excel1, Excel2, IE, Проводник, 1С (т.е. что-то и было открытым между 1с и экселевским файлом) — все равно откроется Excel2, потому что он был активен последним.
Описание команды ПолучитьCOMОбъект
Глобальный контекст
ПолучитьCOMОбъект (GetCOMObject)
Синтаксис:
ПолучитьCOMОбъект(<Имя файла>, <Имя класса COM>)
Параметры:
<Имя файла> (необязательный)
Тип: Строка. Имя файла, включающее полный путь.
<Имя класса COM> (необязательный)
Тип: Строка. Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:
Тип: COMОбъект.
Описание:
Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода
Таб = ПолучитьCOMОбъект("C:DATADATA.XLS");
создает объект Excel.Application и открывает с его помощью файл документа «C:DATADATA.XLS». Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода
Таб = ПолучитьCOMОбъект("", "Excel.Application");
создает новый документ Excel. В дальнейшем этот документ может быть программно заполнен и сохранен в файл.
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Пример:
// Получение объекта COM, соответствующего файлу Таб = ПолучитьCOMОбъект("C:DATADATA.XLS"); // Создание нового экземпляра объекта Таб = ПолучитьCOMОбъект("", "Excel.Application"); // Получение активного объекта Таб = ПолучитьCOMОбъект( , "Excel.Application");
Ниже приведена сравнительная таблица команд — один и тот же код на 7.7 и v8 с небольшими дополнениями
Отличия:
- команда создания самого объекта в 7.7 и v8 различна;
- в v8 выводится запись в журнал регистрации (просто для примера, например, когда вывод сообщения на экран невозможен из-за выполнения кода в фоновом задании);
- в v8 параллельно создается, заполняется и сохраняется копия исходного файла с комментариями об ошибках
1C 7.7 | 1C v8 |
Доступ из 1С к Excel производится посредством OLE. Создание COM-объекта: | |
Попытка Эксель = СоздатьОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; |
Попытка Эксель = Новый COMОбъект("Excel.Application"); Исключение ЗаписьЖурналаРегистрации("Excel: Неудачная попытка подключения компоненты Excel. | Возможно, программа Excel не установлена на данном компьютере!", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки()); Возврат Ложь; КонецПопытки; |
Теперь, используя переменную «Эксель», можно управлять приложением Excel. * Внимание! Microsoft Excel должен быть установлен на компьютере! Следующая команда откроет книгу: |
|
Книга = Эксель.WorkBooks.Open(ПутьКФайлу); |
Попытка Книга = Эксель.WorkBooks.Open(ИмяФЗагрузки); Исключение ЗаписьЖурналаРегистрации("Excel: Неудачная попытка открытия файла Excel", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки()); Возврат; КонецПопытки; |
Перед тем, как начать считывание данных, укажем лист книги, с которого будем считывать данные: | |
Лист = Книга.WorkSheets(НомерЛиста) |
|
Нумерация листов книги начинается с 1. Общее количество листов можно получить, используя следующую команду: | |
КоличествоЛистов = Книга.Sheets.Count; |
КоличествоЛистов = Книга.Sheets.Count; |
// создание файла для записи проблем | |
КнигаОшибок = Эксель.WorkBooks.Add(); |
КнигаОшибок = Эксель.WorkBooks.Add(); |
// читаем книгу по листам: | |
Для СчетчикПоЛистам = 1 По КоличествоЛистов Цикл //цикл по листам // если листов больше 3, то потребуется добавить лист в книгу Если СчетчикПоЛистам > 3 Тогда ЛистОшибок = КнигаОшибок.Sheets.Add(); Иначе ИмяЛистаОшибок = КнигаОшибок.Sheets(СчетчикПоЛистам).Name; ЛистОшибок = КнигаОшибок.WorkSheets(ИмяЛистаОшибок); КонецЕсли; |
|
//Имя листа в книге можно получить по номеру: | |
ИмяЛиста = Книга.Sheets(НомерЛиста).Name; |
ИмяЛиста = Книга.Sheets(СчетчикПоЛистам).Name; |
//Лист можно выбрать по имени листа в книге: | |
Лист = Книга.WorkSheets(ИмяЛиста); |
Лист = Книга.WorkSheets(ИмяЛиста); |
//Итак, мы открыли книгу и выбрали лист, теперь посмотрим, сколько строк и колонок на выбранном листе: | |
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; |
Попытка ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column; ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row; // используем для перебора строк Исключение ЗаписьЖурналаРегистрации("Excel: Неудачная попытка получения количества колонок и строк Excel", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки()); Возврат; КонецПопытки; |
// получение значения из конкретной ячейки файла экселя: | |
Значение = Лист.Cells(НомерСтроки, НомерКолонки).Value; |
Для счетчикПоКолонкам = 1 По ВсегоКолонок Цикл //цикл по колонкам ЗначениеВЯчейке=Книга.Sheets(СчетчикПоЛистам).Cells(ПозицияШапкиФайла,счетчикПоКолонкам).Value; ... |
// установка нового значения ячейки экселя: | |
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; |
ЛистОшибок.Cells(ПозицияШапкиФайла, счетчикПоКолонкам).Value = ЗначениеВЯчейке; |
// сохранение изменений в новом файле экселя: | |
// если такой файл уже был записан, удалим его, чтобы эксель не спросил интерактивно про перезапись Попытка ИмяФайлаОшибок = ВыбФайл.Путь + ВыбФайл.ИмяБезРасширения + "_bad.xls"; ФайлОш = Новый Файл(ИмяФайлаОшибок); Если ФайлОш.Существует() Тогда УдалитьФайлы(ИмяФайлаОшибок); КонецЕсли; КнигаОшибок.SaveAs(ИмяФайлаОшибок); // файл с ошибочными данными Исключение ДобавитьСообщениеВОшибки("Не удалось записать в файл сообщения об ошибках!"+ ОписаниеОшибки(),,, "Важно"); КонецПопытки; |
|
// После выполнения действий закрываем книгу: | |
Эксель.Quit(); |
Эксель.Quit(); |
Работа с excel из 1С
- Создание объекта приложение Excel
- Программное открытие файла Excel, либо его создание при отсутствии
- Обращение к листу открытого файла Excel
- Обойти все листы и скрыть их по условию
- Добавить лист в самый конец(по умолчанию он добавляется в самое начало)
- Очистить лист
- Получить указанную область листа.
- Скопировать область из одной книги в другу.
- Функция по переводу Адреса стиля ссылок Excel из A1 в R1C1 на языке 1С.
Многие программисты сталкиваются с необходимостью загрузки в 1С из Excel или выгрузки в этот формат. Это связано с тем, что большое количество бухгалтеров, а также менеджеров используют этот формат для хранения и обработки данных.
В этой статье приведу несколько листингов которые облегчат понимание этой связки и помогут в написании своего кода. Последующие листинги опираются на предыдущие, поэтому если в листинге, например, используется переменная «ПриложениеЭксель», но не инициализируется, значит это было в одном из предыдущих листингов.
1. Создание объекта приложение Excel
Попытка
ПриложениеЭксель = Новый COMОбъект("Excel.Application")
Исключение
Предупреждение("ОШИБКА создания приложения Excel, возможно программа не установлена!");
КонецПопытки;
2. Программное открытие файла Excel, либо его создание при отсутсвии
ПутьКФайлу = “C:obmenzagruzka.xls”;
ФайлЭксель = Новый Файл(ПутьКФайлу);
Если ФайлЭксель.Существует() Тогда
Результат = ПриложениеЭксель.WorkBooks.Open(ПутьКФайлу);
Иначе
РабочаяКнига=ПриложениеЭксель.Workbooks.Add();
РабочаяКнига=ПриложениеЭксель.ActiveWorkbook;
ПриложениеЭксель.ActiveWorkbook.SaveAs(ПутьКФайлу,-4143);
Результат = ПриложениеЭксель.WorkBooks.Open(ПутьКФайлу);
КонецЕсли;
3. Обращение к листу открытого файла Excel
ЛистЭксель = ПриложениеЭксель.WorkBooks.Open(ПутьКФайлу).WorkSheets.Item(ИмяЛиста);
4. Обойти все листы и скрыть их по условию
КоличествоЛистов = ПриложениеЭксель.ActiveWorkbook.Worksheets.Count;
КоллекцияЛистов = ПриложениеЭксель.ActiveWorkbook.Worksheets;Для ТекНомерЛиста = 1 По КоличествоЛистов Цикл
ТекЛист = КоллекцияЛистов(ТекНомерЛиста);
Если ТекЛист.Name = «Лист1» Тогда
ТекЛист.Visible = False;
КонецЕсли;
КонецЦикла;
5. Добавить лист в самый конец(по умолчанию он добавляется в самое начало)
НомерПоследнегоЛиста = ФайлЭксель.WorkSheets.Count;
ДобавленныйЛист = ФайлЭксель.WorkSheets.Add(,ФайлЭксель.WorkSheets(НомерПоследнегоЛиста));
ДобавленныйЛист.Name = ИмяЛиста;
6. Очистить лист
ДобавленныйЛист.Cells.Clear();
7. Получить указанную область листа. Здесь используются переменные НомСтрВерх, НомСтрНиз, НомКолВерх, НомКолНиз – они обозначают координаты самой левой верхней ячейки и самой правой нижней ячейки областей
ОбластьОграниченнаяСтроками = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Rows(""+НомСтрВерх+":"+НомСтрНиз);ЯчейкаВерхняяЛевая = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Cells(НомСтрВерх, НомКолВерх);
ЯчейкаНижняяПравая = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Cells(НомСтрНиз, НомКолНиз);
ОбластьОграниченнаяЯчейками = ЭксельФайл.WorkSheets.Item(ИмяЛиста).Range(ЯчейкаВерхняяПравая,ЯчейкаНижняяЛевая);
8. Скопировать область из одной книги в другу. О константах Excel(используемых числах) читайте в разделе «В заключении» данной статьи.
НоваяКнига = ПриложениеЭксель.WorkBooks.Open(ПутьКНовомуФайлу);
ЛистПриемник = НоваяКнига.WorkSheets.Item(ИмяЛистаПриемника);
ОбластьОграниченнаяЯчейками.Copy(); //записали в буфер
ЛистПриемник.Range(ЛистПриемник.Cells(ТекСтрока, ТекСтолбец), ЛистПриемник.Cells(ТекСтрока+КоличСтрок-1, ТекСтолбец+КоличСтолбцов-1)).PasteSpecial();
ЛистПриемник.Range(ЛистПриемник.Cells(ТекСтрока, ТекСтолбец), ЛистПриемник.Cells(ТекСтрока+КоличСтрок-1, ТекСтолбец+КоличСтолбцов-1)).PasteSpecial(8);// цифра 8 означает сохранить ширину столбцов как в источнике.
9. Функция по переводу Адреса стиля ссылок Excel из A1 в R1C1 на языке 1С.
Чтобы конвертировать стиль ссылок Excel с буквенными колонками в числовые можно из кода ниже сделать функцию с параметром АдресA1
ДлинаАдресаА1 = СтрДлина(АдресА1);
Для с=1 По ДлинаАдресаА1 Цикл
ТекСимвол = Сред(АдресА1,с,1);
Если Найти("0123456789", ТекСимвол) > 0 Тогда //начался номер строки
БуквИндексКолонки = Лев(АдресА1, с-1);
ДлинаИндекса = СтрДлина(БуквИндексКолонки);
НомерКолонкиЧислом = 0;
Для с = 1 По ДлинаИндекса Цикл
ТекСимв = Сред(БуквИндексКолонки, с, 1);
ИндексБуквы = Найти(ВРег("abcdefghijklmnopqrstuvwxyz"), ВРег(ТекСимв));
НомерКолонкиЧислом = НомерКолонкиЧислом * 26 + ИндексБуквы;
КонецЦикла;
НомерСтроки = Прав(АдресА1, ДлинаАдресаА1 - с + 1);
НомерСтрокиЧислом = Число(НомерСтроки);
Прервать;
КонецЕсли;
КонецЦикла;
АдресR1C1 = "R" + НомерСтрокиЧислом + "C" + НомерКолонкиЧислом;
В заключении
В некоторых примерах параметрами в методы Excel передаются числа. Это происходит из-за того, что 1С не знает о константах Excel, например «xlCellTypeLastCell». Но к счастью эти константы имеют числовые значения. Чтобы узнать их откройте справку excel. Если справка не установлена, то можно посмотреть значение в режиме отладки Excel.
Недостаточно прав для комментирования
Для работы с Excel файлами в системе 1C существуют определенные технологии. Организовать взаимодействие системы 1C с внешней программой MS Excel можно через COM-объект «Excel.Application». Также есть возможность наладить взаимодействие с Excel из 1C используя технологию ADO.
Данный пример демонстрирует работу с использованием «Excel.Application». Для работоспособности данного примера на компьютере обязательно должно быть установлено программное обеспечение MS Excel.
Прочитать из существующего Excel Файла
Процедура ПрочитатьСуществующийExcelФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; Книга
= Excel.Workbooks.Open(ПутьКФайлу);
КоличествоЛистов = Книга.Sheets.Count;//Перебор листов
Для НомерЛиста = 1 По КоличествоЛистов Цикл Лист
= Книга.Sheets(НомерЛиста);
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
КоличествоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;//Перебор строк
Для НомерСтроки = 1 По КоличествоСтрок Цикл//Перебор колонок
Для НомерКолонки = 1 По КоличествоКолонок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
//Выполнение действий с полученным значением
//...
//...
КонецЦикла;КонецЦикла;КонецЦикла; Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Записать в существующий Excel Файл
Процедура ЗаписатьСуществующийExcellФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; Книга
= Excel.Workbooks.Open(ПутьКФайлу); Лист
= Книга.Sheets(1);
//Установить значение в ячейку
Лист.Cells(1, 1).Value = "Тестовое значение";
Книга.Save(); Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Создать новый Excel Файл
Процедура СоздатьНовыйExcellФайл(ПутьКФайлу)Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = 0;
Excel.Visible = 0;
Исключение
Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена");
Возврат;
КонецПопытки; //Автоматически будут созданы три листа
Книга = Excel.WorkBooks.Add();
//Получить первый лист
Лист = Книга.Sheets(1);
//Установить значение в ячейку
Лист.Cells(1, 1).Value = "Тестовое значение";Попытка
Книга.SaveAs(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки() + " не удалось сохранить файл");
КонецПопытки; Excel
.Workbooks.Close();
Excel.Application.Quit();КонецПроцедуры
Как выборочно разрешить / запретить редактирование ячеек листа
Как выборочно разрешить / запретить редактирование ячеек листа
//Создаем объект EXCEL Эксель = СоздатьОбъект(«Excel.Application»); Книга = Эксель.WorkBooks.Open(ФайлВыгрузки);// Выбор листа Лист =Книга.Worksheets(«Список сотрудников»); //делаем шаблон незащищенным Книга.ActiveSheet.UnProtect(); // Заполняем лист// …………………………….. // Снимаем защиту с области ввода сумм Для Перем = 1 По 10 Цикл // Прописываем, какие ячейки будут доступными Книга.ActiveSheet.Cells(Перем, 2).Locked=0; КонецЦикла; // ставим защиту на лист Книга.ActiveSheet.Protect();
Как запретить появление на экране всяких вопросов от Excel
Как запретить появление на экране всяких вопросов от Excel
// чтоб Excel не задавал вопросы: Excel.DisplayAlerts = False;
Как программно скрыть колонку файла Excel
Как программно скрыть колонку файла Excel
// ПРИМЕР как скрыть колонку программно — скроется колонка №2: ЛистОшибок.Cells(ПозицияШапкиФайла, 2).ColumnWidth = 0; // скрыть колонку №2
Как программно назначить ячейке файла Excel перенос по словам
// ПРИМЕР как осуществлять перенос в ячейке по словам программно ячейка в строке ПозицияШапкиФайла, колонке №2: ЛистОшибок.Cells(ПозицияШапкиФайла, 2).WrapText = Истина; // осуществлять перенос в ячейке по словам
Как обработать файл xls, если Excel не установлен на компьютере
Как обработать файл xls, если Excel не установлен на компьютере
Для этого можно использовать метод
СоздатьОбъект(«ADODB.Connection»);
Код для 7.7, решающий такую задачу, будет выглядеть примерно так:
db = СоздатьОбъект(«ADODB.Connection»); ConectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+ИмяФайла+»;Extended Properties=»+»Excel 8.0;»; rs=CreateObject(«ADODB.Recordset»); db.Open(ConectionString); rs.ActiveConnection = db; rs.CursorType = 3; rs.LockType = 2; //Чтобы задать Область, надо выделить область в екселе и нажать Вставка-Имя-Присвоить… rs.Source = «Select * from [Лист$1]»; rs.Open(); КоличествоПолей = rs.Fields.Count; Сообщить(КоличествоПолей); КоличествоЗаписей = rs.RecordCount; Сообщить(КоличествоЗаписей); Если rs.Eof()=0 Тогда Сообщить(rs.Fields(0).Value); rs.MoveNext(); Иначе ТЗ.УстановитьЗначение(1,1,rs.Fields(1).Value); КонецЕсли; rs.Close(); db.Close();
Как указать цвет шрифта в ячейке, цвет рамки, цвет фона
Как указать цвет шрифта в ячейке, цвет рамки, цвет фона
Книга.Sheets(1).Cells(1,1).Borders.Color = 25525124; // цвет рамки Книга.Sheets(1).Cells(1,1).Font.Color = 255000000; // цвет шрифта Книга.Sheets(1).Cells(1,1).Interior.Color = 255045; // цвет фона
Организация автоматической обработки файлов xls из выбранной папки
Организация автоматической обработки файлов xls из выбранной папки
В 8.1 код обработки файлов выглядит примерно так:
В 8.1 код обработки файлов выглядит примерно так:
// примеры задания пути к файлам:ПримерПапкиВСети = «\Adsf01PublicЗАГРУЗКА ЗАКАЗОВ»;ПримерПапкиЛокал = «C:1сОбмен»;// задаем путь загрузки:ПутьЗагрузки = ПримерПапкиЛокал;// Файлы — Массив из значений типа Файл, содержащий найденные файлы:Файлы = НайтиФайлы(ПутьЗагрузки,»*.xls*»);// организовываем перебор файлов:Для Каждого Файл ИЗ Файлы Цикл // обрабатываем файлы…. // … // В конце можно удалить бработанный файл: Попытка УдалитьФайлы(Файл.ПолноеИмя); Исключение Сообщить(«Не удалось удалить файл » + ОписаниеОшибки()); КонецПопытки; // или в конце можно переместить обработанный файл в специально предназначенную подпапку исходной папки: Попытка ПереместитьФайл(Файл.ПолноеИмя, ПутьЗагрузки+»Arhiv» + Файл.Имя); // папка архива: «C:1сОбменArhiv» Исключение Сообщить(«Не удалось переместить файл » + ОписаниеОшибки()); КонецПопытки;КонецЦикла;
В 7.7 для аналогичных действий используются команды:
ФС.НайтиПервыйФайл()ФС.НайтиСледующийФайл()ФС.УдалитьФайл()ФС.ПереименоватьФайл(,,);
Создание кнопки в Excel в 7.7
Создание кнопки в Excel в 7.7
ТекущийЛист.Shapes(«CommandButton»).Select ТекущийЛист.OLEObjects(«CommandButton»).Object.Caption = «Кнопуля»;
Процедура открывает Эксель, втавляет на первый лист кнопку «Очистить» и назначает ей макрос,
устанавливающий автофильтр на колонку Е по не нулевым значениям. Текст макроса любой,
главное разделять Симв(13) строки
Попытка Ex=CreateObject(«Excel.Application»); Исключение Сообщить(ОписаниеОшибки(),»!!!»); Предупреждение(«Не удалось запустить MS Excel!»); Возврат; КонецПопытки; Состояние(«Открытие файла…»); Попытка Wb=Ex.WorkBooks.Add(); Исключение Возврат; КонецПопытки; Ex.Visible=-1; Wb.Sheets(1).OLEObjects.Add(«Forms.CommandButton.1»,,,10, 99.75, 120.75, «Очистить»);//27.75 st = «Private Sub CommandButton1_Click()» + Chr(13) + » ThisWorkbook.Sheets(1).Columns(«»E:E»»).AutoFilter Field:=1, Criteria1:=»»>0″», Operator:=xlAnd» + Chr(13) + «End Sub»; Ex.VBE.ActiveVBProject.VBComponents(Wb.Sheets(1).Name).CodeModule.AddFromString(st)
текст макроса пишется в переменную st
Как подключиться к запущенному Excel-евскому файлу в реальном времени, изменить его и даже не сохранять, а просто переключить окно на 1С и сразу же выгружать данные в табличную часть, лишь переключив окна
Как подключиться к запущенному Excel-евскому файлу в реальном времени, изменить его и даже не сохранять, а просто переключить окно на 1С и сразу же выгружать данные в табличную часть, лишь переключив окна
Excel = ПолучитьCOMОбъект(, «Excel.Application»);
При этом первый параметр нужно оставить пустым. В этом случае при этом подцепится тот файл экселя, который был открыт последним, даже если порядок переключения окон был таким:
Excel1, Excel2, IE, Проводник, 1С (т.е. что-то и было открытым между 1с и экселевским файлом) — все равно откроется Excel2, потому что он был активен последним.
Описание команды ПолучитьCOMОбъект
Описание команды ПолучитьCOMОбъект
Глобальный контекст
ПолучитьCOMОбъект (GetCOMObject)
Синтаксис:
ПолучитьCOMОбъект(<Имя файла>, <Имя класса COM>)
Параметры:
<Имя файла> (необязательный)
Тип: Строка. Имя файла, включающее полный путь.
<Имя класса COM> (необязательный)
Тип: Строка. Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:
Тип: COMОбъект.
Описание:
Основное применение функции ПолучитьCOMОбъект — это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода
Таб = ПолучитьCOMОбъект(«C:DATADATA.XLS»);
создает объект Excel.Application и открывает с его помощью файл документа «C:DATADATA.XLS». Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода
Таб = ПолучитьCOMОбъект(«», «Excel.Application»);
создает новый документ Excel. В дальнейшем этот документ может быть программно заполнен и сохранен в файл.
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора
П = ПолучитьCOMОбъект( , «Excel.Application»);
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Пример:
// Получение объекта COM, соответствующего файлу Таб = ПолучитьCOMОбъект(«C:DATADATA.XLS»); // Создание нового экземпляра объекта Таб = ПолучитьCOMОбъект(«», «Excel.Application»); // Получение активного объекта Таб = ПолучитьCOMОбъект( , «Excel.Application»);
Ниже приведена сравнительная таблица команд — один и тот же код на 7.7 и 8.1 с небольшими дополнениями
Ниже приведена сравнительная таблица команд — один и тот же код на 7.7 и 8.1 с небольшими дополнениями
Отличия:
-
-
команда создания самого объекта в 7.7 и 8.1 различна;
-
в 8.1 выводится запись в журнал регистрации (просто для примера, например, когда вывод сообщения на экран невозможен из-за выполнения кода в фоновом задании);
-
в 8.1 параллельно создается, заполняется и сохраняется копия исходного файла с комментариями об ошибках
-
Excel — это сторонняя программа, ее можно запускать из 1С в невидимом и видимом режиме и пользоваться всеми возможностями. Excel должен быть установлен на компьютере. Для примера приведено чтение таблицы в из файла Excel на клиенте, передача на сервер и создание на сервере таблицы значений с данными из файла. Такую задачку любят давать на собеседованиях на должность программиста 1С.
&НаКлиенте
Процедура НажатиеКноки()
// обращаемся к Excel
Попытка
Эксель = новый COMОбъект(«Excel.Application»);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ПутьКФайлу = «C:Некоторый файл.xlsx»;
// открываем ексель файл
Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
// переходим на первую страницу
Лист = Книга.WorkSheets(1);
// для количества колонок и строк в экселе есть специальные ячейки
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
// сохраняем файл в массив строк, где строка это так же массив (на клиенте
// нельзя создавать таблицу значений
НаборСтрокФайла = новый массив;
для Строка = 1 по ВсегоСтрок цикл
МассивСтрока = новый массив;
для Колонка = 1 по ВсегоКолонок цикл
// получаем значение из ячейки excel
Значение = СокрЛП(Лист.Cells(Строка,Колонка).Value);
МассивСтрока.Добавить(Значение);
КонецЦикла;
НаборСтрокФайла.Добавить(МассивСтрока);
КонецЦикла;
// запишем файл с другим именем
Эксель.SaveAs(«C:ФайлСДругимИменем.xlsx»);
// закрываем ексель, иначе он останется висеть в памяти
Эксель.Application.Quit();
КонецПроцедуры
&НаСервере
Процедура СоздатьИОбработатьТаблицуЗначений(НаборСтрокФайла, ВсегоКолонок)
ТЗ = новый ТаблицаЗначений;
// создаем колонки таблицы значений (столько сколько в файле ексель)
для й=1 по ВсегоКолонок цикл
ТЗ.Колонки.Добавить(«кол» + Формат(й,«ЧЦ=4; ЧГ=»));
КонецЦикла;
// переносим строки из массива в таблицу значений
для каждого МассивСтрока из НаборСтрокФайлацикл
НовСтрока = ТЗ.Добавить();
для Колонка = 1 по ВсегоКолонок цикл
// переносим значение из массива в таблицу
НовСтрока[Колонка — 1] = МассивСтрока[Колонка — 1];
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Далее приводятся наиболее частые ситуации, возникающие на
Поиск и замена текста в ячейках файла Excel
//Выбираем область поиска — весь лист
ОбластьПоиска = Лист.Cells;
// Начинаем поиск с левого верхнего угла
НачалоЛиста =Лист.Cells(1, 1);
// Ищем ячейку с текстом «привет»
ОбластьПараметр = ОбластьПоиска.Find(«привет», НачалоЛиста);
// Если нашли вывсодим найденую строку
Если ОбластьПараметр <> неопределено Тогда
Сообщить(ОбластьПараметр.Value);
КонецЕсли;
Работа со строками в Excel
//Выбираем первую строку
НачальнаяСтрока = Лист.Cells(1, 1);
// Выделяем всю строку
НачальнаяСтрока .EntireRow.Select();
// Копируем выделенное
НачальнаяСтрока .EntireRow.Copy();
// Вставляем (новая строка будет вставлена тут же)
НачальнаяСтрока .EntireRow.Insert();
// Удалим строку
НачальнаяСтрока .EntireRow.Delete();
Прочие полезные методы Excel
Эксель.Visible = Видимость; | 0 — Excel не виден, 1 — виден. |
Книга = Эксель.WorkBooks.Add(); | Создание новой книги (файла) Excel. |
Книга.SaveAs(ИмяФайла); | Сохранение книги Excel. |
Лист = Книга.WorkSheets.Add(); | Добавление нового листа в книгу. |
Книга = Эксель.WorkBooks.Open(ИмяФайла); | Открытие существующей книги (файла) Excel. |
Лист = Книга.WorkSheets(НомерЛиста); | Установка листа в качестве рабочего с номером НомерЛиста. |
Лист.Name = ИмяЛиста; | Задание рабочему листу имени ИмяЛиста |
Лист.PageSetup.Zoom = Масштаб; | Задание параметра страницы «Масштаб» (от 10 до 400). |
Лист.PageSetup.Orientation = Ориентация; | Ориентация: 1 — книжная, 2 — альбомная. |
Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание левой границы (в сантиметрах). |
Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание верхней границы (в сантиметрах). |
Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание правой границы (в сантиметрах). |
Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры); | Задание нижней границы (в сантиметрах). |
Лист.Columns(НомерКолонки).ColumnWidth = Ширина; | Задание ширины колонке. |
Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение; | Ввод данных в ячейку. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Name = ИмяШрифта; | Установка шрифта в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Size = РазмерШрифта; | Установка размера шрифта в ячейке. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Bold = Жирный; | 1 — жирный шрифт, 0 — нормальный. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Italic = Курсив; | 1 — наклонный шрифт, 0 — нормальный. |
Лист.Cells(НомерСтроки,НомерКолонки).Font.Underline = Подчеркнутый; | 2 — подчеркнутый, 1 — нет. |
Лист.Cells(НомерСтроки, НомерКолонки).NumberFormat = Формат; | Установка формата данных ячейки. |
Лист.Cells(НомерСтроки,НомерКолонки).Borders.Linestyle = ТипЛинии; | Установка рамок ячейки. 1 — тонкая сплошная. |
Лист.Protect(); | Установка защиты на лист |
Лист.UnProtect(); | Снятие защиты с листа |
Лист.Cells(Строка, Столбец).Locked=0; | Ячейка будет доступной (и после установки защиты на лист) |
Эксель.DisplayAlerts = False; | Убрать все сообщение при открытии файла. Сообщения останавливают выполнения кода до реакции пользователя |