Я прямо в Calc рисую. В свойствах xlsx прописываю разделение на детальки в терминах клариона.
Код построения отчета выглядит так.
Код: Выделить всё
reestrSotr_r  routine   !реестр по сотрудникам
  DATA
FsXLSXL      &FsXLSX
lor:i        long
lor:sumIt_r  real
  CODE
        
     do FsViewQueue_r
   
     if records(Loc:Queue)=0
        FsMessagePr('Данные не найдены!')    
        exit
     .       
     sort(Loc:Queue,Loc:NameCardPayK,Loc:IDCardPay,Loc:NameTovarK,Loc:IDTovar)   
     do raschSotrIt_r
     do formSotr_r
     FsPrimary:Param(1) 
     FsPrimary:Klients(Loc:IDKlient)
   
     Loc:Filename=GetNameTmp(FsAccess:ActiveUserDir,'xlsx',0)    
     FsXLSXL &= NEW(FsXLSX)
     FsXLSXL.init(Loc:FileName,FsAccess:ActiveUserDir)
     FsXLSXL.LoadTemplate('reports\reestrCardsPay.xlfx')
     !FsXLSXL.SetPageSetup(,,-1,,1,999)
     FsXLSXL.SetValue('PeriodStart',Loc:PeriodStart)
     FsXLSXL.SetValue('PeriodEnd',Loc:PeriodEnd)
     FsXLSXL.SetValue('NameMag',PAR:Adress)
     FsXLSXL.OutSection('secHeader')
     lor:sumIt_r=0
     loop lor:i=1 to records(Loc:Queue)
        get(Loc:Queue,lor:i)
        case Loc:TypeRec
            of 0
               FsPrimary:CardsPay(Loc:IDCardPay) 
               clear(Loc:QueueCardsIt)
               Loc:IDCardPayIt=Loc:IDCardPay
               get(Loc:QueueCardsIt,Loc:IDCardPayIt)  
               lor:sumIt_r+=Loc:SumPayIt
               FsXLSXL.SetValue('Sum',Loc:Sum) 
               FsXLSXL.SetValue('SumTalon',Loc:SumPayIt) 
               FsXLSXL.OutSection('secGroup')
            of 1
               FsPrimary:Tovar(Loc:IDTovar)
               FsXLSXL.SetValue('Kol',Loc:Kol) 
               FsXLSXL.SetValue('Sum',Loc:Sum) 
               FsXLSXL.OutSection('secDetail')
            of 3
               FsXLSXL.SetValue('Sum',Loc:Sum) 
               FsXLSXL.SetValue('SumTalon',lor:sumIt_r) 
               FsXLSXL.OutSection('secFooter')               
        .    
     .
     
     free(Loc:Queue)   
     free(Loc:QueueCardsIt)   
   
     FsXLSXL.Make
     if FsAnyScreen=0
        FsXLSXL.kill(1)
     else
        FsXLSXL.Kill(2) 
        FsMessagePr('Отчет будет загружен на Ваш компьютер в файле ' & clip(FsFileShort(Loc:Filename,0)) & ' !')
        AnyScreen:DownloadFile(clip(longpath(Loc:Filename))) 
     .   
     dispose(FsXLSXL)
Calc требуется только для редактирования бланка, при построении не нужен, xlsx формируется напрямую в файл. Для xls бланков очень похоже. Отчеты такие рисовать очень быстро, быстрее не бывает, используются все возможности офисных пакетов.
C6/C12, ШВС, tps/btrieve.