GARANTIR DESCONTO

Fórum Importação de arquivos #468169

28/01/2014

0

Bom dia Pessoal,

Estou com um probleminha na importação de arquivos usando planilha excel.
O problema acontece no PC que não tem o Excel instalado, nas máquinas onde tem o excel, consigo importar numa boa.
Nos PCs que não tem o Excel dá a seguinte mensagem "Invalid Variant operation".

Tem como resolver isto sem instalar o Excel?

Ps. No PC que não tem o Excel tem o BROffice.

Meu código de importação é:

Procedure Importar;
Var Excel: Variant;
Begin
if OpenDialog1.Execute Then
Begin
EXCEL := CREATEOLEOBJECT('Excel.Application');
txtArquivo.Text := OpenDialog1.FileName;
.....
end;
Dirceu Morais

Dirceu Morais

Responder

Post mais votado

28/01/2014

Se fosse vc evitaria ter que fazer isso apenas com o excel instalado!

Se você fizer uma conexão com os componentes da paleta ADO, vc conseguirá burlar isso...

Veja esse código abaixo como é simples:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, ADODB, Buttons,
  ComCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Panel1: TPanel;
    ADOQuery1: TADOQuery;
    Edit2: TEdit;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    StatusBar1: TStatusBar;
    Label3: TLabel;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    ListBox1: TListBox;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);


  private
    procedure FetchData;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

{ TForm1 }


procedure TForm1.FetchData;
begin
  if not AdoConnection1.Connected then
    Begin
      ShowMessage('Primeiro abra uma planilha !');
    end
    else
  if Edit2.Text = 'Digite a planilha desejada aqui' then
    begin
      ShowMessage('Digite uma planilha no Campo : Planilha ');
    end;
    
  StatusBar1.SimpleText:='';
  AdoQuery1.Close;
  AdoQuery1.SQL.Text:='SELECT * FROM ['+Edit2.Text+']';
  AdoQuery1.Open;
  
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  FetchData;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AdoConnection1.LoginPrompt:=False;
  AdoQuery1.Connection:=AdoConnection1;
  DataSource1.DataSet:=AdoQuery1;
  DBGrid1.DataSource:=DataSource1;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var strConn:String;
begin
  OpenDialog1.Execute;
  strConn:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ OpenDialog1.FileName+';Extended Properties=Excel 8.0;Persist Security Info=False';
  AdoConnection1.Connected:=False;
  AdoConnection1.ConnectionString:=strConn;
  AdoConnection1.Open;
  AdoConnection1.GetTableNames(ListBox1.Items,True);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Edit2.Text := ListBox1.Items.Strings[ListBox1.ItemIndex];
end;

end.


Imagem abaixo de como fica o exemplo da tela que foi feita abaixo...

[url]http://imageshack.com/a/img853/5623/easc.jpg[/url]

Abração e bons códigos!

Espero ter ajudado!

Emanoel Deivison
Recife - PE


Deivison Melo

Deivison Melo
Responder

Gostei + 1

Mais Posts

28/01/2014

Douglas

Dirceu, creio que você tenha que ter mesmo o Excel, instalado em todas as maquinas senão vai gerar problemas.
Responder

Gostei + 0

28/01/2014

Thiago Irrazabal

Boa tarde, criei uma função para testar se tem registro no windows do Office/Excel, talvez te ajude, veja como ficou.

Primeiramente Coloque um Label, um Edit e um Button no formulário e deixe com os nomes Label1, txtArquivo (Esse nome eu reaproveitei do teu exemplo), Button1.

Depois declare a função no private ou public tanto faz.
function ExisteExcellInstalado: Boolean;

CTRL + SHIF + C para criar e substitui por isso:
const
  SubPasta: String = '\SOFTWARE\Microsoft\Office\';
var
  Registro: TRegistry;
  Versao, Aux: String;
  I: Integer;
begin
  try
    Result := False;

    Registro := TRegistry.Create;

    Registro.RootKey := HKEY_LOCAL_MACHINE;

    for I := 0 to 20 do
      begin
        Versao := IntToStr(I) + '.0';
        Aux := SubPasta + Versao;

        if Registro.OpenKey(Aux, False) then
          begin
            if Registro.OpenKey(Aux + '\Excel\InstallRoot', False) then
              begin
                if Registro.ValueExists('Path') then
                  Label1.Caption := Registro.ReadString('Path');

                Result := True;
                Break;
              end;
          end;
      end;
  finally
    Registro.CloseKey;
    Registro.Free;
  end;
end;

Explicando o Loop e para que serve o Label, o loop é para testar as versões de 0 a 20, e o Label caso esteja instalado o excel ele vai te mostrar o caminho.

Depois usando a mesma procedure do teu exemplo, só modificando 1 pouco.
var
  Excel: Variant;
begin
  if OpenDialog1.Execute Then
    Begin
      if ExisteExcellInstalado then
        Excel := CreateOleObject('Excel.Application')
      else
        Label1.Caption := 'Excel não instalado nessa máquina!';

      txtArquivo.Text := OpenDialog1.FileName;
    end;
end;


Veja se te serve, faça testes, adapte se necessário,abraço.




Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

28/01/2014

Thiago Irrazabal

Deivison, essa solução que tu citou necessita saber a versão do excel? Enfim, bela solução não conhecia mas, parece bem boa se uma hora eu precisar eu vou testá-la, abraço.


Att,
Thiago Irrazabal de Oliveira.
Responder

Gostei + 0

28/01/2014

Deivison Melo

Posso o tópico?
Responder

Gostei + 0

28/01/2014

Deivison Melo

Finalizando!!!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar