![]() |
![]() |
![]() |
|
Как из 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).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |