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

  Caso seja utilizada versão anterior será lançada uma exceção

Expandir
titleExceção
Image Added


Sem Formato
languagecpp
titleExceção
THREAD ERROR ([92092], izac.ciszevski, SPON019400005)   30/09/2020 16:22:46
erro no parâmetro FwPrinterXlsx: Versão da printer.exe não suporta a geração de arquivos .xlsx. on FWPRINTERXLSX:ACTIVATE(FWPRINTERXLSX.TLPP) 25/09/2020 18:06:04 line : 140

Obs.: O binário da printer precisa estar atualizado no servidor e também no cliente, pois conforme condições, a impressão pode utilizar um ou outro.

Aviso

Classe disponível na lib com label igual ou superior a 20201009 e release igual ou superior a 12.1.23

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

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:

Nome

Tipo

Obrigatório

Default

Referência

Descrição

cFile
lDelBase
caractere
Lógico
xcaminho do arquivo para o .rel e .xlsx finaloFileobjetoobjeto FwFileWriter()xobjeto para realizar a escrita dos comandos no arquivo base

.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
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 indicação 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 com os parâmetros distribuídos.

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

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()

Atribui 

SetRowsHeight()

SetCellsFormat()

ResetCellsFormat()

SetCellsFormatConfig()

MergeCells()

SetBorder()

ResetBorder()

SetBorderConfig()

ApplyFormat()

AddSheet()

SetValue()

SetText()

SetNumber()

SetFormula()

SetDate()

SetDateTime()

SetHyperlink()

SetBoolean()

AddImageFromBuffer()

UseImageFromBuffer()

AddImageFromAbsolutePath()

ApplyAutoFilter()

Exemplos

Uso simples

O exemplo a seguir mostra como gerar uma planilha simples.

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
xValuecaractere | data | lógico | numéricox

valor para atribuição de algum 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

texto 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

número 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

fórmula 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

data 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 formatado para atribuição
ver: FwXlsxDateFormat():toPrinterFormat()

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

url ou hiperlink para o documento 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 lógico para atribuição

AddImageFromBuffer()

Adiciona uma imagem para a planilha a partir de uma string contendo os bytes da imagem (buffer).

O tamanho da imagem está limitado à 999.999 bytes (aproximadamente 976Kb), caso a imagem ultrapasse este tamanho é necessário informar o endereço de diretório absoluto para a imagem com o método AddImageFromAbsolutePath.

Apesar de receber a indicação de célula (linha e coluna) a renderização das imagens no arquivo gerado não será reduzida ao tamanho da célula. A imagem será exibida em seu tamanho original, podendo ser indicado os novos valores em pixels para a largura e altura com os parâmetros nWidthResize e nHeightResize.

Sintaxe: FwPrinterXlsx():AddImageFromBuffer(nRow, nCol, cImageId, cBuffer, nWidthResize, nHeightResize) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para início da exibição da imagem
nColnuméricox

coluna da célula para início da exibição da imagem
cImageIdcaracterex

id da imagem para referências futuras com o método UseImageFromBuffer
cBuffercaracterex

string com o buffer da imagem
nWidthResizenumérico
0
nova largura para a imagem
nHeightResizenumérico
0
nova altura para a imagem
Informações

Um ponto de atenção é a configuração do limite para o tamanho de strings no Appserver e no Smartclient, pois a leitura de arquivo de imagens pode facilmente exceder os limites configurados.

Exemplo:

Bloco de código
cImgRel := 'logo'

nHndImagem:= fOpen(cImgDir, FO_READ)
nLenImagem := 0

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

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

UseImageFromBuffer()

Usa uma imagem já adicionada à planilha através do método AddImageFromBuffer anteriormente no arquivo.

Sintaxe: FwPrinterXlsx():UseImageFromBuffer(nRow, nCol, cImageId, nWidthResize, nHeightResize) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para início da exibição da imagem
nColnuméricox

coluna da célula para início da exibição da imagem
cImageIdcaracterex

id da imagem adicionada por buffer anteriormente
nWidthResizenumérico
0
nova largura para a imagem
nHeightResizenumérico
0
nova altura para a imagem

Exemplo:

Bloco de código
cImgId := 'id_de_imagem_adicionada_por_buffer'
lRet := oPrtXlsx:UseImageFromBuffer(20, 8, cImgId, 114, 33)

AddImageFromAbsolutePath()

Adiciona uma imagem à planilha a partir de um endereço de diretório absoluto.

Este método tem seu resultado influenciado pelo local/endereço de geração do arquivo base .rel. Os comportamentos possíveis são:

  1. Quando o arquivo é gerado no servidor (/spool/, /system/ ou qualquer outro diretório no rootpath) o endereço absoluto da imagem precisa ser desde a unidade do disco local do servidor. Por exemplo, com o .rel no endereço /planilhas/arquivo.rel a imagem precisa ser em e:\totvs\protheus\protheus_data\minhas_imagens\imagem_que_quero_usar.png ou l:/opt/totvs/protheus/protheus_data/minhas_imagens/imagem_que_quero_user.png.
  2. Quando o arquivo .rel é gerado local (endereço do cliente/terminal/smartclient) o endereço absoluto da imagem precisa ser a partir do disco local da máquina cliente. Por exemplo, com o .rel no endereço c:\planilhas\minha_planilha.rel a imagem precisa estar em um diretório acessível pela máquina cliente como c:\temporários\imagens\imagem.png.

Sintaxe: FwPrinterXlsx():AddImageFromAbsolutePath(nRow, nCol, cImgPath, nWidthResize, nHeightResize) → lRet

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

linha da célula para início da exibição da imagem
nColnuméricox

coluna da célula para início da exibição da imagem
cImgPathcaracterex

diretório absoluto da imagem
nWidthResizenumérico
0
nova largura para a imagem
nHeightResizenumérico
0
nova altura para a imagem

Exemplo:

Bloco de código
// usando imagem no server no mesmo endereço do .rel
cRootPath := 'C:\Especif\Protheus12\sistemico\protheus_data_27'
cPath := "\spool\"  // /spool/ para uma geração no server

cArquivo := cPath + "base_planilha.rel"
cImgDir := cRootPath + cPath + 'protheus_logo.png'

lRet := oXlsx:Activate(cArquivo)

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

// usando imagem no cliente/local no mesmo endereço do .rel
cPath := GetClientDir() // diretório do smartclient

cArquivo := cPath + "base_planilha.rel"
cImgDir := cPath + "protheus_logo.png"

lRet := oXlsx:Activate(cArquivo)

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

ApplyAutoFilter()

Aplica um auto filtro no conjunto de células da matriz (de célula até célula).

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

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRowFromnuméricox

linha da célula inicial (superior esquerda)
nColFromnuméricox

coluna da célula inicial (superior esquerda)
nRowTonuméricox

linha da célula final (inferior direita)
nColTonuméricox

coluna da célula final (inferior direita)

Exemplo:

Bloco de código
languagecpp
// Aplica auto filtro no intervalo A1:C7
lRet := oXlsx:ApplyAutoFilter(1,1,7,3)

SetVerticalBarCodeContent()

Adiciona um código de barras vertical.

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

Parâmetros:

NomeTipoObrigatórioDefaultReferênciaDescrição
nRownuméricox

posição de linha da célula para atribuição
nColnuméricox

posição de coluna da célula para atribuição
cContentcaracterex

conteúdo para a montagem do código de barras

Exemplo:

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

Outros códigos de barras

Os demais códigos de barras suportados são indicados a seguir. Estes são atribuições de conteúdos do tipo texto com fontes e valores específicos a cada um dos tipos. 

Como a atribuição é do tipo texto, o controle da fonte fica sob responsabilidade do programa que está usando a FwPrinterXlsx.

Code128

Possui as fontes Code128b e Code128c como opções para a impressão do código de barras.

Exemplo:

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

nRow := 2
nCol := 13
// Texto para o código de barras Code128
lRet := oPrtXlsx:SetText(nRow, nCol, "Ò,BX'hÓ")


QrCode

Possui a fonte QrCode disponível para uso.

Exemplo:

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

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


DataMatrix

Possui a fonte Datamatrix disponível para uso.

Exemplo:

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


SetTypeDisplayLineGrid

Informa o tipo de visualização de linhas do grid, esse método está disponível na lib 20231009

Exemplo:

Bloco de código
languagecpp
lRet := oPrtXlsx:SetTypeDisplayLineGrid( totvs.framework.xlsx.LinesGridDisplay():getHideAll() )


GetStatusPrinter

Retorna o status da printer sobre a geração do XLSX, esse método está disponível na lib 20231009. Esse status não deve ser utilizado para validar a geração bem sucedida do XLSX.

Exemplo:

Bloco de código
languagecpp
nStatus := oPrtXlsx:GetStatusPrinter()


PDF417

Possui a fonte pdf417 disponível para uso.

Exemplo:

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

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 oPrtXlsx as object
    local cFilename as character
    // local oFileW as object
    local lRet as logical

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

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

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

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

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

    oPrtXlsx: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()
    // Antes de rodar este programa coloque uma imagem válida nos diretórios mencionados a seguir
    // ou indique um caminho válido para uma imagem
    local cRootPath := 'C:\Especif\Protheus12\sistemico\protheus_data_27'
    local cPath := "\spool\"  // /spool/ para uma geração no server
    local cArquivo := cPath + "exemplo.rel"
    local cImgRel := 'logo'
    local cImgDir := cRootPath + cPath + 'protheus_logo.png'

    local cBuffer:= ""

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

    local nHndImagem := 0
    local nLenImagem := 0
    local jFontHeader
    local jFontNum
    local jFontText
    local jBorderHeader
    local jBorderLeft
    local jBorderCenter
    local jBorderRight
    local jFormat

    lRet := oPrtXlsx:Activate(cArquivo, oFileW)

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

    // Atenção, antes de remover os comentários dos comandos a seguir
    // confira o endereço para a imagem
    // nHndImagem := fOpen(cImgDir, FO_READ)
    // 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 := oPrtXlsx:AddImageFromBuffer(5, 8, cImgRel, cBuffer, 0, 0)
    // lRet := oPrtXlsx:AddImageFromAbsolutePath(10, 8, cImgDir, 200, 100)
    // lRet := oPrtXlsx:UseImageFromBuffer(20, 8, cImgRel, 114, 33
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)

    // oFileWcFont := FwFileWriterFwPrinterFont():NewgetFromName(cFilename"Calibri")
    oXlsxcFont := FwPrinterXlsxFwPrinterFont():NewCalibri()

    //nSize lRet := oXlsx:Activate(cFilename, oFileW)14
    lItalic := .T.
    lRetlBold := oXlsx:Activate(cFilename)
.T.
    lRetlUnderlined := oXlsx:AddSheet("1 - Plan")

    lRet := oXlsx:SetText(1, 1, "Valor na célula") .T.
    // Comando 'Fonte' com Calibri 14, itálico, negrito e sublinhado
    lRet := oXlsxoPrtXlsx: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"

function u_fwprtxlsx()
    classeSetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    cHorAlignment := oCellHorAlign:Default()
    alert('terminou')
return

static function classe() cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    local cRootPathnRotation := 0
    // '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'Comando 'Formato de Célula' com cor de texto e fundo personalizadas
    lRet := oPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF0000", "C0C0C0", "" )

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

    localnRow cBuffer:= ""1

    local lRetnCol := .F.1
    local oFileW := FwFileWriter():New(cArquivo)// Texto em A1
    local oXlsxlRet := FwPrinterXlsx()oPrtXlsx:New()SetText(nRow, nCol, "Texto na célula")

    local// oCellHorAligncFont := FwXlsxCellAlignmentFwPrinterFont():HorizontalgetFromName("Calibri")
    local oCellVertAligncFont := FwXlsxCellAlignmentFwPrinterFont():VerticalCalibri()

    localnSize nHndImagem:= fOpen(cImgDir, FO_READ)11
    locallItalic nLenImagem := 0

    if nHndImagem < 0
        return MsgStop("Não foi possível abrir " + cImgDir)
    endIf
.F.
    lBold := .F.
    nLenImagemlUnderlined := fSeek( nHndImagem, 0, FS_END)
    fSeek( nHndImagem, 0, FS_SET)
    fRead( nHndImagem, @cBuffer, nLenImagem.F.
    // Calibri 11
    lRet := oPrtXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    lRet := oXlsxoPrtXlsx:ActivateResetCellsFormat(cArquivo, oFileW)

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

 2
    nCol := 1
    lRet := oXlsxoPrtXlsx:AddImageFromBufferSetText(5nRow, 8nCol, cImgRel, cBuffer, 0, 0"00123")

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

 3
    nCol := 1
    // Número 008
    lRet := oXlsxoPrtXlsx:UseImageFromBufferSetNumber(20nRow, 8nCol, cImgRel, 114, 338)

    //nRow cFont := FwPrinterFont():getFromName("Calibri")4
    cFontnCol := FwPrinterFont():Calibri()1
    nSize// :=Número 1404
    lItaliclRet := .T. oPrtXlsx:SetNumber(nRow, nCol, 4)

    lBoldnRow := .T.5
    lUnderlinednCol := .T.1
    // ComandoFórmula 'Fonte'que comsoma Calibrios 14,dois itálico, negrito e sublinhadonúmeros anteriores
    lRet := oXlsxoPrtXlsx:SetFontSetFormula(cFontnRow, nSize, lItalic, lBold, lUnderlinednCol, "=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 := oXlsxoPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF0000000000", "C0C0C0FFFFFF", "" cCustomFormat)

    nColFromnRow := 14
    nColTonCol := 52
    nWidth := 24// Número com formato customizado (123.123.123)
    lRet := oXlsxoPrtXlsx:SetColumnsWidthSetNumber(nColFromnRow, nColTonCol, nWidth123123123)

    nRowcHorAlignment := 1oCellHorAlign:Default()
    nColcVertAlignment := 1oCellVertAlign:Default()
    //lWrapText Texto em A1:= .F.
    lRetnRotation := oXlsx:SetText(nRow, nCol, "Texto na célula")

 0
    cCustomFormat := "0.00%"
    // cFont := FwPrinterFont():getFromName("Calibri")
    cFont := FwPrinterFont():Calibri()Comando 'Formato de Célula' com cor de texto e fundo personalizadas
    nSizelRet := 11
    lItalic := .F.oPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    lBoldnRow := .F.4
    lUnderlinednCol := .F.3
    // Calibri 11 Número com formato customizado (4,27%)
    lRet := oXlsxoPrtXlsx:SetFontSetNumber(cFontnRow, nSizenCol, lItalic, lBold, lUnderlined0.0427)

    lRetcHorAlignment := oXlsxoCellHorAlign:ResetCellsFormatDefault()

    nRowcVertAlignment := 2
    nCol := 1oCellVertAlign:Default()
    lRetlWrapText := oXlsx:SetText(nRow, nCol, "00123")

.F.
    nRownRotation := 30
    nColcCustomFormat := 1 "R$ #,##0.00;[Red]-R$ #,##0.00"
    // Número 008 Seta formato numérico R$ #,##0.00;[Red]-R$ #,##0.00
    lRet := oXlsxoPrtXlsx:SetNumber(nRow, nCol, 8SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 4
    nCol := 14
    // Número 04 com formato customizado (R$ 1234,56)
    lRet := oXlsxoPrtXlsx:SetNumber(nRow, nCol, 41234.56)

    nRow := 54
    nCol := 15
    // FórmulaNúmero quecom somaformato os dois números anteriorescustomizado (R$ 1234,56)
    lRet := oXlsxoPrtXlsx:SetFormulaSetNumber(nRow, nCol, "=SUM(A3:A4)"-1234.56)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "#,##0dd/mm/yyyy"
    // ComandoSeta 'Formatoformato de Célula' com cor de texto e fundo personalizadasdata dd/mm/yyyy
    lRet := oXlsxoPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    nRow := 46
    nCol := 1
    dValue := 2STOD("20190823")
    // Número com formato customizado (123.123.123)Data "ano, mês, dia, hora, minuto, segundo" no padrão: yyyy,mm,dd,hh,mm,ss.sss
    lRet := oXlsxoPrtXlsx:SetNumberSetDate(nRow, nCol, 123123123dValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "0.00%hh:mm"
    // ComandoSeta 'Formatoformato de Célula' com cor de texto e fundo personalizadashora hh:mm
    lRet := oXlsxoPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)
 "FFFFFF", cCustomFormat)

    nRow := 6
    nCol := 2
    oPrtXlsxDate := FwXlsxDateFormat():New()
    oPrtXlsxDate:SetHour("17")
    nRow := 4oPrtXlsxDate:SetMinute("55")
    nColcValue := 3oPrtXlsxDate:toPrinterFormat()
    // Número com formato customizado (4,27%)17:55
    lRet := oXlsxoPrtXlsx:SetNumberSetDateTime(nRow, nCol, 0.0427cValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    lWrapText := .F.
    nRotation := 0
    cCustomFormat := "R$ #,##0.00;[Red]-R$ #,##0.00dd/mm/yy hh:mm:ss.000"
    // Seta formato numérico R$ #,##0.00;[Red]-R$ #,##0.00de data e hora dd/mm/yy hh:mm:ss.000
    lRet := oXlsxoPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)
 cCustomFormat)

    nRow := 6
    nCol := 3
    oPrtXlsxDate := FwXlsxDateFormat():New()
    oPrtXlsxDate:SetYear("2019")
    oPrtXlsxDate:SetMonth("8")
    oPrtXlsxDate:SetDay("23")
    oPrtXlsxDate:SetHour("17")
    oPrtXlsxDate:SetMinute("55")
    nRow := 4oPrtXlsxDate:SetSeconds("43.123")
    nColcValue := 4oPrtXlsxDate:toPrinterFormat()
    // Númerodata come formato customizado (R$ 1234,56)hora completas
    lRet := oXlsxoPrtXlsx:SetNumberSetDateTime(nRow, nCol, 1234.56cValue)

    nRow := 46
    nCol := 54
    // Número com formato customizado (R$ 1234,56oPrtXlsxDate := FwXlsxDateFormat():New()
    oPrtXlsxDate:SetYear("2019")
    lRet := oXlsx:SetNumber(nRow, nCol, -1234.56)
oPrtXlsxDate:SetMonth("8")
    oPrtXlsxDate:SetDay("23")
    cHorAlignment := oCellHorAlign:Default(oPrtXlsxDate:SetHour("17")
    cVertAlignment := oCellVertAlign:Default(oPrtXlsxDate:SetMinute("55")
    lWrapText := .F.oPrtXlsxDate:SetSeconds("43.123")
    nRotationcValue := 0
    cCustomFormat := "dd/mm/yyyy"oPrtXlsxDate:toPrinterFormat()
    // Setadata formatoe de data dd/mm/yyyyhora completas
    lRet := oXlsxoPrtXlsx:SetCellsFormatSetDateTime(cHorAlignmentnRow, cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)
nCol, cValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()
    nRowlWrapText := 6.F.
    nColnRotation := 10
    dValuecCustomFormat := STOD("20190823mmm-yyyy")
    // DataSeta "ano, mês, dia, hora, minuto, segundo" no padrão: yyyy,mm,dd,hh,mm,ss.sssformato de data mmm-yyyy
    lRet := oXlsxoPrtXlsx:SetDateSetCellsFormat(nRowcHorAlignment, nColcVertAlignment, dValue)

    cHorAlignment := oCellHorAlign:Default()
    cVertAlignment := oCellVertAlign:Default()lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

    lWrapTextnRow := .F.6
    nRotationnCol := 05
    cCustomFormatdValue := STOD("hh:mm20190823")
    // Data Seta formato de hora hh:mm"ano, mês, dia, hora, minuto, segundo" no padrão: yyyy,mm,dd,hh,mm,ss.sss
    lRet := oXlsxoPrtXlsx:SetCellsFormatSetDate(cHorAlignmentnRow, cVertAlignmentnCol, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormatdValue)

    nRow// cFont := 6FwPrinterFont():getFromName("Calibri")
    nColcFont := 2FwPrinterFont():Calibri()
    oXlsxDatenSize := FwXlsxDateFormat():New()
11
    lItalic oXlsxDate:SetHour("17")
:= .F.
    lBold oXlsxDate:SetMinute("55"):= .F.
    cValuelUnderlined := oXlsxDate:toPrinterFormat().T.
    // 17:55 Calibri sublinhada para url
    lRet := oXlsxoPrtXlsx:SetDateTime(nRowSetFont(cFont, nSize, lItalic, nCollBold, cValuelUnderlined)

    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.000com texto azul
    lRet := oXlsxoPrtXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "0000000000FF", "FFFFFF", cCustomFormat)

    nRow := 67
    nCol := 31
    oXlsxDate := FwXlsxDateFormat():New()
// url
    lRet oXlsxDate:SetYear("2019")
    oXlsxDate:SetMonth("8")
    oXlsxDate:SetDay("23")
    oXlsxDate:SetHour("17")
    oXlsxDate:SetMinute("55")
    oXlsxDate:SetSeconds("43.123"):= oPrtXlsx:SetHyperlink(nRow, nCol, "http://www.totvs.com.br")

    nRow := 8
    cValuenCol := oXlsxDate:toPrinterFormat()1
    // data e hora completasurl
    lRet := oXlsxoPrtXlsx:SetDateTimeSetHyperlink(nRow, nCol, cValue"http://www.google.com")

    // nRowTexto :=de 6
exibição da url inserida nColno :=comando 4anterior
    oXlsxDatelRet := FwXlsxDateFormat()oPrtXlsx:New()SetText(nRow, nCol, "Google")

    oXlsxDate:SetYear("2019")
nRow := 9
    nCol oXlsxDate:SetMonth("8"):= 1
    oXlsxDate:SetDay("23")
    oXlsxDate:SetHour("17")
    oXlsxDate:SetMinute("55")
    oXlsxDate:SetSeconds("43.123")// URIs locais são suportadas para referências
    lRet := oPrtXlsx:SetHyperlink(nRow, nCol, "internal:'Minha Plan1'!A2")

    nRow := 10
    cValuenCol := oXlsxDate:toPrinterFormat()1
    // URIs locais datasão esuportadas horapara completasreferências
    lRet := oXlsxoPrtXlsx:SetDateTimeSetHyperlink(nRow, nCol, cValue)
"internal:'Minha Plan2'!B2")

    // cFont := FwPrinterFont():getFromName("Calibri")
    cHorAlignmentcFont := oCellHorAlignFwPrinterFont():DefaultCalibri()
    cVertAlignmentnSize := oCellVertAlign:Default()11
    lWrapTextlItalic := .F.
    nRotationlBold := 0.F.
    cCustomFormatlUnderlined := "mmm-yyyy".F.
    // Seta formato de data mmm-yyyyCalibri 11
    lRet := oXlsxoPrtXlsx:SetCellsFormatSetFont(cHorAlignmentcFont, cVertAlignmentnSize, lWrapTextlItalic, nRotation, "000000", "FFFFFF", cCustomFormatlBold, lUnderlined)

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

    nRow := 611
    nCol := 5
    dValue := STOD("20190823")2
    // Data "ano, mês, dia, hora, minuto, segundo" no padrão: yyyy,mm,dd,hh,mm,ss.ssslógico
    lRet := oXlsxoPrtXlsx:SetDateSetBoolean(nRow, nCol, dValue.F.)

    //cHorAlignment cFont := FwPrinterFont()oCellHorAlign:getFromNameFill("Calibri")
    cFont := FwPrinterFont():Calibri()
    nSizecVertAlignment := 11oCellVertAlign:Justify()
    lItaliclWrapText := .FT.
    lBoldnRotation := .F.0
    lUnderlinedcCustomFormat := .T.""
    // Calibri sublinhada para urlFormato
    lRet := oXlsxoPrtXlsx:SetFont(cFontSetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nSizenRotation, lItalic"FF00FF", lBold"808080", lUnderlinedcCustomFormat)

    cHorAlignmentlTop := oCellHorAlign:Default().T.
    cVertAlignmentlBottom := oCellVertAlign:Default() .T.
    lLeft:= .T.
    lWrapTextlRight := .FT.
    nRotationcStyle := 0FwXlsxBorderStyle():DashDot()
    cCustomFormatcColor := "008000"
    // Seta formato com texto azulBorda
    lRet := oXlsxoPrtXlsx:SetCellsFormatSetBorder(cHorAlignmentlLeft, cVertAlignmentlTop, lWrapTextlRight, nRotationlBottom, "0000FF"cStyle, "FFFFFF", cCustomFormatcColor)

    nRow := 712
    nCol := 1
    // url blank - Usado somente para aplicar a formatação
    lRet := oXlsxoPrtXlsx:SetHyperlinkApplyFormat(nRow, nCol, "http://www.totvs.com.br")

    nRow := 812
    nCol := 12
    // url blank - Usado somente para aplicar a formatação
    lRet := oXlsxoPrtXlsx:SetHyperlinkApplyFormat(nRow, nCol, "http://www.google.com")

    // cFont := FwPrinterFont():getFromName('code128b')
    //cFont Texto de exibição da url inserida no comando anterior:= FwPrinterFont():Code128b()
    nSize := 50
    lRetlItalic := oXlsx:SetText(nRow, nCol, "Google")
.F.
    nRowlBold := 9.F.
    nCollUnderlined := 1.F.
    // Fonte URIsCode locais128 são(para suportadascódigo parade referênciasbarras)
    lRet := oXlsxoPrtXlsx:SetHyperlink(nRowSetFont(cFont, nSize, nCollItalic, "internal:'Minha Plan1'!A2"lBold, lUnderlined)

    nRow := 102
    nCol := 113
    // Texto URIspara locaiso sãocódigo suportadasde parabarras referênciasCode128
    lRet := oXlsxoPrtXlsx:SetHyperlinkSetText(nRow, nCol, "internal:'Minha Plan2'!B2Ò,BX'hÓ")

    // cFont := FwPrinterFont():getFromName("Calibri"'qrcode')
    cFont := FwPrinterFont():CalibriQrCode()
    nSize := 1150
    lItalic := .F.
    lBold := .F.
    lUnderlined := .F.
    // Calibri 11 Fonte QRCode (para código de barras 2D)
    lRet := oXlsxoPrtXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

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

    nRow := 116
    nCol := 213
    // lógico Texto para o código de barras QRCode
    lRet := oXlsxoPrtXlsx:SetBooleanSetText(nRow, nCol, .F. "QRCode gerado para o Excel")

    cHorAlignment// cFont := oCellHorAlignFwPrinterFont():FillgetFromName('datamatrix')
    cVertAlignmentcFont := oCellVertAlignFwPrinterFont():JustifyDataMatrix()
    nSize := 50
    lWrapTextlItalic := .TF.
    nRotationlBold := 0.F.
    cCustomFormatlUnderlined := "".F.
    // Formato Fonte DataMatrix (para código de barras 2D)
    lRet := oXlsx:SetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nRotation, "FF00FF", "808080", cCustomFormat oPrtXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)

    lTopnRow := .T.11
    lBottomnCol := .T.
    lLeft:= .T.13
    // Texto para o código de barras Datamatrix
    lRightlRet := .T.oPrtXlsx:SetText(nRow, nCol, "Datamatrix gerado para o Excel")

    cStyle// cFont := FwXlsxBorderStyleFwPrinterFont():DashDotgetFromName('PDF417')
    cColorcFont := "008000"
    // BordaFwPrinterFont():PDF417()
    lRetnSize := oXlsx:SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)

 300
    lItalic := .T.
    nRowlBold := 12.F.
    nCollUnderlined := 1.F.
    // blankFonte -PDF417 Usado(para somentecódigo parade aplicar a formataçãobarras 2D)
    lRet := oXlsxoPrtXlsx:ApplyFormat(nRowSetFont(cFont, nSize, lItalic, nCollBold, ""lUnderlined)

    nRow := 1216
    nCol := 213
    // blank - Usado somenteTexto para aplicar a formatação ??? o quecódigo acontece quando tem valor ???de barras PDF417
    lRet := oXlsxoPrtXlsx:ApplyFormatSetText(nRow, nCol, "1PDF417 gerado para o Excel")

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

    nSizenRow := 5023
    lItalicnCol := .F.13
    lBoldcContent := .F."01005000000001001010111010001010111000111011101000101000111010111000101000111011100010101000111000101010111000111010"
    lUnderlinedlRet := .F. oPrtXlsx:SetVerticalBarCodeContent(nRow, nCol, cContent) // Comando 'Código de barra vertical'

    // Fonte Code 128 (para código de barrasNova página
    lRet := oPrtXlsx:AddSheet("Minha Plan2")

    cHorAlignment := oCellHorAlign:Center()
    lRetcVertAlignment := oXlsxoCellVertAlign:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)
Center()
    lWrapText := .F.
    nRownRotation := 2270
    nColcCustomFormat := 13""
    // Seta texto Textovermelho paracom oalinhamento códigohorizontal dee barrasvertical Code128centralizado (oe textocom érotação codificadode pelatexto FWMSPrinter)vertical
    lRet := oXlsxoPrtXlsx:SetTextSetCellsFormat(nRowcHorAlignment, nColcVertAlignment, "Ò,BX'hÓ")

    // cFont := FwPrinterFont():getFromName('qrcode')
    cFont := FwPrinterFont():QrCode()lWrapText, nRotation, "FF0000", "FFFFFF", cCustomFormat)

    nSizenRowFrom := 502
    lItalicnColFrom := .F.2
    lBoldnRowTo := .F.21
    lUnderlinednColTo := .F.3
    // FonteMescla QRCode (para código de barras 2D)intervalo B2:C21
    lRet := oXlsxoPrtXlsx:SetFontMergeCells(cFontnRowFrom, nSizenColFrom, lItalicnRowTo, lBold, lUnderlinednColTo)

    nRow := 62
    nCol := 13
    // Texto para o código de barras QRCode
    lRet := oXlsx:SetText(nRow, nCol, "QRCode gerado para o Excel")
 := 2
    // Texto cFont := FwPrinterFont():getFromName('datamatrix')
    cFont := FwPrinterFont():DataMatrix(das células mescladas (apontando sempre para a primeira célula do intervalo)
    nSizelRet := 50 oPrtXlsx:SetText(nRow, nCol, "Células Mescladas")

    lItaliclTop := .FT.
    lBoldlBottom := .FT.
    lUnderlined lLeft:= .F.
    // Fonte DataMatrix (para código de barras 2D)
    lRet := oXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlined)
lRight := .F.
    nRowcStyle := 11FwXlsxBorderStyle():Medium()
    nColcColor := 13"0000FF"
    // TextoBorda paraazul, osuperior código de barras Datamatrixe inferior
    lRet := oXlsxoPrtXlsx:SetTextSetBorder(nRowlLeft, nCollTop, "Datamatrix gerado para o Excel"lRight, lBottom, cStyle, cColor)

    //cHorAlignment cFont := FwPrinterFont()oCellHorAlign:getFromNameDefault('PDF417')
    cFontcVertAlignment := FwPrinterFont()oCellVertAlign:PDF417Default()
    nSizelWrapText := 300
    lItalic := .T.
    lBoldnRotation := .F.0
    lUnderlinedcCustomFormat := .F.""
    // Seta Fontetexto PDF417texto (paracom códigoquebra de barras 2D)linha
    lRet := oXlsxoPrtXlsx:SetFont(cFontSetCellsFormat(cHorAlignment, cVertAlignment, lWrapText, nSizenRotation, lItalic"000000", lBold"FFFFFF", lUnderlinedcCustomFormat)

    nRow := 1624
    nCol := 132
    // Texto parada océlula código de barras PDF417com borda
    lRet := oXlsxoPrtXlsx:SetText(nRow, nCol, "PDF417Texto geradocom paraquebra ode Excel")
linha")

    nRowFrom := 26
    nRowTo := 30
    nHeight := 18.75
    // cFont := FwPrinterFont():getFromName('calibri') Altura 18,75 nas linhas 26 a 30
    cFontlRet := FwPrinterFont()oPrtXlsx:Calibri(SetRowsHeight(nRowFrom, nRowTo, nHeight)
    nSize// := 11Largura 23,71
    lItaliclRet := .F.
    lBold := .F.oPrtXlsx:SetColumnsWidth(5, 10, 23.71)

    lUnderlinedlRet := .F.oPrtXlsx:ResetBorder()
    // Limpa Calibrio 11formato
    lRet := oXlsxoPrtXlsx:SetFont(cFont, nSize, lItalic, lBold, lUnderlinedResetCellsFormat()

    // Nova página planilha
    // Pequena planilha para testar o AutoFiltro
    lRet := oXlsxoPrtXlsx:AddSheet("Minha Plan2AutoFiltro")

    cHorAlignmentjFontHeader := oCellHorAlignFwXlsxPrinterConfig():CenterMakeFont()
    cVertAlignmentjFontHeader['font'] := oCellVertAlignFwPrinterFont():CenterTimesNewRoman()
    lWrapTextjFontHeader['size'] := .F.15
    nRotationjFontHeader['bold'] := 270
    cCustomFormat := ""
    // Seta texto vermelho com alinhamento horizontal e vertical centralizado e com rotação de texto vertical.T.
    jFontHeader['underline'] := .T.

    lRetjFontNum := oXlsxFwXlsxPrinterConfig():SetCellsFormatMakeFont(cHorAlignment,)
 cVertAlignment, lWrapText, nRotation, "FF0000", "FFFFFF", cCustomFormat)
 jFontNum['font'] := FwPrinterFont():CourierNew()
    nRowFromjFontNum['size'] := 212

    nColFromjFontText := 2FwXlsxPrinterConfig():MakeFont()
    nRowTojFontText['font'] := 21FwPrinterFont():ArialBlack()
    nColTojFontText['size'] := 312
    // Mescla intervalo B2:C21jFontText['italic'] := .T.

    lRetjFormat := oXlsxFwXlsxPrinterConfig():MergeCells(nRowFrom, nColFrom, nRowTo, nColTo)
MakeFormat()
    nRowjFormat['hor_align'] := 2oCellHorAlign:Center()
    nColjFormat['vert_align'] := 2oCellVertAlign:Center()

    // Texto das células mescladas (apontando sempreBordas para a primeira célula do intervalo)o header
    lRetjBorderHeader := oXlsx:SetText(nRow, nCol, "Células Mescladas")

    lTop := .T.FwXlsxPrinterConfig():MakeBorder()
    lBottomjBorderHeader['top'] := .T.
    jBorderHeader['bottom'] lLeft:= .FT.
    lRightjBorderHeader['border_color'] := .F."B1B1B1"
    cStylejBorderHeader['style'] := FwXlsxBorderStyle():MediumDouble()

    cColorjBorderLeft := "0000FF"FwXlsxPrinterConfig():MakeBorder()
    // Borda azul, superior e inferiorjBorderLeft['left'] := .T.
    lRet := oXlsx:SetBorder(lLeft, lTop, lRight, lBottom, cStyle, cColor)
jBorderLeft['border_color'] := "FF0000"
    cHorAlignmentjBorderLeft['style'] := oCellHorAlignFwXlsxBorderStyle():DefaultDashed()
    
    cVertAlignmentjBorderCenter := oCellVertAlignFwXlsxPrinterConfig():DefaultMakeBorder()
    lWrapTextjBorderCenter['left'] := .T.
    nRotationjBorderCenter['right'] := 0.T.
    cCustomFormatjBorderCenter['border_color'] := "00FF00"
    // Seta texto texto com quebra de linhajBorderCenter['style'] := FwXlsxBorderStyle():Dashed()
    
    lRetjBorderRight := oXlsxFwXlsxPrinterConfig():SetCellsFormatMakeBorder(cHorAlignment,)
 cVertAlignment, lWrapText, nRotation, "000000", "FFFFFF", cCustomFormat)

 jBorderRight['right'] := .T.
    nRowjBorderRight['border_color'] := 24"0000FF"
    nColjBorderRight['style'] := 2FwXlsxBorderStyle():Dashed()

    // formatação para Textotodas daas célulacélulas coma bordaseguir
    lRet := oXlsxoPrtXlsx:SetText(nRow, nCol, "Texto com quebra de linha")

SetCellsFormatConfig(jFormat)

    // fonte e borda para o cabeçalho
    nRowFromlRet := 26oPrtXlsx:SetFontConfig(jFontHeader)
    nRowTolRet := 30 oPrtXlsx:SetBorderConfig(jBorderHeader)
    nHeightlRet := 18.75
   oPrtXlsx:SetValue(1, 2, "Produto") // Altura 18,75 nas linhas 26 a 30A1
    lRet := oPrtXlsx:SetValue(1, 3, "Mês")
    lRet := oXlsxoPrtXlsx:SetRowsHeightSetValue(nRowFrom1, nRowTo4, nHeight"Total")

    // Largura 23,71 fonte e borda para coluna esquerda
    lRet := oXlsxoPrtXlsx:SetColumnsWidth(5, 10, 23.71)
SetFontConfig(jFontNum)
    lRet := oXlsxoPrtXlsx:ResetBorderSetBorderConfig()
    // Limpa o formatojBorderLeft)
    lRet := oXlsxoPrtXlsx:ResetCellsFormatSetValue()
2,    // Nova planilha2, 1)
    lRet := oXlsxoPrtXlsx:AddSheet("AutoFiltro")
SetValue(3, 2, 1)
    //lRet Pequena planilha para testar o AutoFiltro:= oPrtXlsx:SetValue(4, 2, 2)
    lRet := oXlsxoPrtXlsx:SetValue(15, 12, "Produto") // A12)
    lRet := oXlsxoPrtXlsx:SetValue(16, 2, "Mês"3)
    lRet := oXlsxoPrtXlsx:SetValue(17, 2, 3, "Total"))
    
    // fonte e borda para coluna central
    lRet := oXlsxoPrtXlsx:SetValue(2, 1, 1SetFontConfig(jFontText)
    lRet := oXlsxoPrtXlsx:SetValue(3, 1, 1SetBorderConfig(jBorderCenter)
    lRet := oXlsxoPrtXlsx:SetValue(42, 13, 2"Janeiro")
    lRet := oXlsxoPrtXlsx:SetValue(53, 13, 2"Março")
    lRet := oXlsxoPrtXlsx:SetValue(64, 13, 3"Janeiro")
    lRet := oXlsxoPrtXlsx:SetValue(75, 13, 3"Março")
    lRet := oXlsxoPrtXlsx:SetValue(26, 23, "JaneiroFevereiro")
    lRet := oXlsxoPrtXlsx:SetValue(37, 23, "Março")

// fonte e borda para coluna lRet := oXlsx:SetValue(4, 2, "Janeiro")central
    jFormat['custom_format'] := "#,##0.00"
    lRet := oXlsxoPrtXlsx:SetValue(5, 2, "Março"SetCellsFormatConfig(jFormat)
    lRet := oXlsxoPrtXlsx:SetValue(6, 2, "Fevereiro"SetFontConfig(jFontNum)
    lRet := oXlsxoPrtXlsx:SetValue(7, 2, "Março"SetBorderConfig(jBorderRight)
    lRet := oXlsxoPrtXlsx:SetValue(2, 34, 1001100.10)
    lRet := oXlsxoPrtXlsx:SetValue(3, 34, 1501150)
    lRet := oXlsxoPrtXlsx:SetValue(4, 34, 2001200.22)
    lRet := oXlsxoPrtXlsx:SetValue(5, 34, 1501150)
    lRet := oXlsxoPrtXlsx:SetValue(6, 34, 1001100.14)
    lRet := oXlsxoPrtXlsx:SetValue(7, 34, 1001100) // C7

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

    lRet := oXlsxoPrtXlsx: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>