importação excel para txt
03/01/2019
0
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
Post mais votado
04/01/2019
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;
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
Mais Posts
04/01/2019
Edson Costa
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;
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
07/01/2019
Jucélio Silva
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 ...
Clique aqui para fazer login e interagir na Comunidade :)