OLE ActivePrinter: mudar a impressora no Excel

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Magnoman
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 09 Mai 2010 11:35
Localização: Maceió
Contato:

OLE ActivePrinter: mudar a impressora no Excel

Mensagem por Magnoman »

Prezados,

Estou quebrando a cabeça aqui para permitir que o usuário possa escolher qual impressora vai utilizar para imprimir no Excel utilizando OleAutomation.

O negócio é que o oExcel:ActivePrinter quer receber "nome da impressora" + " em " + "porta da impressora". Acontece que quando é uma impressora virtual tipo PDF o 2º item de GETPRINTERS(.T.) mostra a porta que aparece em PAINEL DE CONTROLE > IMPRESSORAS > PROPRIEDADES > PORTA, tudo bem, mas o Excel entende outra coisa nestes casos. Quando é LPT1: imprime. Por exemplo, no meu caso o PDFCREATOR aparece na porta PDFCREATOR: aí ficaria "PDFCreator em PDFCREATOR:", mas o Excel diz que está na porta "Ne00:" sendo "PDFCreator em Ne00:"...

Pesquisando a internet, descobri que, aparentemente, só podemos mudar a impressora no Excel utilizando o DialogPrinterSetup... Ótimo! Mas, como chamo isso?...

Já descobri que xlDialogPrinterSetup = 9. Então, tentei:
oExcel:xlBuiltInDialog := 9 // Nada
oExcel:Dialogs:SHOW(9) // Nada

Estou endoidando aqui :%
Por favor, me ajudem.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por Toledo »

Magnoman, veja este exemplo:

Código: Selecionar todos

FUNCTION MAIN()
LOCAL oExcel, oSheet 

oExcel := TOleAuto():New( "Excel.Application" )
oExcel:WorkBooks:Add()
oSheet := oExcel:Get( "ActiveSheet" )
oSheet:Name := "Aba 1"

oSheet:Cells( 1, 1 ):Value := "Codigo"
oSheet:Cells( 1, 2 ):Value := "Nome"

oExcel:ActivePrinter := "PDFCreator em Ne01:"
oSheet:PrintOut()
oExcel:Visible := .T.

Return Nil
Já testei e funcionou certinho!

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Magnoman
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 09 Mai 2010 11:35
Localização: Maceió
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por Magnoman »

Obrigado, mas eu quero que o usuário escolha uma das impressoras disponíveis instaladas.
Readequei o meu código pra demonstrar o que eu estou precisando, vejamos:

Código: Selecionar todos

aPRN   = GetPrinters()
aPORTA = GetPrinters(.T.) // [1][1] nome [1][2] porta

TRJANELA(11,20,15,60, "W+/BG",, lSOMBRA) // funcao propria
IF LEN(aPRN)>3
   @ 14,60 SAY "▼" COLOR "N/W"
ENDIF
@ 11,21 SAY PADC(' Escolha a impressora: ',39,"─") COLOR "W+/BG"
nPRN := 0
DO WHILE nPRN = 0
   nPrn:= ACHOICE(12,21,14,59,aPrn,.T.,,nPrn)
   IF nPRN = 0
      IF ( ALERT("ABORTA IMPRESSAO?", {"SIM","NAO"}) ) = 1
         RESTORE SCREEN FROM cSCREEN2
         RETURN ("-1")
      ENDIF
   ENDIF
ENDDO
IF !EMPTY(nPrn)  
  cPRN = aPRN[nPRN]
  cPORTA = aPORTA[nPRN][2]
ENDIF

oExcel:ActivePrinter := cPRN + " em " + cPORTA
O exemplo aí funciona direitinho quando a porta está correta, como LPT1: por exemplo. Mas, caso eu escolha o PDFCreator ele diz que está na porta PDFCREATOR: ao invés de Ne001:
O drama é esse! :'(
Quem busca aconselhamento encontra sabedoria.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por sygecom »

Não sei como o EXCEL tira essa informação, mas nas propriedades da impressora virtual PDFCREATOR diz que a porta é PDFCREATOR. Tentou com outras impressora como USB e por rede ?

Talve criar um IF para quando for PDFCREATOR mudar a porta para essa que o EXCEL aceita, é uma Ganbi mas até se achar um realexplicação.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por Itamar M. Lins Jr. »

Não ví todo o código, mas essa parte se a impressora for "for windows" não vai funcionar mesmo.
Somente via raw printer irá funcionar. Á classe win32prn funciona com qualuer impressora.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por rochinha »

Amiguinho,

Voce poderia chamar o PrinterSetup() diretamente pela propriedade do excel:

Código: Selecionar todos

oExcel:ActivePrinter := PrinterSetup()
Abaixo mais funcoes uteis:

Código: Selecionar todos

function IsPrint( QuePrinter )
   LOCAL nStatus
   DEFAULT QuePrinter := "LPT1:"
   nStatus := PrnStatus( QuePrinter )
   if     nStatus <        1 ; return "Impressora OK"
   elseif nStatus =        1 ; return "Impressora Pausada"
   elseif nStatus =        2 ; return "Impressora com Erro"
   elseif nStatus =        4 ; return "Impressora Deletando"
   elseif nStatus =        8 ; return "Impressora em Modo Bandeja"
   elseif nStatus =       16 ; return "Impressora Sem Papel"
   elseif nStatus =       32 ; return "Impressora em Modo Manual"
   elseif nStatus =       64 ; return "Impressora com Problema no Papel"
   elseif nStatus =      128 ; return "Impressora OffLine"
   elseif nStatus =      256 ; return "Impressora com IO Ativo"
   elseif nStatus =      512 ; return "Impressora Ocupada"
   elseif nStatus =     1024 ; return "Impressora Imprimindo"
   elseif nStatus =     2048 ; return "Impressora Memoria Lotada"
   elseif nStatus =     4096 ; return "Impressora Nao Instalada"
   elseif nStatus =     8192 ; return "Impressora Aguardando"
   elseif nStatus =    16384 ; return "Impressora Processando"
   elseif nStatus =    32768 ; return "Impressora Inicializando"
   elseif nStatus =    65536 ; return "Impressora em Atencao"
   elseif nStatus =   131072 ; return "Impressora Toner Baixo"
   elseif nStatus =   262144 ; return "Impressora Sem Toner"
   elseif nStatus =   524288 ; return "Impressora PAGE_PUNT"
   elseif nStatus =  1048576 ; return "Impressora Intervencao do Usuario"
   elseif nStatus =  2097152 ; return "Impressora Sem Memoria"
   elseif nStatus =  4194304 ; return "Impressora Tampa Aberta"
   elseif nStatus =  8388608 ; return "Impressora Servidor Desconhecido"
   elseif nStatus = 16777217 ; return "Impressora POWER_SAVE"
   endif

Function GetPrinters()
   Local aPrinter := {}
   Local cAllEntries
   Local cEntry
   Local nStart
   Local cName
   Local cPrn
   Local cPort
   Local nJ 
   cAllEntries := STRTRAN( GetProfString( "Devices" ), Chr( 0 ), CRLF )
   For nStart := 1 To MlCount( cAllEntries )
       cName := MemoLine( cAllEntries,,nStart)
       cEntry := GetProfString( "Devices",cName,"")
       nJ := 2
       Do While ! Empty(cPort := StrToken(cEntry,nJ++,","))
          Aadd(aPrinter,Trim(cName)+" , "+Trim(cPort))
       EndDo
   Next
   Return(aPrinter)

Function GetPrinterPort( QuePrinter )
   Local aPrinter := {}
   Local cAllEntries
   Local cEntry
   Local nStart
   Local cName
   Local cPrn
   Local cPort
   Local nJ 
   cAllEntries := STRTRAN( GetProfString( "Devices" ), Chr( 0 ), CRLF )
   For nStart := 1 To MlCount( cAllEntries )
       cName := MemoLine( cAllEntries,,nStart)
       cEntry := GetProfString( "Devices",cName,"")
       nJ := 2
       Do While ! Empty(cPort := StrToken(cEntry,nJ++,","))
          if Trim(cName) == QuePrinter
             Return Trim(cPort)
             exit
          endif
       EndDo
   Next
   Return ""
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Magnoman
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 09 Mai 2010 11:35
Localização: Maceió
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por Magnoman »

Era esse 1º código aí do PrinterSetup() que eu estava querendo saber como é!
Esse segundo código aí tem 3 funções que não conheço: PrnStatus(), GetProfString() e StrToken(). Pesquisei no Help do xHarbour, mas não encontrei.
Quem busca aconselhamento encontra sabedoria.
Magnoman
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 09 Mai 2010 11:35
Localização: Maceió
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por Magnoman »

Já tinha desenrolado aqui alguma coisa pra resolver, mas valeu a dica, vou compartilhar o que eu fiz:

Código: Selecionar todos

aPORT := {aPRINT[2],"Ne00:","Ne01:","Ne02:","Ne03:","Ne04:","Ne05:",;
          "Ne06:","Ne07:","Ne08:","Ne09:","Ne10:","Ne11:","Ne12:",;
          "Ne13:","Ne14:","Ne15:","Ne16:"}
FOR T=1 TO LEN(aPORT)
   TRY
       cPRINT := aPRINT[1] + " em " + aPORT[T]
       oEXCEL:ActivePrinter() := cPRINT
   CATCH
       LOOP
   END
   EXIT
NEXT
Essa aPRINT[2] vem do retorno da função GetPrinters(.T.)
Vi algo parecido escrito em VB para contornar a situação e traduzí dessa forma para o xHarbour. Deu certo! :))
Quem busca aconselhamento encontra sabedoria.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: OLE ActivePrinter: mudar a impressora no Excel

Mensagem por rochinha »

Amiguinho,

Como o Harbour nos permite manipular melhor os objetos espalhados pelo Windows da mesma forma que isto é nativo ao VB, Delphi, etc.

A maravilha não esta numa linguagem ou noutra, mas sim no que conseguimos com elas.

Vejo o Harbour como uma caixa de ferramentas, após abrí-la, consigo fazer muitas coisas.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder