Имя: Пароль:
1C
 
Как из 1С работать с шаблоном Excel
0 Триша
 
13.11.08
15:16
Нужно создать файл .xlsx на основе шаблона и заполнить его данными из 1С.
Пишу:
Док = ПолучитьCOMОбъект("D:\Шаблон1.xltx", "Excel.Application");
...
Если этот шаблон уже открыт, то все нормально работает, ячейки заполняются. Если этот шаблон не открыт, то возникает ошибка:
Ошибка при вызове метода контекста(ПолучитьСОМОбъект): Ошибка получения объекта СОМ: Интерфейс не поддерживается

Но мне надо, чтобы открывался не сам шаблон, а книга .xlsx по шаблону.

Как это сделать?
1 Триша
 
13.11.08
16:21
3 Триша
 
13.11.08
16:33
(2) Что я должна была найти по ссылке?
Как сохранить как ексель шаблон из 1С?
4 Aprobator
 
13.11.08
17:03
Попробуй так:
Excel = Новый COMОбъект("Excel.Application");
Док = Excel.WorkBooks.Add("D:\Шаблон1.xltx");
5 vde69
 
13.11.08
17:08
(4) типа так, только потом лист придеться искать в книге
(3) по ссылке например как закрыть потом ексель, или как получить цвет ячейки и т.д. Только все равно надо сначало файл сохранить (или создать как в 3)
6 Aprobator
 
13.11.08
17:19
(5) дык разве количество листов не определяется шаблоном? И если шаблон известен, то в чем сложность?
7 vde69
 
13.11.08
17:26
(6)у тебя уже есть 3 листа и ты еще добавляешь, если-бы ты создавал книгу - это другое
8 vde69
 
13.11.08
17:27
(6) кроме того нумерация листов (если с ними мухлевать) очень интересная, первого листа вообще может не быть
9 Aprobator
 
13.11.08
17:50
(7) хм - а откуда левые листы в новой книге?
10 Aprobator
 
13.11.08
17:51
здесь и есть новая книга.
11 vde69
 
13.11.08
17:55
(9) наверно я и не прав :) уже вечер
12 Torquader Darigha
 
13.11.08
18:21
Количество листов в новой книге задаётся в настройке Excel в параметрах.
Шаблон - это документ Excel, который просто не даёт сохранить себя, а подставляет имя "Новая книга", чтобы пользователь его сохранил.
в (4) Excel.Workbooks.Open(ИМяШаблона) мы же открываем книгу.
13 Aprobator
 
13.11.08
18:23
(12) Не открываем, а создаем на основании шаблона. ADD  а не OPEN.
14 Torquader Darigha
 
13.11.08
18:37
(13) посмотрел описание - действительно шаблон можно указывать в Workbooks.Add
Но в этом случае не сработает сценарий при открытии, а удобнее всего формировать Excel автоматическим запуском сценария (по крайней мере я так делал).

Ладно. Топикстартер, видимо, уже всё сделал, так что базар пустой.
15 wPa
 
13.11.08
18:44
А открыть шаблон и сохранить как...? неа? ну не знаю...

НовыйФайл.SaveAs(СокрЛП(ПолноеИмяФайла));
       НовыйФайл.Worksheets(1).Name = Организация.Наименование;
       ExcelApp.DisplayAlerts = False;
       ВсегоСтраниц = НовыйФайл.Worksheets().Count;
       Сч = 0;
       Пока  Сч < ВсегоСтраниц - 1 Цикл
               ЛистУдаления = НовыйФайл.Worksheets(ВсегоСтраниц - Сч);
               ЛистУдаления.Activate();
               ЛистУдаления.Delete();
               Сч = Сч + 1;
       КонецЦикла;
16 vde69
 
13.11.08
20:14
блин в (2) я лоханулся со ссылкой
http://infostart.ru/blogs/718/
17 Torquader Darigha
 
13.11.08
21:04
(16) молодец - отправил человека куда надо! ^_^
18 Триша
 
14.11.08
08:24
Доброго времени суток, господа! Это опять я.
Ситуация поменялась, теперь необходимо работать с документом Word. Дайте ссылку или пример, как в существующем документе Word в определенные ячейки таблицы записать новые данные из 1С.
19 Aprobator
 
14.11.08
10:38
(18) ну и ленивы вы сударыня! Хелп к ворду по вижал бейссику не почитать?
Ловите пример обработки: которая с таблиц ворда счиатывает инфу и на ее основании создает яизлиц и сотрудников в ЗУПе.

Перем мДокум;
Перем мВсегоПредложений;
Перем мПробел;
Перем мПервыйКурс;
Перем мНаборФИО;// для родителя первого курса
Перем мДатаНоль;
Перем мСписокФИО;

Функция ПолучитьНомерГруппы(ПерваяПозицияТаблицы, СтартПоиска)
   Для НомерПредложения = СтартПоиска По мВсегоПредложений Цикл
       ОчередноеПредложение = мДокум.Sentences(НомерПредложения);
       Если ОчередноеПредложение.End = ПерваяПозицияТаблицы Тогда
           СтартПоиска  = НомерПредложения;
           НаименовТабл = СокрЛП(ОчередноеПредложение.Text);
           НомерПробела = Найти(НаименовТабл, мПробел);
           НомерГруппы  = Лев(НаименовТабл, НомерПробела - 1);
           Возврат НомерГруппы;
       КонецЕсли;    
   КонецЦикла;    
   Возврат "Группа не найдена!";
КонецФункции

Функция СчитатьТекстИзЯчейки(Ячейка)
   ТекстЯчейки = Ячейка.Text;
   Возврат СокрЛП(Лев(ТекстЯчейки, СтрДлина(ТекстЯчейки) -1));
КонецФункции    

Функция СоздатьФизЛицо(ФИО)
   НайденноеФизЛицо = Справочники.ФизическиеЛица.НайтиПоНаименованию(ФИО);
   Если ЗначениеЗаполнено(НайденноеФизЛицо) Тогда
       Возврат НайденноеФизЛицо;
   КонецЕсли;
   
   НовоеФизЛицо     = Справочники.ФизическиеЛица.СоздатьЭлемент();
   
   НовоеФизЛицо.Наименование = ФИО;
   НовоеФизЛицо.УстановитьНовыйКод();
   НовоеФизЛицо.Записать();
   
   ФамИмОтч     = ФИО;
   НомерПробела = Найти(ФамИмОтч, мПробел);
   мСписокФИО.Очистить();
   Пока НЕ НомерПробела = 0 Цикл
       СтрокаФИО    = Сред(ФамИмОтч, 1, НомерПробела - 1);
       мСписокФИО.Добавить(СтрокаФИО);
       
       ФамИмОтч = Сред(ФамИмОтч, НомерПробела + 1);
       НомерПробела = Найти(ФамИмОтч, мПробел);
   КонецЦикла;    
   
   мСписокФИО.Добавить(ФамИмОтч);
   
   Фамилия  = мСписокФИО[0].Значение;
   Имя      = мСписокФИО[1].Значение;
   Отчество = мСписокФИО[2].Значение;
   
   ВсегоСтрок = мСписокФИО.Количество();
   Если ВсегоСтрок > 3 Тогда
       Для НомерЭлемента = 3 По ВсегоСтрок - 1 Цикл
           Отчество = Отчество + мПробел + мСписокФИО[НомерЭлемента].Значение;
       КонецЦикла;
       Отчество = СокрП(Отчество);
   КонецЕсли;
   
   НоваяЗаписьФИО = мНаборФИО.Добавить();
   
   НоваяЗаписьФИО.Период   = мДатаНоль;
   НоваяЗаписьФИО.ФизЛицо  = НовоеФизЛицо.Ссылка;
   НоваяЗаписьФИО.Фамилия  = Фамилия;
   НоваяЗаписьФИО.Имя      = Имя;
   НоваяЗаписьФИО.Отчество = Отчество;
   
   Возврат НовоеФизЛицо.Ссылка;
КонецФункции

Функция СоздатьСтудента(ФизЛицо, Группа, ТабНомер);
   НайденныйСтудент = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(ФизЛицо.Наименование, Истина,Группа);
   Если ЗначениеЗаполнено(НайденныйСтудент) Тогда
       Возврат Истина;
   КонецЕсли;
   НовыйСтудент = Справочники.СотрудникиОрганизаций.СоздатьЭлемент();
   
   НовыйСтудент.Физлицо      = ФизЛицо;
   НовыйСтудент.Код          = ТабНомер;
   НовыйСтудент.Наименование = ФизЛицо.Наименование;
   НовыйСтудент.Организация  = Организация;
   НовыйСтудент.Родитель     = Группа;
   НовыйСтудент.Записать();
   
   Возврат Истина;
КонецФункции    

Функция ПолучитьГруппуСтудента(НаименованиеГруппы)
   НайденнаяГруппа = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(НаименованиеГруппы,,мПервыйКурс);
   Если ЗначениеЗаполнено(НайденнаяГруппа) Тогда
       Возврат НайденнаяГруппа
   КонецЕсли;    
   ГруппаСтудента              = Справочники.СотрудникиОрганизаций.СоздатьГруппу();
   ГруппаСтудента.Наименование = НаименованиеГруппы;
   ГруппаСтудента.Родитель     = мПервыйКурс;
   ГруппаСтудента.Записать();
   
   Возврат ГруппаСтудента.Ссылка;
КонецФункции    

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Попытка
       Word = Новый COMОбъект("Word.Application");
   Исключение
       Сообщить("Не удалось запустить Word");
   КонецПопытки;
   мДокум           = Word.Documents.Open(ДокументWord, , -1,,,,,,,,, 0,,,,);
   ТаблицыДокумента = мДокум.Tables;
   ВсегоТаблиц      = мДокум.Tables.Count;
   
   СтартовоеПредложениеПоиска = 1;
   мВсегоПредложений          = мДокум.Sentences.Count;
   
   ЗаведеноФизЛиц = 0;
   
   спсГрупп = Новый СписокЗначений;
   // цикл по таблицам документа
   
   Для НомерДокумента = 1 По ВсегоТаблиц Цикл
       ТаблицаДокумента = мДокум.Tables(НомерДокумента);
       НомерГруппы    = ПолучитьНомерГруппы(ТаблицаДокумента.Range.Start, СтартовоеПредложениеПоиска);
       Староста       = СчитатьТекстИзЯчейки(ТаблицаДокумента.Cell(1,2).Range);
       ТабельныйНомер = СчитатьТекстИзЯчейки(ТаблицаДокумента.Cell(1,3).Range);
       ТабельныйНомер = СтрЗаменить(ТабельныйНомер, "староста", "");
       ТабельныйНомер = "ст " + СокрЛП(СтрЗаменить(ТабельныйНомер, "-", ""));
       
       НаименованиеГруппы = НомерГруппы + " " +Староста;
       Группа             = ПолучитьГруппуСтудента(НаименованиеГруппы);
       
       Состояние(НаименованиеГруппы);
       
       ВсегоСтрокВТаблице = ТаблицаДокумента.Rows.Count;
       // добавим первым старосту
       ФизЛицо        = СоздатьФизЛицо(Староста);
       СоздатьСтудента(ФизЛицо, Группа, ТабельныйНомер);
       
       Для НомерСтроки = 2 По ВсегоСтрокВТаблице Цикл
           ФИО           = СчитатьТекстИзЯчейки(ТаблицаДокумента.Cell(НомерСтроки,2).Range);
           ТабельныйНомер = СчитатьТекстИзЯчейки(ТаблицаДокумента.Cell(НомерСтроки,3).Range);
           
           ФизЛицо       = СоздатьФизЛицо(ФИО);
           СоздатьСтудента(ФизЛицо, Группа, ТабельныйНомер);
           Если мНаборФИО.Количество() > 150 Тогда
               мНаборФИО.Записать(Ложь);
               мНаборФИО.Очистить();
           КонецЕсли;
       КонецЦикла;    
   КонецЦикла;    
   
   мДокум.Close();
   Word.Quit();
   
   
   Если НЕ мНаборФИО.Количество() = 0 Тогда
       мНаборФИО.Записать(Ложь);
   КонецЕсли;    
   
   Предупреждение("Переброс завершен");
КонецПроцедуры

Процедура ДокументWordНачалоВыбора(Элемент, СтандартнаяОбработка)
   СтандартнаяОбработка = Ложь;
   
   ВыборФайла                    = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ВыборФайла.МножественныйВыбор = Ложь;
   Если ВыборФайла.Выбрать() Тогда
       ДокументWord = ВыборФайла.ПолноеИмяФайла;
   КонецЕсли;    
КонецПроцедуры

мПробел = " ";
НаименованиеПервогоКурса = "01 КУРС";
мПервыйКурс              = Справочники.СотрудникиОрганизаций.НайтиПоНаименованию(НаименованиеПервогоКурса);
Если НЕ ЗначениеЗаполнено(мПервыйКурс) Тогда
   ПервыйКурс =  Справочники.СотрудникиОрганизаций.СоздатьГруппу();
   ПервыйКурс.Наименование = НаименованиеПервогоКурса;
   ПервыйКурс.Записать();
   мПервыйКурс = ПервыйКурс.Ссылка;
КонецЕсли;    

мНаборФИО  = РегистрыСведений.ФИОФизЛиц.СоздатьНаборЗаписей();
мДатаНоль  = Дата(1900,1,1,0,0,0);
мСписокФИО = Новый СписокЗначений;
20 borik
 
14.11.08
11:17
21 Триша
 
14.11.08
11:39
(19) Я не ленивая, я уже решила проблему без вашей помощи.
Просто бухи сами не знают чего хотят. В документе Word нарисовали какие-то кривые таблицы. При этом в одной ячейке содержится текст с разным форматированием. Так вот нужно им заменять не весь текст в ячейке, а часть, и у этой части должен быть другой формат. Например ячейка содержит:
Фин. Позиция   Заработная плата АУП (оклад)
Вот "Фин. Позиция" Times New Roman,8. А "Заработная плата АУП (оклад)" Tahoma, 10. Нужно заменять "Заработная плата АУП (оклад)" на другие слова.
22 wPa
 
14.11.08
11:55
(21) Ты здорова?

"Но мне надо, чтобы открывался не сам шаблон, а книга .xlsx по шаблону.
Как это сделать?"

" В документе Word нарисовали какие-то кривые таблицы"
23 Триша
 
14.11.08
12:02
(22) Читать надо все посты, а не только последний. Нечего обзываться. Смотри (18).
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший