Como fazer leitura de Arquivo CSV e XLS em Delphi

Segue abaixo solução encontrada para ler arquivos csv e xls.:

procedure TFUIImportacaoPreco.BtnLerArquivoClick(Sender: TObject);

var
  I, LContarRegistro: Integer;
  LColuna,  LArquivoCSV: TStringList;
  LArquivoXLS: String;
  Excel, Sheet: Variant;
  LIndice: Currency;
begin
  inherited;
  if (CeRefFabrica.AsInteger = CePreco.AsInteger) then
    raise EValidation.Create('Antes de realizar a leitura fazer as configurações de linha e coluna');

  if FECaminhoArquivo.Text = '' then
    raise EValidation.Create('Selecione um arquivo');

  FPosicaoCabecalho := CeCabecalho.AsInteger;
  FPosicaoPreco     := CePreco.AsInteger;
  FPosicaoRef       := CeRefFabrica.AsInteger;

  if Pos('.CSV', UpperCase(Copy(FECaminhoArquivo.FileName, length(FECaminhoArquivo.FileName) -4, length(FECaminhoArquivo.FileName))))  > 0  then
  begin
    //Desconta 1 porque no arquivo CSV a coluna se inicia em zero, já o arquivo XLS se unicia por um.
    FPosicaoCabecalho := FPosicaoCabecalho - 1;
    FPosicaoPreco     := FPosicaoPreco - 1;
    FPosicaoRef       := FPosicaoRef - 1;

    cdsArquivo.EmptyDataSet;
    LArquivoCSV := TStringList.Create;
    LArquivoCSV.LoadFromFile(FECaminhoArquivo.FileName);

    LContarRegistro := LArquivoCSV.Count;
    pbBarraProgresso.Max := LContarRegistro;
    for I := 1 to LContarRegistro - FPosicaoCabecalho do
    begin
      LColuna := SplitStr(LArquivoCSV[I],';');
      cdsArquivo.Insert;
      cdsArquivoCODIGO.Value := LColuna[FPosicaoRef];
      cdsArquivoPRECO.AsCurrency := StrToCurr(LColuna[FPosicaoPreco]);

      QProcuraProduto.Close;
      if cdsArquivoCODIGO.Value <> '' then
        QProcuraProduto.ParamByName('REF_FABRICA').AsString := cdsArquivoCODIGO.AsString;

      QProcuraProduto.Open;
      if QProcuraProduto.IsEmpty then
        cdsArquivo.Cancel
      else
      begin
        cdsArquivoCODPRODUTO.AsInteger      := QProcuraProdutoCODPRODUTO.AsInteger;
        cdsArquivoCODPRODUTO_CLAS.AsInteger := QProcuraProdutoCODPRODUTO_CLAS.AsInteger;
        cdsArquivoDSCPRODUTO.AsString       := QProcuraProdutoDSCPRODUTO.AsString;
        cdsArquivoREFFABRICA.AsString       := QProcuraProdutoREF_FABRICA.AsString;
        cdsArquivo.Post;
      end;
      pbBarraProgresso.Position := I;
    end;
  end
  else if Pos('.XLS', UpperCase(Copy(FECaminhoArquivo.FileName, length(FECaminhoArquivo.FileName) -4, length(FECaminhoArquivo.FileName))))  > 0  then
  begin
    try
      Excel := CreateOleObject('Excel.Application');
      Excel.DisplayAlerts := False;
      Excel.Visible := false;
      Excel.WorkBooks.Open(FECaminhoArquivo.FileName);
      LArquivoXLS := ChangeFileExt(ExtractFileName(FECaminhoArquivo.FileName), EmptyStr);
      Sheet := Excel.Workbooks[1].WorkSheets[LArquivoXLS];
      Sheet := Excel.Workbooks[1].Sheets[1];
      LContarRegistro := Sheet.Cells.SpecialCells(11).Row;

      cdsArquivo.EmptyDataSet;
      pbBarraProgresso.Max := LContarRegistro;

      for I := FPosicaoCabecalho to LContarRegistro do
      begin
        cdsArquivo.Insert;
        cdsArquivoCODIGO.AsString := String(Excel.WorkBooks[1].Sheets[1].Cells[FPosicaoCabecalho, FPosicaoRef]);
        cdsArquivoPRECO.AsCurrency := StrToCurr(String(Excel.WorkBooks[1].Sheets[1].Cells[FPosicaoCabecalho, FPosicaoPreco]));

        QProcuraProduto.Close;
        if (cdsArquivoCODIGO.AsString <> '') then
          QProcuraProduto.ParamByName('REF_FABRICA').AsString := cdsArquivoCODIGO.AsString;

        QProcuraProduto.Open;
        if QProcuraProduto.IsEmpty then
          cdsArquivo.Cancel
        else
        begin
          cdsArquivoCODPRODUTO.AsInteger      := QProcuraProdutoCODPRODUTO.AsInteger;
          cdsArquivoCODPRODUTO_CLAS.AsInteger := QProcuraProdutoCODPRODUTO_CLAS.AsInteger;
          cdsArquivoDSCPRODUTO.AsString       := QProcuraProdutoDSCPRODUTO.AsString;
          cdsArquivoREFFABRICA.AsString       := QProcuraProdutoREF_FABRICA.AsString;
          cdsArquivo.Post;
        end;
        pbBarraProgresso.Position := I;
        FPosicaoCabecalho := FPosicaoCabecalho + 1;
      end;

    except
      raise EValidation.Create('Ocorreu um erro na leitura do arquivo.');
    end;
    Excel.Application.quit;
  end;
end;

Comentários

Postagens mais visitadas deste blog

Serializar e desserializar JSON em Delphi de Forma nativa

Arredondamento de valores Formato ABNT