Fórum Importação de arquivos #468169
28/01/2014
0
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
Curtir tópico
+ 0Post mais votado
28/01/2014
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
Gostei + 1
Mais Posts
28/01/2014
Douglas
Gostei + 0
28/01/2014
Thiago Irrazabal
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.
Gostei + 0
28/01/2014
Thiago Irrazabal
Att,
Thiago Irrazabal de Oliveira.
Gostei + 0
28/01/2014
Deivison Melo
Gostei + 0
28/01/2014
Deivison Melo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)