![]() |
![]() |
|
Работа с шаблоном Excel | ☑ | ||
---|---|---|---|---|
0
kirill_sid
07.06.07
✎
08:22
|
Доброго всем времени суток!
Поставлена следующая задача - формировать отчеты по выполненным ремонтам в Excel (это для брендов, у каждого своя форма отчета). Вопрос в следующем - можно ли использовать шаблон Excel как макет табличного документа в 1С, то есть задать области: Шапка, Строка, Подвал; проставить там параметры, а потом получать области и выводить их в документ, после заполнения всех параметров? |
|||
1
kirill_sid
07.06.07
✎
08:27
|
P.S. За конкретные примеры буду очень благодарен. Ну, или хотя бы киньте в меня ссылку какую-нибудь...
|
|||
2
dk
07.06.07
✎
08:30
|
А в чем проблема с переносом шаблона Excel в макет 8-ки?
Формируешь в 8-ке, а сохраняешь в формате Excel. Или шаблоны часто правятся? |
|||
3
kirill_sid
07.06.07
✎
08:39
|
Шаблоны правятся не так часто, конечно... Раз в пол-года примерно. Просто хотелось бы сделать некую универсальную штуку, чтобы не править каждый раз макет...
Например - присылает бренд новый шаблон отчета, пользователь правит его сам - расставляет параметры в нужных колонках. Потом этот шаблон сохраняется в ХранилищеЗначений, с привязкой к конкретному бренду. Потом - выгрузка производится в этот шаблон и сохраняется на диске. Удобно, не правда ли? Вот и ломаю голову... |
|||
4
kirill_sid
07.06.07
✎
08:44
|
Хотя... На первое время и так можно сделать. А как программно сохранять заполненный макет восьмерки в *.xls, не выводя макет на экран - не подскажешь?
|
|||
5
dk
07.06.07
✎
08:45
|
Имхо универсальность дорого стоит :(
Либо придется жестко описывать формат XLS для шаблона либо писать заумную обработку всех возможных вариантов шаблона ----- Имхо в таком случае проще действительно брать шаблон Excel и писАть прямо в него по OLE. |
|||
6
dk
07.06.07
✎
08:46
|
(4) С 8-кой не работаю
|
|||
7
kirill_sid
07.06.07
✎
08:56
|
Дык, не обязательно с 8-кой работать. Если есть примеры по использованию шаблонов Excel (*.xlt) из 7-ки - то я переложу на 8-ку. Это не проблема.
|
|||
8
kirill_sid
07.06.07
✎
11:09
|
Вопрос всё ещё актуален. Так что UP.
|
|||
9
vde69
07.06.07
✎
11:38
|
делал такое много раз и сейчас делаю :) , особо сложного нет.... посмотри мои вчерашние ответы там процедуру давал EXCEL_Получить....() ну и в перед
и идет Айболит и летит Айболит и одно только слово твердит OLE OLE OLE.... |
|||
10
kirill_sid
07.06.07
✎
12:06
|
Чего-то у меня поиск тормозит... Кинь ссылку, если не сложно. А ещё лучше - вышли на мыло примерчик какой-нибудь. kirill_sid@mail.ru
|
|||
11
vde69
07.06.07
✎
12:10
|
// функция получает данные ячейки и возвращаеть структуру соответствий, или неопределено в случае неудачи
// // В любом случае возвращаем соостветствие "Значение" и "ЭтоФормула", остальное по флагам // Функция EXCEL_ПолучитьЗначениеЯчейки (ExcelЛист, НомерСтроки, НомерКолонки, ПолучатьТекстФормулы = ложь, ПолучатьОформление = ложь) Результат = Новый Соответствие(); Попытка ТекущееЗначениеФормулы = ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula; Если ТекущееЗначениеФормулы <> "" Тогда Если Лев(ТекущееЗначениеФормулы, 1) <> "=" Тогда Результат.Вставить("ЭтоФормула", Ложь); Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value); Иначе Результат.Вставить("ЭтоФормула", Истина); Если Лев(СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).text),1) = "#" Тогда Результат.Вставить("ЗначениеЯчейки", Неопределено); Иначе Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value); КонецЕсли; Если ПолучатьТекстФормулы Тогда Результат.Вставить("ТекстФормулы", СокрЛП(ТекущееЗначениеФормулы)); КонецЕсли; КонецЕсли; Иначе Результат.Вставить("ЭтоФормула", Ложь); Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value); КонецЕсли; Если ПолучатьОформление Тогда Результат.Вставить("ЦветЯчейки", СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).Interior.ColorIndex)); // здесь можно добавить и другие.... КонецЕсли; Исключение Результат = Неопределено; КонецПопытки; Возврат Результат; КонецФункции |
|||
12
vde69
07.06.07
✎
12:11
|
ТелепатБот ответь, OLE COM
|
|||
13
vde69
07.06.07
✎
12:12
|
(12) не работает,
(10) ищи по слову OLE EXCEL |
|||
14
Armando
07.06.07
✎
12:20
|
не помешает здесь понюхать:
http://msdn2.microsoft.com/en-us/library/bb257110.aspx и здесь http://msdn2.microsoft.com/en-us/library/bb149081.aspx |
|||
15
kirill_sid
07.06.07
✎
13:00
|
Эхх... Жаль, что не силен я в англицком, а то наверное помогло бы... Хотя вопросов поубавилось. Остались основные:
1. Как именовать области в Excel? (например, ШАПКА) 2. Как копировать именованные области? (например, СТРОКА) 3. Как получать адреса ячеек с параметрами? (например, <НомерСтроки>) - для последующего заполнения значениями. |
|||
16
Armando
07.06.07
✎
13:10
|
C первого раза не скажу, а потому ищи.
Можешь поизвращаться: http://www.translate.ru/srvurl.asp?lang=ru |
|||
17
kirill_sid
07.06.07
✎
13:18
|
Прикольно :)
Один только перевод: "Как меня делают в Exel"-чего стоит. =)) |
|||
18
vde69
07.06.07
✎
13:57
|
(15) делаешь защищенную колонку №1 и в ней пишешь группировки
а еще можно к ячеки коменты приатачивать |
|||
19
kirill_sid
07.06.07
✎
16:22
|
Короче, победил. :)
В шаблоне задаю имена областей, а в ячейках - параметры, наподобие как в 1С (например <Товар>). Потом получаю область по имени, ищу ячейку по параметру и устанавливаю Value у ячейки. |
|||
20
kirill_sid
07.06.07
✎
16:23
|
Вот пример кода:
Процедура ВыгрузитьВЁксель() // Зайти в Excel Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.DisplayAlerts = 0; Excel.ScreenUpdating = 0; Excel.EnableEvents = 0; Excel.Visible = 0; РабочаяКнига = Excel.WorkBooks.Open(ФайлШаблона, 0); Лист = Excel.Sheets(1); Исключение Сообщить("Не удалось загрузить объект ""Ёксель""!"); Возврат; КонецПопытки; ШапкаОтчета = Лист.Range("Шапка"); ШапкаОтчета.Find("<ДатаОтчета>").Value = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"); СтрокаОтчета = Лист.Range("Строка"); Для Счетчик = 1 По 10 Цикл СтрокаОтчета.EntireRow.Copy(); СтрокаОтчета.EntireRow.Insert(); ТекСтрока = СтрокаОтчета.Range("A"+(СтрокаОтчета.Row-1)); ТекСтрока.Find("<НомерСтроки>") .Value = Счетчик; ТекСтрока.Find("<Товар>") .Value = "Номенклатура"+Счетчик; ТекСтрока.Find("<Количество>") .Value = 3; ТекСтрока.Find("<Цена>") .Value = Счетчик; ТекСтрока.Find("<Сумма>") .Value = Счетчик*3; КонецЦикла; // удалить последнюю строку СтрокаОтчета.EntireRow.Delete(); РабочаяКнига.SaveAs("D:\Темп\МойФайл.xls"); // Выйти из Excel. Excel.Quit(); КонецПроцедуры |
|||
21
kirill_sid
07.06.07
✎
16:24
|
Наверняка можно как-нибудь оптимизировать, но некогда сегодня этим заниматься. Может быть кому-то пригодится...
ЗЫ: Спасибо всем за участие. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |