OLE ActivePrinter: mudar a impressora no Excel
Moderador: Moderadores
OLE ActivePrinter: mudar a impressora no Excel
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.
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.
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Re: OLE ActivePrinter: mudar a impressora no Excel
Magnoman, veja este exemplo:
Já testei e funcionou certinho!
Abraços,
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 NilAbraç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
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
Re: OLE ActivePrinter: mudar a impressora no Excel
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:
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! :'(
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 drama é esse! :'(
Quem busca aconselhamento encontra sabedoria.
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: OLE ActivePrinter: mudar a impressora no Excel
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.
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
xHarbour.org + Hwgui + PostgreSql
- Itamar M. Lins Jr.
- 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
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.
Somente via raw printer irá funcionar. Á classe win32prn funciona com qualuer impressora.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- rochinha
- 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
Amiguinho,
Voce poderia chamar o PrinterSetup() diretamente pela propriedade do excel:
Abaixo mais funcoes uteis:
Voce poderia chamar o PrinterSetup() diretamente pela propriedade do excel:
Código: Selecionar todos
oExcel:ActivePrinter := PrinterSetup()
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Re: OLE ActivePrinter: mudar a impressora no Excel
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.
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.
Re: OLE ActivePrinter: mudar a impressora no Excel
Já tinha desenrolado aqui alguma coisa pra resolver, mas valeu a dica, vou compartilhar o que eu fiz:
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!
)
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
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.
- rochinha
- 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
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.
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
