Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

O que é?

Classe responsável por auxiliar a printer.exe na geração de arquivos .xlsx. Esta classe faz o processo de escrever o arquivo intermediário com as instruções a serem convertidas e que gerarão o arquivo .xlsx.

Aviso

O recurso depende primariamente da printer.exe ter a versão igual ou superior a 2.1.0.

Classe disponível na lib com label igual ou superior a 20201009.

Métodos

New()

Cria a instância de um objeto da classe FwPrinterXlsx.

Permite a configuração se deve excluir o arquivo auxiliar .rel de construção da planilha .xlsx.

Sintaxe: FwPrinterXlsx():New(lDelBase) → objeto FwPrinterXlsx

Parâmetros:

Nome

Tipo

Obrigatório

Default

Referência

Descrição

lDelBaseLógico
.F.
indica se deve apagar o arquivo base após o comando para geração do .xlsx

Exemplo:

Bloco de código
languagecpp
local oFwXlsx := FwPrinterXlsx():New()

Activate()

Prepara o objeto para realizar a escrita do arquivo base. O resultado do método indica se conseguiu preparar com sucesso o arquivo base.

Permite a configuração do objeto utilizado na escrita considerando como base a classe FwFileWriter.

Sintaxe: FwPrinterXlsx():Activate(cFile, oFile) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
cFilecaracterex

caminho do arquivo para o .rel e .xlsx final
oFileobjeto
objeto FwFileWriter()xobjeto para realizar a escrita dos comandos no arquivo base
Bloco de código
languagecpp
local cPath := "\spool\"  // /spool/ para uma geração no server
local cArquivo := cPath + "xls_class_rel.rel"

lRet := oXlsx:Activate(cArquivo)

// informando o FwFileWriter
// oFileW := FwFileWriter():New(cFilename)
// lRet := oXlsx:Activate(cFilename, oFileW)
Aviso
titleObservações

Informe caminhos de diretórios completos (a partir do cliente ou do rootpath) para não ter comportamentos inesperados com a execução da printer no final.

Prefira o uso de diretório e nomes de arquivos como: /spool/nome_arquivo.rel ou c:\temporários\relatório\nome_arquivo.rel.

toXlsx()

Faz a criação do arquivo .xlsx depois de ter completado o preenchimento e configuração das informações na classe.

Sintaxe: FwPrinterXlsx():toXlsx() → nil

Bloco de código
languagecpp
lRet := oFwXlsx:Activate(cGenFile)
oFwXlsx:toXlsx()

cGenFile := StrTran(cGenFile, ".rel", ".xlsx")

if file(cGenFile)
	CpyS2T(cGenFile, cDestFile)
else
	// arquivo não gerado
endif
Aviso
titleObservações

Fica sob responsabilidade do programa/código cliente verificar se o arquivo foi .xlsx gerado onde desejado e eventualmente mover para um destino desejado como a máquina da pessoa ou diretório compartilhado.

EraseBaseFile()

Exclui o arquivo base .rel gerado com uma instância da classe FwPrinterXlsx.

Sintaxe: FwPrinterXlsx():EraseBaseFile() → nil

DeActivate()

Remove os elementos preparados com a criação e escrita do arquivo no Activate.

Sintaxe: FwPrinterXlsx():DeActivate() → nil

Destroy()

Remove os recursos conhecidos que prendem memória em múltiplas execuções da classe.

Sintaxe: FwPrinterXlsx():Destroy() → nil

SetFont()

Faz a indicação da fonte para ser utilizada nas novas atribuições de conteúdos que acontecer nas células.

Sintaxe: FwPrinterXlsx():SetFont(cFont, nSize, lItalic, lBold, lUnderlined) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
cFontcaracterex

código da fonte - Utilize a classe FwPrinterFont como referência
nSizenuméricox

tamanho da fonte
lItaliclógicox

deve exibir em itálico?
lBoldlógicox

deve exibir em negrito?
lUnderlinedlógicox

deve exibir sublinhado?

Exemplo:

Bloco de código
languagecpp
linenumberstrue
// cFont :=	 FwPrinterFont():getFromName("Calibri")
cFont := FwPrinterFont():Calibri()
nSize := 14
lItalic := .T.
lBold := .T.
lUnderlined := .T.
// Comando 'Fonte' com Calibri 14, itálico, negrito e sublinhado
lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

ResetFont()

Redefine a fonte padrão para uma planilha.

A fonte padrão é Calibri, tamanho 11 e sem itálico, sem negrito e sem sublinhado.

Sintaxe: FwPrinterXlsx():ResetFont() → lRet

SetFontConfig()

Faz a definição de uma fonte através de um objeto de configuração.

Facilita os casos de troca repetida de fontes, permitindo ter um objeto pré configurado com as características desejadas. Internamente é utilizado o método setFont.

O objeto de configuração é o retorno do método estático da classe FwXlsxPrinterConfig:MakeFont().

Sintaxe: FwPrinterXlsx():SetFontConfig(jFont) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
jFontobjeto JsonObjectx

configuração com as propriedades para fontes
veja: FwXlsxPrinterConfig():MakeFont()

Exemplo:

Bloco de código
languagecpp
jFontItalic := FwXlsxPrinterConfig():MakeFont()
jFontItalic['italic'] := .T.

jFontBold := FwXlsxPrinterConfig():MakeFont()
jFontBold['bold'] := .T.

lRet := self:oPrintXlsx:SetFontConfig(jFontItalic)
// escreve no arquivo

lRet := self:oPrintXlsx:SetFontConfig(jFontBold)
// escreve novamente no arquivo

SetColumnsWidth()

Define a largura para uma lista de colunas.

O valor da largura segue a especificação de unidade do excel e o valor padrão das colunas é de 8,43.

Sintaxe: FwPrinterXlsx():SetColumnsWidth(nColFrom, nColTo, nWidth) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nColFromnuméricox

determina a partir de qual coluna aplicar o ajuste de largura
nColTonuméricox

determina até qual coluna deve aplicar o ajuste de largura
nWidthnuméricox

determina a nova largura

Exemplo:

Bloco de código
languagecpp
// Largura 23,71
lRet := oXlsx:SetColumnsWidth(5, 10, 23.71)

SetRowsHeight()

Define a altura para uma lista de linhas.

Este valor segue a especificação de unidade do excel e o valor padrão das linhas é de 15.00.

Sintaxe: FwPrinterXlsx():SetRowsHeight(nRowFrom, nRowTo, nHeight) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRowFromnuméricox

determina a partir de qual linha aplicar o ajuste de altura
nRowTonuméricox

determina até qual linha deve aplicar o ajuste de altura
nHeightnuméricox

determina a nova altura

Exemplo:

Bloco de código
languagecpp
nRowFrom := 26
nRowTo := 30
nHeight := 18.75
// Altura 18,75 nas linhas 26 a 30
lRet := oXlsx:SetRowsHeight(nRowFrom, nRowTo, nHeight)

SetCellsFormat()

Define a formatação a ser aplicada nas células, aplicando alinhamento, cores e formatação dos valores.

Os alinhamentos de conteúdo possuem classes de apoio para a recuperação dos códigos a serem utilizados. As classes são FwXlsxCellAlignmentFwXlsxHorizontalAlignmentFwXlsxVerticalAlignment.

Os valores para as cores seguem o padrão RGB contudo sem a marcação 

Sintaxe: FwPrinterXlsx():SetCellsFormat(cHorAlign, cVertAlign, lTextWrap, nRotDegrees, cTextColor, cBgColor, cCustomFormat)→ lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
cHorAligncaracterex

determina o alinhamento horizontal do conteúdo
veja: FwXlsxHorizontalAlignment
cVertAligncaracterex

determina o alinhamento vertical do conteúdo
veja: FwXlsxVerticalAlignment
lTextWraplógicox

deve aplicar quebra de linha?
nRotDegreesnuméricox

define a rotação do texto em graus 0 - 359
cTextColorcaracterex

define a cor para o texto na célula
cBgColorcaracterex

define a cor de fundo da célula
cCustomFormatcaractere
""
determina tipo personalizado de formatação do conteúdo

Exemplo:

Bloco de código
static oCellHorAlign := FwXlsxCellAlignment():Horizontal()
static oCellVertAlign := FwXlsxCellAlignment():Vertical()

cHorAlignment := oCellHorAlign:Center()
cVertAlignment := oCellVertAlign:Center()
lWrapText := .F.
nRotation := 270
cCustomFormat := ""
// Seta texto vermelho com alinhamento horizontal e vertical centralizado e com rotação de texto vertical
lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF0000", "FFFFFF", cCustomFormat)

ResetCellsFormat()

Redefine para a formatação padrão de células.

O padrão das células é alinhamento horizontal e vertical Default sem quebra de texto, sem rotação, texto na cor preta e fundo da célula na cor branca e sem formatação de conteúdo

Sintaxe: FwPrinterXlsx():ResetCellsFormat()→ lRet

SetCellsFormatConfig()

Aplica as configurações de formatação utilizando um objeto com as propriedades necessárias.

Sintaxe: FwPrinterXlsx():SetCellsFormatConfig(jFormat) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
jFormatobjeto JsonObjectx

configuração com as propriedades para fontes
FwXlsxPrinterConfig():MakeFormat()

Exemplo:

Bloco de código
jFormat := FwXlsxPrinterConfig():MakeFormat()
jFormat['hor_align'] := oCellHorAlign:Center()
jFormat['vert_align'] := oCellVertAlign:Center()

// formatação para todas as células a seguir
lRet := oXlsx:SetCellsFormatConfig(jFormat)

MergeCells()

Aplica a unificação de um conjunto de células que esteja no intervalo matricial informado (células de - até).

Sintaxe: FwPrinterXlsx():MergeCells(nRowFrom, nColFrom, nRowTo, nColTo) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRowFromnuméricox

indica a partir de qual linha aplicar a unificação
nColFromnuméricox

indica a partir de qual coluna aplicar a unificação
nRowTonuméricox

indica até qual linha aplicar a unificação
nColTonuméricox

indica até qual coluna aplicar a unificação

Exemplo:

Bloco de código
languagecpp
nRowFrom := 2
nColFrom := 2
nRowTo := 21
nColTo := 3
// Mescla intervalo B2:C21
lRet := oXlsx:MergeCells(nRowFrom, nColFrom, nRowTo, nColTo)

SetBorder()

Determina as bordas para as próximas células que receberão conteúdo.

Sintaxe: FwPrinterXlsx():SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
lLeftlógicox

deve usar borda à esquerda?
lToplógicox

deve usar borda superior?
lRightlógicox

deve usar borda à direita?
lBottomlógicox

deve usar borda inferior?
cStylecaracterex

define qual o tipo de borda (FwXlsxBorderStyle)
cColorcaracterex

define a cor para as bordas

Exemplo:

Bloco de código
lTop := .T.
lBottom := .T.
lLeft:= .T.
lRight := .T.
cStyle := FwXlsxBorderStyle():DashDot()
cColor := "008000"
// Borda
lRet := oXlsx:SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)

ResetBorder()

Redefine para as bordas de células para o padrão.

O padrão das bordas é sem indicação de uso de bordas (falso para os quatro lados), estilo None (não aplica estilo algum) e cor de linha preta.

Sintaxe: FwPrinterXlsx():ResetBorder() → lRet

SetBorderConfig()

Aplica as configurações de borda utilizando um objeto com as propriedades necessárias.

Sintaxe: FwPrinterXlsx():SetBorderConfig(jBorder) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
jBorderobjeto JsonObjectx

configuração com as propriedades para as bordas
FwXlsxPrinterConfig():MakeBorder()

Exemplo:

Bloco de código
// Bordas para o header
jBorderHeader := FwXlsxPrinterConfig():MakeBorder()
jBorderHeader['top'] := .T.
jBorderHeader['bottom'] := .T.
jBorderHeader['border_color'] := "B1B1B1"
jBorderHeader['style'] := FwXlsxBorderStyle():Double()
lRet := oXlsx:SetBorderConfig(jBorderHeader)

AddSheet()

Adiciona uma aba à planilha. Este é um dos comandos obrigatórios para a geração de uma planilha.

Sintaxe: FwPrinterXlsx():AddSheet(cSheetName) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
cSheetNamecaractere
nil
nome para a aba

Exemplo:

Bloco de código
// Nova aba
lRet := oXlsx:AddSheet("Minha Plan2")
// lRet := oXlsx:AddSheet()

ApplyFormat()

Comando que força a aplicação de uma formatação à célula.

Este comando pode ser usado para atribuir um formato às células e minimizar a quantidade de escrita no arquivo base.

A formatação envolvida são: configuração de bordas, formatação de conteúdo, alinhamento e cor e definição de fonte.

Sintaxe: FwPrinterXlsx():ApplyFormat(nRow, nCol) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

número da linha da célula para aplicar as formatações
nColnuméricox

número da linha da célula para aplicar as formatações

Exemplo:

Bloco de código
lTop := .T.
lBottom := .T.
lLeft:= .T.
lRight := .T.
cStyle := FwXlsxBorderStyle():DashDot()
cColor := "008000"
// Borda
lRet := oXlsx:SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)

nRow := 12
nCol := 1
// blank - Usado somente para aplicar a formatação
lRet := oXlsx:ApplyFormat(nRow, nCol)

SetValue()

Atribuição genérica de um valor para a célula conforme os tipos do Advpl, a atribuição é redirecionada internamente para o tipo de atribuição apropriada por exemplo, caractere → setText e numérico → setNumber.

Nenhum dos comandos de atribuição de valor aplica a formatação para o tipo, ou seja é necessário que indique o formato que queira exibir o conteúdo na célula antes da atribuição ou então aplique depois de ter atribuído o valor com o método ApplyFormat para cada uma das células escritas antes.

Sintaxe: FwPrinterXlsx():SetValue(nRow, nCol, xValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
xValuequalquer Advplx

valor para atribuição dos tipos caractere, numérico, data ou lógico de Advpl

Exemplo:

Bloco de código
languagecpp
lRet := oXlsx:SetValue(1, 3, "Mês")
lRet := oXlsx:SetValue(2, 3, 1)
lRet := oXlsx:SetValue(3, 3, .F.)
lRet := oXlsx:SetValue(4, 3, STOD("20200827")) // ficará sem formatação de data

cHorAlignment := oCellHorAlign:Default()
cVertAlignment := oCellVertAlign:Default()
lWrapText := .F.
nRotation := 0
cCustomFormat := "dd-mm-yyyy"
// Seta formato de data dd-mm-yyyy
lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)
lRet := oXlsx:SetValue(5, 3, STOD("20200827")) // terá formatação de data

SetText()

Atribui um valor de texto a uma célula.

Sintaxe: FwPrinterXlsx():SetText(nRow, nCol, cValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
cValuecaracterex

valor para atribuição

SetNumber()

Atribui um valor numérico a uma célula.

Sintaxe: FwPrinterXlsx():SetNumber(nRow, nCol, nValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
nValuenuméricox

valor para atribuição

SetFormula()

Atribui uma fórmula a uma célula. Esta fórmula não tem sua validade consistida na atribuição.

Sintaxe: FwPrinterXlsx():SetFormula(nRow, nCol, cValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
cValuecaracterex

valor para atribuição

Exemplo:

SetDate()

Atribui o valor de data do Advpl a uma célula.

Sintaxe: FwPrinterXlsx():SetDate(nRow, nCol, dValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
dValuedatax

valor para atribuição

SetDateTime()

Atribui o valor de data e hora a uma célula.

Espera que este valor no formato aceito pela printer.exe.

Veja a classe FwXlsxDateFormat para os detalhes de como gerar o formato da printer para data e hora.

Sintaxe: FwPrinterXlsx():SetDateTime(nRow, nCol, cValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
cValuecaracterex

valor para atribuição dos tipos caractere, numérico, data ou lógico de Advpl

Exemplo:

Bloco de código
cHorAlignment := oCellHorAlign:Default()
cVertAlignment := oCellVertAlign:Default()
lWrapText := .F.
nRotation := 0
cCustomFormat := "dd/mm/yy hh:mm:ss.000"
// Define o formato de data e hora dd/mm/yy hh:mm:ss.000
lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

nRow := 6
nCol := 3
oXlsxDate := FwXlsxDateFormat():New()
oXlsxDate:SetYear("2019")
oXlsxDate:SetMonth("8")
oXlsxDate:SetDay("23")
oXlsxDate:SetHour("17")
oXlsxDate:SetMinute("55")
oXlsxDate:SetSeconds("43.123")
cValue := oXlsxDate:toPrinterFormat()
// data e hora completas na célula
lRet := oXlsx:SetDateTime(nRow, nCol, cValue)

SetHyperlink()

Atribui um hiperlink interno ou externo (URL) a uma célula.

Sintaxe: FwPrinterXlsx():SetHyperlink(nRow, nCol, cValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
cValuecaracterex

valor para atribuição

SetBoolean()

Atribui um valor lógico a uma célula.

Sintaxe: FwPrinterXlsx():SetBoolean(nRow, nCol, lValue) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para atribuição do valor
nColnuméricox

coluna da célula para atribuição do valor
lValuelógicox

valor para atribuição

AddImageFromBuffer()

Sintaxe: FwPrinterXlsx():(nRow, nCol) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição

Exemplo:

UseImageFromBuffer()

Sintaxe: FwPrinterXlsx():(nRow, nCol) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição

Exemplo:

AddImageFromAbsolutePath()

Sintaxe: FwPrinterXlsx():(nRow, nCol) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição

Exemplo:

SetVerticalBarCodeContent()

Sintaxe: FwPrinterXlsx():(nRow, nCol) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição

Exemplo:

ApplyAutoFilter()

Sintaxe: FwPrinterXlsx():ApplyAutoFilter(nRow, nCol) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição

Exemplo:

Exemplos

Uso simples

O exemplo a seguir mostra como gerar uma planilha simples.

Bloco de código
languagecpp
titleexemplo básico
linenumberstrue
#include 'protheus.ch'

function u_basicoxlsx()
    local oXlsx as object
    local cFilename as character
    // local oFileW as object
    local lRet as logical

    cFilename := '/system/'+cValToChar(ThreadId())+'_teste_poc.rel'
    ferase(cFilename)

    // oFileW := FwFileWriter():New(cFilename)
    oXlsx := FwPrinterXlsx():New()

    // lRet := oXlsx:Activate(cFilename, oFileW)
    lRet := oXlsx:Activate(cFilename)

    lRet := oXlsx:AddSheet("1 - Plan")

    lRet := oXlsx:SetText(1, 1, "Valor na célula")
    lRet := oXlsx:toXlsx()

    oXlsx:DeActivate()
Return


Planilha com todos os recursos

O exemplo de planilha a seguir implementa todos os recursos disponíveis.

Bloco de código
languagecpp
firstline1
titleexemplo completo
linenumberstrue
collapsetrue
#include "protheus.ch"
#include "fileio.ch"

static oCellHorAlign := FwXlsxCellAlignment():Horizontal()
static oCellVertAlign := FwXlsxCellAlignment():Vertical()

function u_fwprtxlsx()
    classe()
    alert('terminou')
return


static function classe()
    local cRootPath := 'C:\Especif\Protheus12\sistemico\protheus_data_27'
    local cPath := "\spool\"  // /spool/ para uma geração no server
    local cArquivo := cPath + "xls_class_rel.rel"
    local cImgRel := 'logo'
    local cImgDir := cRootPath + cPath + 'protheus_logo.png'

    local cBuffer:= ""

    local lRet := .F.
    local oFileW := FwFileWriter():New(cArquivo)
    local oXlsx := FwPrinterXlsx():New()

    local nHndImagem:= fOpen(cImgDir, FO_READ)
    local nLenImagem := 0
    local jFontHeader
    local jFontNum
    local jFontText
    local jBorderHeader
    local jBorderLeft
    local jBorderCenter
    local jBorderRight
    local jFormat

    if nHndImagem < 0
        return MsgStop("Não foi possível abrir " + cImgDir)
    endIf

    nLenImagem := fSeek( nHndImagem, 0, FS_END)
    fSeek( nHndImagem, 0, FS_SET)
    fRead( nHndImagem, @cBuffer, nLenImagem)

    lRet := oXlsx:Activate(cArquivo, oFileW)

    lRet := oXlsx:AddSheet("Minha Plan1")

    lRet := oXlsx:AddImageFromBuffer(5, 8, cImgRel, cBuffer, 0, 0)

    lRet := oXlsx:AddImageFromAbsolutePath(10, 8, cImgDir, 200, 100)

    lRet := oXlsx:UseImageFromBuffer(20, 8, cImgRel, 114, 33)

    // cFont := FwPrinterFont():getFromName("Calibri")
    cFont := FwPrinterFont():Calibri()
    nSize := 14
    lItalic := .T.
    lBold := .T.
    lUnderlined := .T.
    // Comando 'Fonte' com Calibri 14, itálico, negrito e sublinhado
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    // Comando 'Formato de Célula' com cor de texto e fundo personalizadas
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF0000", "C0C0C0", "" )

    nColFrom := 1
    nColTo := 5
    nWidth := 24
    lRet := oXlsx:SetColumnsWidth(nColFrom, nColTo, nWidth)

    nRow := 1
    nCol := 1
    // Texto em A1
    lRet := oXlsx:SetText(nRow, nCol, "Texto na célula")

    // cFont := FwPrinterFont():getFromName("Calibri")
    cFont := FwPrinterFont():Calibri()
    nSize := 11
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Calibri 11
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    lRet := oXlsx:ResetCellsFormat()

    nRow := 2
    nCol := 1
    lRet := oXlsx:SetText(nRow, nCol, "00123")

    nRow := 3
    nCol := 1
    // Número 008
    lRet := oXlsx:SetNumber(nRow, nCol, 8)

    nRow := 4
    nCol := 1
    // Número 04
    lRet := oXlsx:SetNumber(nRow, nCol, 4)

    nRow := 5
    nCol := 1
    // Fórmula que soma os dois números anteriores
    lRet := oXlsx:SetFormula(nRow, nCol, "=SUM(A3:A4)")

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "#,##0"
    // Comando 'Formato de Célula' com cor de texto e fundo personalizadas
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 4
    nCol := 2
    // Número com formato customizado (123.123.123)
    lRet := oXlsx:SetNumber(nRow, nCol, 123123123)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "0.00%"
    // Comando 'Formato de Célula' com cor de texto e fundo personalizadas
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 4
    nCol := 3
    // Número com formato customizado (4,27%)
    lRet := oXlsx:SetNumber(nRow, nCol, 0.0427)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "R$ #,##0.00;[Red]-R$ #,##0.00"
    // Seta formato numérico R$ #,##0.00;[Red]-R$ #,##0.00
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 4
    nCol := 4
    // Número com formato customizado (R$ 1234,56)
    lRet := oXlsx:SetNumber(nRow, nCol, 1234.56)

    nRow := 4
    nCol := 5
    // Número com formato customizado (R$ 1234,56)
    lRet := oXlsx:SetNumber(nRow, nCol, -1234.56)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "dd/mm/yyyy"
    // Seta formato de data dd/mm/yyyy
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 6
    nCol := 1
    dValue := STOD("20190823")
    // Data "ano, mês, dia, hora, minuto, segundo" no padrão: yyyy,mm,dd,hh,mm,ss.sss
    lRet := oXlsx:SetDate(nRow, nCol, dValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "hh:mm"
    // Seta formato de hora hh:mm
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 6
    nCol := 2
    oXlsxDate := FwXlsxDateFormat():New()
    oXlsxDate:SetHour("17")
    oXlsxDate:SetMinute("55")
    cValue := oXlsxDate:toPrinterFormat()
    // 17:55
    lRet := oXlsx:SetDateTime(nRow, nCol, cValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "dd/mm/yy hh:mm:ss.000"
    // Seta formato de data e hora dd/mm/yy hh:mm:ss.000
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 6
    nCol := 3
    oXlsxDate := FwXlsxDateFormat():New()
    oXlsxDate:SetYear("2019")
    oXlsxDate:SetMonth("8")
    oXlsxDate:SetDay("23")
    oXlsxDate:SetHour("17")
    oXlsxDate:SetMinute("55")
    oXlsxDate:SetSeconds("43.123")
    cValue := oXlsxDate:toPrinterFormat()
    // data e hora completas
    lRet := oXlsx:SetDateTime(nRow, nCol, cValue)

    nRow := 6
    nCol := 4
    oXlsxDate := FwXlsxDateFormat():New()
    oXlsxDate:SetYear("2019")
    oXlsxDate:SetMonth("8")
    oXlsxDate:SetDay("23")
    oXlsxDate:SetHour("17")
    oXlsxDate:SetMinute("55")
    oXlsxDate:SetSeconds("43.123")
    cValue := oXlsxDate:toPrinterFormat()
    // data e hora completas
    lRet := oXlsx:SetDateTime(nRow, nCol, cValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "mmm-yyyy"
    // Seta formato de data mmm-yyyy
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 6
    nCol := 5
    dValue := STOD("20190823")
    // Data "ano, mês, dia, hora, minuto, segundo" no padrão: yyyy,mm,dd,hh,mm,ss.sss
    lRet := oXlsx:SetDate(nRow, nCol, dValue)

    // cFont := FwPrinterFont():getFromName("Calibri")
    cFont := FwPrinterFont():Calibri()
    nSize := 11
    lItalic := .F.
    lBold := .F.
    lUnderlined := .T.
    // Calibri sublinhada para url
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := ""
    // Seta formato com texto azul
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "0000FF", "FFFFFF", cCustomFormat)

    nRow := 7
    nCol := 1
    // url
    lRet := oXlsx:SetHyperlink(nRow, nCol, "http://www.totvs.com.br")

    nRow := 8
    nCol := 1
    // url
    lRet := oXlsx:SetHyperlink(nRow, nCol, "http://www.google.com")
    // Texto de exibição da url inserida no comando anterior
    lRet := oXlsx:SetText(nRow, nCol, "Google")

    nRow := 9
    nCol := 1
    // URIs locais são suportadas para referências
    lRet := oXlsx:SetHyperlink(nRow, nCol, "internal:'Minha Plan1'!A2")

    nRow := 10
    nCol := 1
    // URIs locais são suportadas para referências
    lRet := oXlsx:SetHyperlink(nRow, nCol, "internal:'Minha Plan2'!B2")

    // cFont := FwPrinterFont():getFromName("Calibri")
    cFont := FwPrinterFont():Calibri()
    nSize := 11
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Calibri 11
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    nRow := 11
    nCol := 1
    // lógico
    lRet := oXlsx:SetBoolean(nRow, nCol, .T.)

    nRow := 11
    nCol := 2
    // lógico
    lRet := oXlsx:SetBoolean(nRow, nCol, .F.)

    cHorAlignment := oCellHorAlign:Fill()
    cVertAlignment := oCellVertAlign:Justify()
    lWrapText := .T.
    nRotation := 0
    cCustomFormat := ""
    // Formato
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF00FF", "808080", cCustomFormat)

    lTop := .T.
    lBottom := .T.
    lLeft:= .T.
    lRight := .T.
    cStyle := FwXlsxBorderStyle():DashDot()
    cColor := "008000"
    // Borda
    lRet := oXlsx:SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)

    nRow := 12
    nCol := 1
    // blank - Usado somente para aplicar a formatação
    lRet := oXlsx:ApplyFormat(nRow, nCol)

    nRow := 12
    nCol := 2
    // blank - Usado somente para aplicar a formatação
    lRet := oXlsx:ApplyFormat(nRow, nCol)

    // cFont := FwPrinterFont():getFromName('code128b')
    cFont := FwPrinterFont():Code128b()
    nSize := 50
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Fonte Code 128 (para código de barras)
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    nRow := 2
    nCol := 13
    // Texto para o código de barras Code128 (o texto é codificado pela FWMSPrinter)
    lRet := oXlsx:SetText(nRow, nCol, "Ò,BX'hÓ")

    // cFont := FwPrinterFont():getFromName('qrcode')
    cFont := FwPrinterFont():QrCode()
    nSize := 50
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Fonte QRCode (para código de barras 2D)
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    nRow := 6
    nCol := 13
    // Texto para o código de barras QRCode
    lRet := oXlsx:SetText(nRow, nCol, "QRCode gerado para o Excel")

    // cFont := FwPrinterFont():getFromName('datamatrix')
    cFont := FwPrinterFont():DataMatrix()
    nSize := 50
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Fonte DataMatrix (para código de barras 2D)
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    nRow := 11
    nCol := 13
    // Texto para o código de barras Datamatrix
    lRet := oXlsx:SetText(nRow, nCol, "Datamatrix gerado para o Excel")

    // cFont := FwPrinterFont():getFromName('PDF417')
    cFont := FwPrinterFont():PDF417()
    nSize := 300
    lItalic := .T.
    lBold := .F.
    lUnderlined := .F.
    // Fonte PDF417 (para código de barras 2D)
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    nRow := 16
    nCol := 13
    // Texto para o código de barras PDF417
    lRet := oXlsx:SetText(nRow, nCol, "PDF417 gerado para o Excel")

    // cFont := FwPrinterFont():getFromName('calibri')
    cFont := FwPrinterFont():Calibri()
    nSize := 11
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Calibri 11
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    nRow := 23
    nCol := 13
    cContent := "01005000000001001010111010001010111000111011101000101000111010111000101000111011100010101000111000101010111000111010"
    lRet := oXlsx:SetVerticalBarCodeContent(nRow, nCol, cContent) // Comando 'Código de barra vertical'

    // Nova página
    lRet := oXlsx:AddSheet("Minha Plan2")

    cHorAlignment := oCellHorAlign:Center()
    cVertAlignment := oCellVertAlign:Center()
    lWrapText := .F.
    nRotation := 270
    cCustomFormat := ""
    // Seta texto vermelho com alinhamento horizontal e vertical centralizado e com rotação de texto vertical
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF0000", "FFFFFF", cCustomFormat)

    nRowFrom := 2
    nColFrom := 2
    nRowTo := 21
    nColTo := 3
    // Mescla intervalo B2:C21
    lRet := oXlsx:MergeCells(nRowFrom, nColFrom, nRowTo, nColTo)

    nRow := 2
    nCol := 2
    // Texto das células mescladas (apontando sempre para a primeira célula do intervalo)
    lRet := oXlsx:SetText(nRow, nCol, "Células Mescladas")

    lTop := .T.
    lBottom := .T.
    lLeft:= .F.
    lRight := .F.
    cStyle := FwXlsxBorderStyle():Medium()
    cColor := "0000FF"
    // Borda azul, superior e inferior
    lRet := oXlsx:SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .T.
    nRotation := 0
    cCustomFormat := ""
    // Seta texto texto com quebra de linha
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 24
    nCol := 2
    // Texto da célula com borda
    lRet := oXlsx:SetText(nRow, nCol, "Texto com quebra de linha")

    nRowFrom := 26
    nRowTo := 30
    nHeight := 18.75
    // Altura 18,75 nas linhas 26 a 30
    lRet := oXlsx:SetRowsHeight(nRowFrom, nRowTo, nHeight)
    // Largura 23,71
    lRet := oXlsx:SetColumnsWidth(5, 10, 23.71)

    lRet := oXlsx:ResetBorder()
    // Limpa o formato
    lRet := oXlsx:ResetCellsFormat()

    // Nova planilha
    // Pequena planilha para testar o AutoFiltro
    lRet := oXlsx:AddSheet("AutoFiltro")

    jFontHeader := FwXlsxPrinterConfig():MakeFont()
    jFontHeader['font'] := FwPrinterFont():TimesNewRoman()
    jFontHeader['size'] := 15
    jFontHeader['bold'] := .T.
    jFontHeader['underline'] := .T.

    jFontNum := FwXlsxPrinterConfig():MakeFont()
    jFontNum['font'] := FwPrinterFont():CourierNew()
    jFontNum['size'] := 12

    jFontText := FwXlsxPrinterConfig():MakeFont()
    jFontText['font'] := FwPrinterFont():ArialBlack()
    jFontText['size'] := 12
    jFontText['italic'] := .T.

    jFormat := FwXlsxPrinterConfig():MakeFormat()
    jFormat['hor_align'] := oCellHorAlign:Center()
    jFormat['vert_align'] := oCellVertAlign:Center()

    // Bordas para o header
    jBorderHeader := FwXlsxPrinterConfig():MakeBorder()
    jBorderHeader['top'] := .T.
    jBorderHeader['bottom'] := .T.
    jBorderHeader['border_color'] := "B1B1B1"
    jBorderHeader['style'] := FwXlsxBorderStyle():Double()

    jBorderLeft := FwXlsxPrinterConfig():MakeBorder()
    jBorderLeft['left'] := .T.
    jBorderLeft['border_color'] := "FF0000"
    jBorderLeft['style'] := FwXlsxBorderStyle():Dashed()
    
    jBorderCenter := FwXlsxPrinterConfig():MakeBorder()
    jBorderCenter['left'] := .T.
    jBorderCenter['right'] := .T.
    jBorderCenter['border_color'] := "00FF00"
    jBorderCenter['style'] := FwXlsxBorderStyle():Dashed()
    
    jBorderRight := FwXlsxPrinterConfig():MakeBorder()
    jBorderRight['right'] := .T.
    jBorderRight['border_color'] := "0000FF"
    jBorderRight['style'] := FwXlsxBorderStyle():Dashed()

    // formatação para todas as células a seguir
    lRet := oXlsx:SetCellsFormatConfig(jFormat)

    // fonte e borda para o cabeçalho
    lRet := oXlsx:SetFontConfig(jFontHeader)
    lRet := oXlsx:SetBorderConfig(jBorderHeader)
    lRet := oXlsx:SetValue(1, 2, "Produto") // A1
    lRet := oXlsx:SetValue(1, 3, "Mês")
    lRet := oXlsx:SetValue(1, 4, "Total")

    // fonte e borda para coluna esquerda
    lRet := oXlsx:SetFontConfig(jFontNum)
    lRet := oXlsx:SetBorderConfig(jBorderLeft)
    lRet := oXlsx:SetValue(2, 2, 1)
    lRet := oXlsx:SetValue(3, 2, 1)
    lRet := oXlsx:SetValue(4, 2, 2)
    lRet := oXlsx:SetValue(5, 2, 2)
    lRet := oXlsx:SetValue(6, 2, 3)
    lRet := oXlsx:SetValue(7, 2, 3)
    
    // fonte e borda para coluna central
    lRet := oXlsx:SetFontConfig(jFontText)
    lRet := oXlsx:SetBorderConfig(jBorderCenter)
    lRet := oXlsx:SetValue(2, 3, "Janeiro")
    lRet := oXlsx:SetValue(3, 3, "Março")
    lRet := oXlsx:SetValue(4, 3, "Janeiro")
    lRet := oXlsx:SetValue(5, 3, "Março")
    lRet := oXlsx:SetValue(6, 3, "Fevereiro")
    lRet := oXlsx:SetValue(7, 3, "Março")

	// fonte e borda para coluna central
    jFormat['custom_format'] := "#,##0.00"
    lRet := oXlsx:SetCellsFormatConfig(jFormat)
    lRet := oXlsx:SetFontConfig(jFontNum)
    lRet := oXlsx:SetBorderConfig(jBorderRight)
    lRet := oXlsx:SetValue(2, 4, 1100.10)
    lRet := oXlsx:SetValue(3, 4, 1150)
    lRet := oXlsx:SetValue(4, 4, 1200.22)
    lRet := oXlsx:SetValue(5, 4, 1150)
    lRet := oXlsx:SetValue(6, 4, 1100.14)
    lRet := oXlsx:SetValue(7, 4, 1100) // C7

    // Aplica auto filtro no intervalo A1:C7
    lRet := oXlsx:ApplyAutoFilter(1,1,7,3)

    lRet := oXlsx:toXlsx()

return


Templatedocumentos


HTML
<style>
div.theme-default .ia-splitter #main {
    margin-left: 0px;
}
.ia-fixed-sidebar, .ia-splitter-left {
    display: none;
}
#main {
    padding-left: 10px;
    padding-right: 10px;
    overflow-x: hidden;
}

.aui-header-primary .aui-nav,  .aui-page-panel {
    margin-left: 0px !important;
}
.aui-header-primary .aui-nav {
    margin-left: 0px !important;
}

.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item.active-tab a::after { 
	background: #FF9900; !important 
}

.menu-item.active-tab { 
	border-bottom: none !important; 
}

</style>