karlosrapanui Profissional
Registrado: Terça-Feira, 29 de Agosto de 2006 Mensagens: 538
|
Enviada: Qua Abr 04, 2018 11:42 am Assunto: Importar planilha excel em partes |
|
|
Bom dia a todos
Estou usando uma rotina para importar uma planilha csv para um stringgrid, porem a planilha tem mais de 1 milhão de registros e fica uma carroça. Eu pensei em dividir e importar aos poucos.....mas nem imagino como ou se tem como fazer isso.
Estou usando ibdataset/ Firebird / D7
A rotina de importação é a seguinte
function TfrmImportar.XlsToStringGrid(XStringGrid: TStringGrid;
xFileXLS: string): Boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLSAplicacao, AbaXLS: OLEVariant;
RangeMatrix: Variant;
linha3, M, x, y, k, r: Integer;
nArq: TextFile;
Caminho, nData: string;
D:TDate;
mVALOR : extended;
s: string;
f2: double;
begin
Result := False;
XLSAplicacao := CreateOleObject('Excel.Application');
try
XLSAplicacao.Visible := False;
XLSAplicacao.Workbooks.Open(xFileXLS);
XLSAplicacao.WorkSheets[1].Activate;
{Selecione aqui a aba que você deseja ativar - começando sempre no 1 (1,2,3,4) }
AbaXLS := XLSAplicacao.Workbooks[ExtractFileName(xFileXLS)].WorkSheets[1];
AbaXLS.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Pegar o número da última linha
x := XLSAplicacao.ActiveCell.Row;
// Pegar o número da última coluna
y := XLSAplicacao.ActiveCell.Column;
// Seta xStringGrid linha e coluna
XStringGrid.RowCount := x;
XStringGrid.ColCount := y;
// Associaca a variant WorkSheet com a variant do Delphi
RangeMatrix := XLSAplicacao.Range['A1', XLSAplicacao.Cells.Item[x, y]].Value;
// Cria o loop para listar os registros no TStringGrid
k := 1;
repeat
for r := 1 to y do
XStringGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[k, r];
Inc(k, 1);
until k > x;
RangeMatrix := Unassigned;
finally
// Fecha o Microsoft Excel
if not VarIsEmpty(XLSAplicacao) then
begin
XLSAplicacao.Quit;
XLSAplicacao := Unassigned;
AbaXLS := Unassigned;
Result := True;
end;
end;
{ EXPORTA PARA A TABELA }
ibdsImportacao.Open;
linha3 := 1;
gauge1.Visible := True;
gauge1.MaxValue := StringGrid1.RowCount;
gauge1.Progress := 0;
for M := 1 to StringGrid1.RowCount -1 do
begin
ibdsImportacao.Append;
ibdsImportacaoNOME.AsString := StringGrid1.Cells[1,linha3];
ibdsImportacao.Post;
gauge1.Progress := gauge1.progress + 1;
end;
linha3 := linha3 + 1;
end;
end;
Se algum puder dar uma ajuda, fico muito agradecido.
Valeu |
|