Имя: Пароль:
1C
 
Работа с шаблоном 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
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
Наверняка можно как-нибудь оптимизировать, но некогда сегодня этим заниматься. Может быть кому-то пригодится...

ЗЫ: Спасибо всем за участие.