Ir para conteúdo
Fórum Script Brasil
  • 0

Abrir Arquivo Doc Word 2007


gleistoncardoso

Pergunta

Utilizo o comando abaixo para abrir um arquivo do word que tem uma mala direta buscando os dados da tabela paradox:

procedure Tfrmclientes.btimprimirClick(Sender: TObject);

begin

if tabelas.tbclientesTipocontrato.Text = 'Àrea Lazer' then

begin

ShellExecute(0,'open','C:\eventos\contratos\contratoarea.doc',nil,nil,SW_SHOWNORMAL);

end;

...

No word 2003 funciona normalmente, fiz uma atualização para word 2007 e quando vou abrir acusa: "Erro, a tabela externa não está no formato esperado."

Dai pede para que eu localize o arquivo de origem dos dados, mas mesmo localizando a tabela clientes.db ele continua dando erro.

O que pode ser????

Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0

Bom, não sei se isso vai te ajudar, mas eu uso o office 2007 também, ainda não utilizei delphi e office, mas andei observando na extenção dos arquivos gerados pelo office 2007 é outra extenção, por exemplo ai você expecificou:

ShellExecute(0,'open','C:\eventos\contratos\contratoarea.doc',nil,nil,SW_SHOWNORMAL);

Andei observando que a extenção do office 2007 é .xls, verifica se é isso, mas você deve mudar o tipo de salvamento em mais comando do word 2007.

Verifique, espero que seja isso.

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Tenta tirar o 'open' também e passar mais coisas...

Digo porque eu já passei por isso, mas não era só com arquivos do Office, e a merda do

problema tava no 'open' acredite ou não auhauha

Passe o Handle da janela também pro Windows saber quem é o owner da execução

Quando testei eu percebi que, no Windows 98 precisava do Open já no Windows 200/NT/XP

se os programas que abrissem o atalho não tivesse seu Path absoluto e sim ClassIDs então

com o Open não abria, é o que acontece com o Office...

Repare, clique em Iniciar, Programas, Acessórios, clica com o botão direito emcima do atalho

do bloco de notas... você vai ver algo como

%SystemRoot%\system32\notepad.exe

Este é o caminho absoluto do Bloco de notas...

Agora faça o mesmo com o atalho de qualquer programa do Office...

Repare que não tem um caminho absoluto, e sim ele é executado através de CLASSID...

Então tente o seguinte, foi o que eu fiz pra resolver...

const
  PLATFORM_WINDOWS_UNKNOW = 0;
  PLATFORM_WINDOWS_98 = 1;
  PLATFORM_WINDOWS_ME = 2;
  PLATFORM_WINDOWS_2000 = 3;
  PLATFORM_WINDOWS_XP = 4;

Function GetPlatform: Integer;
var
  OsVerInfo: TOSVersionInfo;
begin
  Result := PLATFORM_WINDOWS_UNKNOW;
  ZeroMemory(@OsVerInfo, SizeOf(OsVerInfo));
  OsVerInfo.dwOSVersionInfoSize := SizeOf(OsVerInfo);
  GetVersionEx(OsVerInfo);
  case (OsVerInfo.dwPlatformId) of
  VER_PLATFORM_WIN32_WINDOWS:
  begin
    //Windows 98
    if ((OsVerInfo.dwMajorVersion >= 4) and (OsVerInfo.dwMinorVersion >= 10)
    and not (OsVerInfo.dwMinorVersion >= 90)) then
    Result := PLATFORM_WINDOWS_98 else
    //Windows ME
    if ((OsVerInfo.dwMajorVersion >= 4) and (OsVerInfo.dwMinorVersion >= 90)) then
    Result := PLATFORM_WINDOWS_ME;
  end;
  VER_PLATFORM_WIN32_NT:
  begin
    //Windows 2000
    if ((OsVerInfo.dwMajorVersion >= 5) and not (OsVerInfo.dwMinorVersion >= 1)) then
    Result := PLATFORM_WINDOWS_2000 else
    //Windows XP
    if ((OsVerInfo.dwMajorVersion >= 5) and (OsVerInfo.dwMinorVersion >= 1)) then
    Result := PLATFORM_WINDOWS_XP;
  end;
  end; //end case
end;

...

var
  szBuff: String;
begin
  szBuff := 'C:\eventos\contratos\contratoarea.doc';
  case GetPlatform of
  PLATFORM_WINDOWS_98, PLATFORM_WINDOWS_ME:
  ShellExecute(Handle, 'open', PChar(szBuff), nil, nil, SW_SHOWNORMAL);
  PLATFORM_WINDOWS_2000, PLATFORM_WINDOWS_XP:
  ShellExecute(Handle, nil, Pchar(szBuff), nil, nil, SW_SHOWNORMAL);
  end;
end;

Adapte as suas necessidades...

abraçox

Link para o comentário
Compartilhar em outros sites

  • 0

Churc,

Coloquei a const + function logo abaixo de uses do meu form e a parte de baixo var szBuff... no botao para chamar a operação, mas continuou dando o mesmo erro. Não tenho muita experiência com delphi, mas fiz correto ou ainda falta algo.

Erro: a tabela externa não está no formato esperado.

Dai pede para localizar a table, dai localizo: clientes.db e continua dando erro.

Editado por gleistoncardoso
Link para o comentário
Compartilhar em outros sites

  • 0
No word 2003 funciona normalmente, fiz uma atualização para word 2007 e quando vou abrir acusa: "Erro, a tabela externa não está no formato esperado."

Dai pede para que eu localize o arquivo de origem dos dados, mas mesmo localizando a tabela clientes.db ele continua dando erro.

gleistoncardoso, duas perguntas:

1) No word 2007 também funciona corretamente, como funcionava no 2003?

2) A localização da tabela é a mesma da do documento do word?

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta isso pra ver se dá certo:

utilize um componente OleContainer1 da guia System do delphi

no object inspector altere a propriedade AutoActive para aaGetFocus

procedure Tfrmclientes.btimprimirClick(Sender: TObject);
begin
   if tabelas.tbclientesTipocontrato.Text = 'Àrea Lazer' then
      begin
         OleContainer1.CreateLinkToFile('C:\eventos\contratos\contratoarea.doc'),TRUE);  
         OleContainer1.SetFocus;
         OleContainer1.Run;
      end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, está faltando um parenteses

OleContainer1.CreateLinkToFile('C:\eventos\contratos\contratoarea.doc'),TRUE);

alterei assim

OleContainer1.CreateLinkToFile(('C:\eventos\contratos\contratoarea.doc'),TRUE);

agora da a mensagem de erro duas vezes, abre o arquivo do word, porem não mescla os dados.

Um detalhe que não comentei ainda, quando abro direto pelo word funciona normalmente, abre o arquivo, consigo passar por todos os registros da tabela atraves da mala direta. O erro so acontece realmente quando abro pelo comando do Delphi.

Link para o comentário
Compartilhar em outros sites

  • 0
No 2007 não funciona, só funciona no 2003.

As tabelas estao na mesma pasta de sempre.

gleistoncardoso, acho que o ideal seria primeiro conseguir resolver o problema no Word2007 (ou seja, abrir o documento no Word 2007, fazer funcionar "lá"), para depois continuar queimando pestanas no Delphi (o que acho, que daí não será necessário).

Pois, me corrijam se estiver falando besteira, o uso de OLE apenas faz com que possamos utilizar os recursos e funcionalidades do Word através de nossa aplicação Delphi. Se não funciona nativamente no Word, não vai ser via OLE que vai funcionar.

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, abrindo diretamente pelo word funciona normalmente a mala direta utilizando a tabela clientes.db que uso no programa.

Quando uso o programa em delphi com word 2003 funciona.

Só da o erro quando uso com o word 2007.

Quando vou fazer um arquivo novo no word 2007 utilizando mala direta com a tabela clientes.db funciona, o problema é realmente delphi com word 2007.

Link para o comentário
Compartilhar em outros sites

  • 0

Tentando resolver de outra forma, ao invés de clientes.db, criei uma tabela no paradox como TESTE.DBF, dai o processo funcionou normalmente, sem nenhum problema. Identifiquei então que o word 2007 não trabalha 100% com tabelas .db.

Agora as questões:

1 - Tem como converter minhas tabelas .db para .dbf sem perder nada de propriedades.

2 - E no delphi terei que alterar linhas de código por utilizar tabela .dbf.

Quais as sugestões???

Link para o comentário
Compartilhar em outros sites

  • 0
Tentando resolver de outra forma, ao invés de clientes.db, criei uma tabela no paradox como TESTE.DBF, dai o processo funcionou normalmente, sem nenhum problema. Identifiquei então que o word 2007 não trabalha 100% com tabelas .db.
gleistoncardoso, esta última informação não é compatível com esta outra sua observação:

"Quando vou fazer um arquivo novo no word 2007 utilizando mala direta com a tabela clientes.db funciona, o problema é realmente delphi com word 2007"

Então, acho que deve haver algo ainda não identificado acontecendo.

1 - Tem como converter minhas tabelas .db para .dbf sem perder nada de propriedades.

2 - E no delphi terei que alterar linhas de código por utilizar tabela .dbf.

acho que não seria o caminho. Como disse antes, deve ter alguma coisa errada ocorrendo que ainda não se descobriu.

O pior é que provavelmente só você conseguirá tentar achar o problema (eu, por ex., nem tenho o Word 2007).

Não tenho certeza se em essência, não seria a mesma coisa, mas você já experimentou abrir o documento com esta outra forma:

type
  TForm1 = class(TForm)
  private
    WordApp :OLEVariant;
  end;
...
uses
  ComObj;

procedure TForm1.BtnAbreDocClick(Sender: TObject);
const
  wdWindowStateNormal = 0;
  wdWindowStateMaximize = 1;
  wdWindowStateMinimize = 2;
begin
  try
    // cria objeto OLE para a aplicação Word
    WordApp := CreateOleObject('Word.Application');
   // se não quiser que o word "apareça", comente a próxima linha
    WordApp.WindowState := wdWindowStateNormal;
    try
      WordApp.Documents.Open('C:\eventos\contratos\contratoarea.doc'');
    except
      ShowMessage('Erro ao tentar abrir arquivo doWord');
    end;
  except
    ShowMessage('Erro ao tentar inicializar o Microsoft Word');
  end;
end;

procedure TForm1.Form1Destroy(Sender :TObject);
begin
 // se havia inicializado o Word, então encerra ele
  if not VarIsEmpty(WordApp) then
    WordApp.Quit;
  WordApp := UnAssigned;
end;

Mais uma outra coisa. Em qual a versão do Paradox que foi criada sua tabela (5, 7, ...)? Quem sabe, possa estar relacionado a versão dela.

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus, tentei utilizar o seu código e apresentou os seguintes problemas:

private

WordApp :OLEVariant; (não encontrou propriedades)

[Error] clientes.pas(177): Field definition not allowed after methods or properties

except

[Error] clientes.pas(791): ',', ')' or ']' expected but 'EXCEPT' found

ShowMessage('Erro ao tentar abrir arquivo doWord');

[Error] clientes.pas(792): ')' expected but identifier 'ShowMessage' found

end;

[Error] clientes.pas(793): EXCEPT or FINALLY expected

[Fatal Error] Eventos.dpr(16): Could not compile used unit 'clientes.pas'

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus, tentei utilizar o seu código e apresentou os seguintes problemas:

private

WordApp :OLEVariant; (não encontrou propriedades)

[Error] clientes.pas(177): Field definition not allowed after methods or properties

gleistoncardoso, o que você quiz dizer com o comentário "não encontrou propriedades" ao lado a variável "privada"?

Você lembrou de colocar na cláusula USES a unit "ComObj"? Eu exemplifiquei utilizando esta únit, porém coloquei depois da cláusula IMPLEMENTATION, talvez você tenha que colocar na cláusula INTERFACE (lá no início da unit)

except

[Error]clientes.pas(791): ',', ')' or ]' expected but 'EXCEPT' found

ShowMessage('Erro ao tentar abrir arquivo doWord');

[Error] clientes.pas(792): ')' expected but identifier 'ShowMessage' found

end;

[Error] clientes.pas(793): EXCEPT or FINALLY expected

bom, esta parte é um efeito em cascata. Mas o problema começa numa linha que não parece-me ser qualquer uma que tenha posto em meu exemplo. Observe que a mensagem cita "',', ')' or ]' expected but 'EXCEPT' found" e não há nada parecido em meu exemplo.

Você vai ter que colocar o código desta parte aqui (a parte em que contenha as linhas anteriores a linha 791, até o final do seu except - end)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...