importação excel para txt

03/01/2019

0

boa noite DEVs,

gostaria de uma ajuda de alguem, meu script esta funcionando,
porem preciso importa varias planilha, o meu script so importa um a um, gostaria de saber como faço pra importa varia.

o meu CODE ele carrega os dados do excel para strgrid em delphi, porem se vou abrir a segunda planilha ela carrega novamente e deleta o interior

alguem ai sabe como posso esta fazendo isso?

carrega todas as planilhas excel e depois gerar o arquivo txt?
para carrega os arquivo no strgrid ultilizo uma funcao que peguei aqui mesmo no forum, segue o codigo abaixo.

function XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: integer;
begin
  result := false;
  // Cria Excel- OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Esconde Excel
    XLApp.Visible := false;
    // Abre o Workbook
    XLApp.Workbooks.Open(AXLSFile);
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].Worksheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Pegar o número da última linha
    x := XLApp.ActiveCell.Row;
    // Pegar o número da última coluna
    y := XLApp.ActiveCell.Column;
    // Seta Stringgrid linha e coluna
    AGrid.RowCount := x;
    AGrid.ColCount := y;
    // Associaca a variant WorkSheet com a variant do Delphi
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[x, y]].Value;
    // Cria o loop para listar os registros no TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[k, r];
      Inc(k, 1);

    until k > x;

    RangeMatrix := Unassigned;
  finally
    // Fecha o Excel
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLApp := Unassigned;
      Sheet := Unassigned;
      result := true;
    end;
  end;
end;


helper
Edson Costa

Edson Costa

Responder

Post mais votado

04/01/2019

E ae Edson, blz cara,

O problema está no índice de linha que está usando para a próxima lista, cria uma variável global e guarda qual foi a ultima linha desse arquivo processado "esse cara ->
x := XLApp.ActiveCell.Row;
", no próximo processamento começa a popular dessa posição +1, assim você não sobrescreve o que já está no seu grid. "Ao finalizar todo o processo limpa a variável global para que possa reprocessar outros arquivos caso precise "

Uma forma mais fácil de fazer isso é gravar esses valores em memoria , assim você não precisaria controlar nada, depois erá só listar os valores em qualquer objeto que queira e gerar a exportação no formato que quiser.

Sobre exportar para txt aqui mesmo na devmedia tem muitos exemplos bem simples de como fazer isso, esse é um deles : https://www.devmedia.com.br/criando-e-gravando-dados-em-txt-com-delphi/22630

Espero que te ajude as dicas, boa sorte.

Jucélio Silva

Jucélio Silva
Responder

Mais Posts

04/01/2019

Edson Costa

E ae Edson, blz cara,

O problema está no índice de linha que está usando para a próxima lista, cria uma variável global e guarda qual foi a ultima linha desse arquivo processado "esse cara ->
x := XLApp.ActiveCell.Row;
", no próximo processamento começa a popular dessa posição +1, assim você não sobrescreve o que já está no seu grid. "Ao finalizar todo o processo limpa a variável global para que possa reprocessar outros arquivos caso precise "

Uma forma mais fácil de fazer isso é gravar esses valores em memoria , assim você não precisaria controlar nada, depois erá só listar os valores em qualquer objeto que queira e gerar a exportação no formato que quiser.

Sobre exportar para txt aqui mesmo na devmedia tem muitos exemplos bem simples de como fazer isso, esse é um deles : https://www.devmedia.com.br/criando-e-gravando-dados-em-txt-com-delphi/22630

Espero que te ajude as dicas, boa sorte.


Ola Jucélio,

compreendi, mais eu sou iniciante em delphi, Teria uma forma de demostra como seria, com o code acima? pq peguei esse scrip aqui mesmo e ate agora nao entendi ele, rs deve ser falta de estudo rs, se pode me da uma moral ai ficarei muito grato!

att,
Edson Costa

Responder

07/01/2019

Jucélio Silva

Opa Edson,

Então implementei a alteração para que possa usar essa rotina, mas tem outras formas bem mais bacanas de fazer isso, sem falar que se usasse um cxGrid poderia exportar para qualquer formato depois de forma bem simples, outra opção é o que te falei seria gravar em memoria e fazer o que quisesse com os dados, de qualquer forma segue o fonte alterado podendo receber N planilhas, fiz carregando o titulo e pulando uma linha, ai você pode alterar como char melhor :

// cria a variavel global para manter o valor

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxLookAndFeelPainters, StdCtrls, cxButtons, Grids,ComObj ;

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    StringGrid1: TStringGrid;
    cxButton2: TcxButton;
    procedure cxButton1Click(Sender: TObject);
    function  XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): boolean;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ultimaLinhaXML:Integer;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  ultimaLinhaXML:=1; 
end;

function TForm1.XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: integer;
begin
  result := false;
  // Cria Excel- OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Esconde Excel
    XLApp.Visible := false;
    // Abre o Workbook
    XLApp.Workbooks.Open(AXLSFile);
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].Worksheets[1];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Pegar o número da última linha
    x := XLApp.ActiveCell.Row;
    // Pegar o número da última coluna
    y := XLApp.ActiveCell.Column;
    // Seta Stringgrid linha e coluna
    AGrid.RowCount := x+ultimaLinhaXML;
    AGrid.ColCount := y;
    // Associaca a variant WorkSheet com a variant do Delphi
    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[x, y]].Value;
    // Cria o loop para listar os registros no TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (ultimaLinhaXML - 1)] := RangeMatrix[k , r];
      Inc(k, 1);
      Inc(ultimaLinhaXML, 1);

    until k > x;

    RangeMatrix := Unassigned;
  finally
    // Fecha o Excel
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.Quit;
      XLApp := Unassigned;
      Sheet := Unassigned;
      result := true;
    end;
  end;
end;

procedure TForm1.cxButton1Click(Sender: TObject);
begin
  if(XlsToStringGrid(StringGrid1,'c:\\teste.xlsx'))then
    ShowMessage('Processo Finalizado com sucesso')
  else
    ShowMessage('Erro ao carregar dados');
end;

end.


Espero que ajude, boa sorte ...
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

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

Aceitar