Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten Export nach Excel mit mehr als 66.000 Datensätzen (https://www.delphipraxis.net/77894-daten-export-nach-excel-mit-mehr-als-66-000-datensaetzen.html)

Andidreas 26. Sep 2006 15:42


Daten Export nach Excel mit mehr als 66.000 Datensätzen
 
aloha...

ich muss gerade eine text datei nach excel exportieren...

dass programm hab ich schon vor ca. 2 monaten geschrieben und lief bis jetzt wunderbar...
aber jetzt hat die aktuelle text datei über 66.000 datensätze, und excel kann ja maximal
65.536 Datensätze pro tabellenblatt aufnehmen...

ich hab jetzt probiert 1 tabellenblatt zu füllen und nach 65.500 Datensätzen in das
2. tabellenblatt zu wechseln

aber ich bekomm immer folgende fehlermeldung "OLE - Fehler 800A03EC" wenn ich in das
2.tabellenblatt meine daten exportieren will...

hier ist mal meine prozedur:
Delphi-Quellcode:
//******************************************************************************
// Create .xls File and Add all Rows from .txt File                           *
//******************************************************************************

procedure TMain_Form.prCreateXls(iAnzRec : Integer);

var
bl, blSheets2                                                 : Boolean;
oleExcelApp, oleExcelSheets1, oleExcelSheets2, oleExcelWorkb : OleVariant;    
i, iCell, iCount, iRow                                       : Integer;
sDate, sFile, sPath, sRow, sXlsFile                          : String;
txtFile                                                      : TextFile;
wRC                                                          : Word;

begin

  //Paths
  sDate := FormatDateTime('yyyymmdd', Date);
  sFile := 'U:\Programmierung\LOG\Router_Tab\Excel\ROUTES_TAB_' + sDate;
  sPath := '..\Output\ROUTES_Convert_' + sDate + '.txt';

  //Create .xls / Set Column Format / Create Header
  oleExcelApp := CreateOleObject('Excel.Application');
  oleExcelWorkb := oleExcelApp.Workbooks.Add;
  oleExcelSheets1 := oleExcelWorkb.WorkSheets.Add;                              
  oleExcelSheets1.Name := 'Tab (1) vom ' + sDate;                    

  //If more then 65.500 Rows in the DPD Router Tab then Create an Second Sheet
  If iAnzRec > 65500 Then                                                      
  Begin                                                                        
    oleExcelSheets2 := oleExcelWorkb.WorkSheets.Add;                          
    oleExcelSheets2.Name := 'Tab (2) vom ' + sDate;                
    blSheets2 := True;                                                        
  End;                                                                        

  iRow := 1;

  For i := 1 To 7 Do
  Begin
    oleExcelSheets1.Columns[i].NumberFormat := '@';                            
    If blSheets2 = True Then                                                  
    Begin                                                                      
      oleExcelSheets2.Columns[i].NumberFormat := '@';                          
    End;                                                                      
  End;

  For i := 1 To 7 Do
  Begin
    iCell := i;
    oleExcelSheets1.Cells[iRow, iCell].Font.FontStyle := 'Bold';              
    If i = 1 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'Land';          
    If i = 2 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'PLZ Von';      
    If i = 3 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'PLZ Bis';      
    If i = 4 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'O - Sort';      
    If i = 5 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'D - Depot';    
    If i = 6 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'D - Sort';      
    If i = 7 Then oleExcelSheets1.Cells[iRow, iCell].Value := 'Barcoed ID';    
    If blSheets2 = True Then                                                  
    Begin                                                                      
      If i = 1 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'Land';        
      If i = 2 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'PLZ Von';    
      If i = 3 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'PLZ Bis';    
      If i = 4 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'O - Sort';    
      If i = 5 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'D - Depot';  
      If i = 6 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'D - Sort';    
      If i = 7 Then oleExcelSheets2.Cells[iRow, iCell].Value := 'Barcoed ID';  
    End                                                                        
  End;

  //Assign .txt File for Input
  {$I-}
  AssignFile(txtFile, sPath);
  Reset(txtFile);
  iCount := 100;
  iRow := 2;
  Application.ProcessMessages;

  While Not EOF(txtFile) Do
  Begin

    Application.ProcessMessages;
    Readln(txtFile, sRow);

    //Add sRow to Excel Cells

    For i := 1 To 7 Do
    Begin
      iCell := i;
      If (iRow < 65501) Then                                                        
      Begin                                                                        
        If i = 1 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 1, 2);
        If i = 2 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 3, 9);
        If i = 3 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 12, 9);
        If i = 4 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 21, 4);
        If i = 5 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 25, 4);
        If i = 6 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 29, 4);
        If i = 7 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 33, 3);
      End                                                                          
      Else If (iRow >= 65501) Then                                                  
      Begin                                                                        
        If i = 1 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 1, 2);
        If i = 2 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 3, 9);
        If i = 3 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 12, 9);
        If i = 4 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 21, 4);
        If i = 5 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 25, 4);
        If i = 6 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 29, 4);
        If i = 7 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 33, 3);
      End;                                                                          

    End;                                                                            

      iRow := iRow + 1;

      //Set Progress in Pregress Bar
      If iRow = iCount Then
      Begin
        ProgBar2.Position := Round((100 * iRow) / iAnzRec);
        iCount := iCount + 100;
      End;

  End;

  CloseFile(txtFile);
  {$I-}

  //Examine whether File is present
  bl := FileExists(sFile + '.xls');
  If bl = True Then
  Begin
    wRC := MessageDlg('Fileis allready present!' +#13+ 'Clear File?', mtINformation, mbYesNo, 0);
    If wRC = mrYes Then
    Begin
      bl := DeleteFile(sFile + '.xls');
      If bl = False Then
      Begin
        ShowMessage('Error with File Clear!');
      End;
    End
    Else
    Begin
      ShowMessage('File wouls be Overwritten!');
    End;
  End;

  //Save as .xls File
  sXlsFile := ChangeFileExt(sFile, '.xls');

  Try
    oleExcelWorkb.Close(true, sXlsFile, False);
  Except
    ShowMessage('Save To File Error');
  End;

  //Excel freigeben
  oleExcelSheets1 := Unassigned;                                              
  oleExcelSheets2 := Unassigned;                                              
  oleExcelWorkb := Unassigned;
  oleExcelApp.Quit;
  oleExcelApp := Unassigned;

  ProgBar2.Position := 0;
  lbl_sts_xls.Caption := 'Export to Excel. OK';
  lbl_sts_xls.Font.Size := 8;
  lbl_sts_xls.Font.Color := clGreen;
  Main_Form.Refresh;

  bitbtn_exit.Enabled := True;

end;
kann mir hier jemand vielleicht weiterhelfen warum ichs net hinkrieg mein 2. tabellenblatt zu füllen???
bzw. weiß jemand ne andere lösung wie ichs hier versucht hab.....?!

mkinzler 26. Sep 2006 15:46

Re: Daten Export nach Excel mit mehr als 66.000 Datensätzen
 
Splitte die Datei doch und lasse sie direkt von Excel-Laden /Ascii-Import).
BTW. Warum willst du das in Excel importieren?

Andidreas 26. Sep 2006 15:55

Re: Daten Export nach Excel mit mehr als 66.000 Datensätzen
 
hmm ich würds schon lieber über mein programm denn export machen...

die daten um die es geht bekommen wir von jemand (darf denn namen hier glaub nicht erwähnen ;) )
auf einem ftp verzeichnis bereit gestellt... leider ist die datei die wir bekommen nicht formatiert...
in meinem programm formatier ich datei im ersten schritt...
im zweiten schritt versuch ich denn export nach excel...
und als letzter schritt müsste ich dann die daten aus excel in eine as/400 exportieren...

mkinzler 26. Sep 2006 15:58

Re: Daten Export nach Excel mit mehr als 66.000 Datensätzen
 
Warum den Zwischenschritt über Excel? Ich würde versuchen die Daten direkt für die AS/400 bereitzustelln oder hast du einen Plugin für Excel, der die Daten in einem proprietären Format exportiert?

Andidreas 26. Sep 2006 16:02

Re: Daten Export nach Excel mit mehr als 66.000 Datensätzen
 
ja wir haben in excel bereits ein tool, was daten export bzw. import von/zur as/400 erledigt...
daher mein zwischenschritt über excel

Andidreas 26. Sep 2006 16:15

Re: Daten Export nach Excel mit mehr als 66.000 Datensätzen
 
lol ok, ich glaub ich hab meinen fehler ^^ bzw. ich hoffe !!!!

Delphi-Quellcode:
For i := 1 To 7 Do
    Begin
      iCell := i;
      If (iRow < 65501) Then                                                        
      Begin                                                                        
        If i = 1 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 1, 2);
        If i = 2 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 3, 9);
        If i = 3 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 12, 9);
        If i = 4 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 21, 4);
        If i = 5 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 25, 4);
        If i = 6 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 29, 4);
        If i = 7 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 33, 3);
      End                                                                          
      Else If (iRow >= 65501) Then                                                  
      Begin                                                                        
        If i = 1 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 1, 2);
        If i = 2 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 3, 9);
        If i = 3 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 12, 9);
        If i = 4 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 21, 4);
        If i = 5 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 25, 4);
        If i = 6 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 29, 4);
        If i = 7 Then oleExcelSheets2.Cells[iRow, iCell].Value := Copy(sRow, 33, 3);
      End;                                                                          

    End;                                                                            

      iRow := iRow + 1;

      //Set Progress in Pregress Bar
      If iRow = iCount Then
      Begin
        ProgBar2.Position := Round((100 * iRow) / iAnzRec);
        iCount := iCount + 100;
      End;

  End;
und zwar genau in der for schleife ^^
ich frag ja ab ob iRow >= 65501 ist wenn ja soll er im 2. tabellenblatt weitermachen...
aber ich verwende für das 2. tabellenblatt auch wieder iRow als zeilenzähler und prompt kriegt er die obengenannte fehlermeldung...
ich hab jetzt nen 2. zähler eingebaut, und normal sollte es jetzt dann glaub gehn ;)
so siehts jetzt nämlich aus:

Delphi-Quellcode:
For i := 1 To 7 Do
    Begin
      iCell := i;
      If (iRow < 65501) Then                                                        
      Begin                                                                        
        If i = 1 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 1, 2);
        If i = 2 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 3, 9);
        If i = 3 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 12, 9);
        If i = 4 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 21, 4);
        If i = 5 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 25, 4);
        If i = 6 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 29, 4);
        If i = 7 Then oleExcelSheets1.Cells[iRow, iCell].Value := Copy(sRow, 33, 3);
      End                                                                          
      Else If (iRow >= 65501) Then                                                  
      Begin                                                                
        If i = 1 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 1, 2);
        If i = 2 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 3, 9);
        If i = 3 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 12, 9);
        If i = 4 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 21, 4);
        If i = 5 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 25, 4);
        If i = 6 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 29, 4);
        If i = 7 Then oleExcelSheets2.Cells[iRow2, iCell].Value := Copy(sRow, 33, 3);
        iRow2 := iRow2 + 1;    
      End;                                                                          

    End;                                                                            

      iRow := iRow + 1;

      //Set Progress in Pregress Bar
      If iRow = iCount Then
      Begin
        ProgBar2.Position := Round((100 * iRow) / iAnzRec);
        iCount := iCount + 100;
      End;

  End;
edit: das erhöhen von iRow2 natürlich ausserhalb der if abfrage... sonst siehts komisch aus ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz