TOffDoc Шаблоны odt, xlsx, docx.

Автор:tema
Дата:17.11.2015
Просмотров:3916
Скачиваний:721
Оценка:, Оценок - 2
Скачать (zip-файл; Размер - 487585)

Обсудить в форуме

Описание

Замена ODTXML. https://isupport.softlab.ru/portal/Samples/sample.asp?Typ=9&Id=426
Генератор отчётов на основе шаблонов офисных приложений.
Поддерживается odt (OpenDocument text) и частичная поддержка docx, xlsx
Позволяет оперировать тремя сущностями. Полями, таблицами и секциями. (Секция это группа полей и таблиц которые повторяются.)
Создание отчётов происходит на сервере, причём установка самих приложений не требуется. Т.е. никаких Word.Application, Excel.Application не используется, соответственно не используется объектная модель приложений. Вся работа идёт через DOM XML файлов документов.

Текст примера

 /// пример xlsx
import BankInter, ClnInter;
import globals;
import "toffdoc.mac";

var rep=TMsXlsForm("test_Excel.xlsx");

rep.SetField("A1", "Привет, мир");
rep.SetField("A2", "Hello World");
rep.SetField("Лист2!A3", "Да здравствует Кубрин!");

rep.Table("MyTable4");
rep.WriteRow(1,"Петров",Date(31,12,1972),$100.12);
rep.WriteRow(2,"Кукушкин",Date(11,10,1980),$99999.12);
rep.WriteRow(3,"Иванопуло",Date(28,02,1922),$0.02);

var bank_name;
GetClientShortName({OurBankID},bank_name);
rep.SetField("bank_name", bank_name);
rep.SetField("oper_post", GetPostOper({oper})); 
rep.SetField("oper_fio",  GetFioOper({oper},true)); 
rep.SetField("report_date",{curdate}); 

/// пример docx
import BankInter, ClnInter;
import globals;
import "toffdoc.mac";

var bank_name     ;
var client_name     ;
var client_addr     ;
var client_boss_id=0;



var rep=TMsDocForm("test_docx_Договор.docx");

var ClientId=200000;

var offArr=TArray();
GetClientOfficers (ClientId, offArr, 1);
if (offArr.Size>0)
    client_boss_id=offArr[0].rec.PersonID;
end;
GetClientShortName(ClientId,client_name);
GetClientShortName({OurBankID},bank_name);

    rep.SetField("oper_post",           GetPostOper({oper})); 
    rep.SetField("oper_fio",            GetFioOper({oper},true)); 
    rep.SetField("date_day",            1);
    rep.SetField("date_month",          "апреля");
    rep.SetField("date_year",           2015);
    rep.SetField("bank_name",           bank_name);
    rep.SetField("bank_inn",            GetClientINN({OurBankID}));
    rep.SetField("bank_kpp",            GetClientKPP({OurBankID}));
    rep.SetField("client_name",         client_name         );
    rep.SetField("client_inn",          GetClientINN(ClientId));
    rep.SetField("client_kpp",          GetClientKPP(ClientId));
    rep.SetField("client_boss_post",    GetClientPost(client_boss_id));
    rep.SetField("client_boss_fio",     GetClientFIO(client_boss_id));


/// пример odt
import ClnInter, BankInter, CtgInter;
import globals;
import TOffDoc;

var dateReport={curdate};
var fAccount =TBFile("account.dbt", "R",4,null,"bank.def");
var fPT= TBFile("partyown.dbt", "R", 1,null,"bank.def");
var okPT:Bool;


var rep=TOpenDocForm("счета клиентов.odt");

rep.Section(); //В отчёте будет использоваться механизм разделов
               //Имя раздела не указано, значит будет использоваться "Раздел1"
rep.SetSectionFields("Клиент", "ИНН", "КПП", "Сумма_по_счёту");  //Перечисляются поля, которые относятся к разделу
               //Поля Банк и Исполнитель сюда не входят, значит это "глобальные поля"

rep.SetField("Исполнитель",GetFioOper({oper}));
rep.SetField("Банк",       {name_bank});
/*  */
var flagNoAccount=true;
var sFullName, sShortName, sAddName;
var cntCln=0, cntAcc=0;
var sumAcc=$0;

macro OpenCloseAcc(CharOpenClose)
    var aRow=TArray();

    fAccount.rec.Open_Close=CharOpenClose;
    fAccount.rec.Client=fPT.rec.ClientId;
    fAccount.rec.Sort="";
    var getOk=fAccount.GetGE();
    while(getOk and (fAccount.rec.Open_Close==CharOpenClose) and (fAccount.rec.Client==fPT.rec.ClientId))
            if ((fAccount.rec.Close_Date==Date(0,0,0)) or (fAccount.rec.Close_Date<=dateReport))
                if (flagNoAccount)
                    rep.SectionAdd(); //секцию добавляем только когда есть счета, иначе будут пустые секции для клиентов без счетов
                    flagNoAccount=false;
                    rep.SetField("Клиент",sShortName);
                    rep.SetField("ИНН",GetClientINN(fPT.rec.ClientId));
                    rep.SetField("КПП",GetClientKPP(fPT.rec.ClientId));

                    rep.iTableFooterRows=1;  /* У таблицы есть подвал                     */
                    rep.Table();             /* Название таблицы, по умолчанию "Таблица1" */
                end;
                
                aRow[0]=fAccount.rec.Account;
                aRow[1]=String(fAccount.rec.Final_Date:f);
                aRow[2]=fAccount.rec.R0;
                rep.WriteRow(aRow);
                cntAcc=cntAcc+1;
                sumAcc=sumAcc+fAccount.rec.R0;
            end;
        getOk=fAccount.Next();
    end;
end;





        fPT.rec.PartyKind=PTK_CLIENT;
        fPT.rec.Sort="";
        okPT=fPT.GetGE();

        /* перебор всех клиентов */
        while(okPT and (fPT.rec.PartyKind==PTK_CLIENT))
            /* отбираем ЮЛ */
            if( PTLEGF_INST==GetClientLegalForm(fPT.rec.ClientId))
                flagNoAccount=true;
                sumAcc=$0;
                GetClientNames(fPT.rec.ClientId, sFullName, sShortName, sAddName);
                OpenCloseAcc("");
                OpenCloseAcc("З");
                if (not flagNoAccount);
                    rep.SetField("Сумма_по_счёту", sumAcc);
                end;
                cntCln=cntCln+1;
                message(cntCln);
            end;
            okPT=fPT.next();

            //для примера ограничиваем время выполнения макроса
            if(cntCln>200)
                okPT=false;
            end;
        end; //while

rep.SetField("Всего_клиентов", cntCln);
rep.SetField("Всего_счетов", cntAcc);