Izvoz v XLSX

Iz SDMS
Jump to navigationJump to search

Osnovni primer

Sub PrimerXLS
Dim XLS As TXlsWriter
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle
  Dim lefttopCell, rightbottomCell As TXlsCell
  Dim J As Long

  // inicializiramo writer in  prvi list
  XLS = CreateXlsWriter
  XLS.AddSheet('List 1')

  // spremenimo normal stil
  XLS.StyleNormal.FontSize = 12
  XLS.StyleNormal.FontName = 'Arial'

  // definiramo ostale stile po potrebi
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)
  titleStyle.FontBold = False
  titleStyle.FontItalic = True
  titleStyle.FontSize = 20
  titleStyle.HorAlign = XlshaCenter
  titleStyle.FontName = 'Arial'

  headerStyle = XLS.AddStyle('', XLS.StyleHeader)
  headerStyle.FontSize = 12
  headerStyle.HorAlign = xlshaAuto

  footerStyle = XLS.AddStyle('', XLS.StyleFooter)
  footerStyle.FontSize = 12
  footerStyle.HorAlign = XlshaRight
  footerStyle.TextWrap = false

  // zamrznemo stolpce in/ali vrstice
  XLS.SetFixedColumns(1)
  XLS.SetFixedRows(2)

  // dodamo naslov
  XLS.AddCell('Naslov', xlsnfText, titleStyle)
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov

  // dodamo header vrstico
  XLS.AddRow
  XLS.AddCell('', xlsnfText, headerStyle)
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)

  // dodamo podatke v tabelo
  for J = 1 to 5
    XLS.AddRow
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo
  next

  // dodamo footer vrstico
  XLS.AddRow
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele

  // ročno nastavimo širino prvega stolpca
  XLS.SetColumnWidth('A', 20)

  // narišemo robove okoli headerja, footerja in okoli celotne tabele
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela
EndSub

Definicija konstant

xlsCV - cell value (posebne vrednosti celic)

 xlscvTrue       // bool TRUE
 xlscvFalse      // bool FALSE
 xlscvAutoColSum // avtomatski seštevek vseh numeričnih celic nad to celico
 xlscvAutoRowSum // avtomatski seštevek vseh numeričnih celic levo od te celice

xlsNF - number format

Lahko se uporabi poljuben format namesto konstante.

  // text
  xlsnfText = '@';

  // stevilke
  xlsnfLong   = '0';
  xlsnfLongTS   = '#,##0';

  xlsnfFloat1 = '0.0';
  xlsnfFloat2 = '0.00';
  xlsnfFloat3 = '0.000';
  xlsnfFloat4 = '0.0000';

  xlsnfFloat1TS = '#,##0.0';
  xlsnfFloat2TS = '#,##0.00';
  xlsnfFloat3TS = '#,##0.000';
  xlsnfFloat4TS = '#,##0.0000';

  // valute
  xlsnfEuroS = '#,##0.00 €';
  xlsnfEuroL = '#,##0.00 "EUR"';

  // datum/cas
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';

  xlsnfDateDMY     = 'd.m.yyyy';
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';
  xlsnfDateIso     = 'yyyy-mm-dd';

  xlsnfTimeHHMM   = 'hh:mm';
  xlsnfTimeHHMMSS = 'hh:mm:ss';

  // bool
  xlsnfBoolDa   = '"da";"da";;';
  xlsnfBoolDaNe = '"da";"da";"ne";"ne"';

xlsBT - border type

 xlsbtAll    // vsi robovi
 xlsbtVer    // vsi vertikalni robovi
 xlsbtHor    // vsi horizontalni robovi
 xlsbtLeft   // samo levi robovi
 xlsbtRight  // samo desni robovi
 xlsbtTop    // samo zgornji robovi
 xlsbtBottom // samo spodnji robovi

xlsBS - border style

 xlsbsNone
 xlsbsThin
 xlsbsMedium
 xlsbsThick
 xlsbsUnchanged  // rob se ne spremeni

xlsHA - hor align

 xlshaAuto   // poravnava se nastavi glede na vsebino: levo za tekst, desno za številke...
 xlshaLeft
 xlshaCenter
 xlshaRight

xlsVA - ver align

 xlsvaTop
 xlsvaCenter
 xlsvaBottom

Prenos podatkov iz baze

Sub TabelaXLS
  Dim XLS As TXlsWriter, XLSF As TXlsField
  Dim L as TLayer

  // inicializiramo writer in  prvi list
  XLS = CreateXlsWriter
  XLS.AddSheet('List 1')

    // pripravimo definicijo stolpcev
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev
  XLS.Table.StyleTitle.HorAlign = xlshaCenter
  XLS.Table.StyleNormal.FontColor = Gray

  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst

  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca

  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja

  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca

  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca

  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca

  // pripravimo podatke
  L = [Layer]
  L.Filter.ExecuteSQL('[polje1] = 10')
  L.Sort.Load('Default')
  L.Sort.Execute

  // zapišemo podatke po dani definiciji
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski

  // nastavimo še robove celic
  RoboviXLS(XLS)

  // dodamo nov list
  XLS.AddSheet('List 2')

  // pripravimo nove podatke
  L = [Layer]
  L.Filter.ExecuteSQL('[polje1] = 20')
  L.Sort.Load('Default')
  L.Sort.Execute
  
  // zapišemo podatke po dani definiciji
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski

  // nastavimo še robove celic
  RoboviXLS(XLS)

  // shranimo v file in sprostimo writer
  XLS.SaveToFile('c:\temp\test.xlsx')
  XLS.Destroy
EndSub

Sub RoboviXLS(XLS As TXlsWriter)
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja
EndSub