2016-03-30 8 views
-1

Obwohl ich ein großer Fan von Stackoverflow bin und ich mehrere gute Lösungen gefunden habe, ist dies meine erste Frage. Ich schreibe ein Delphitool (D6 ... alt, aber immer noch funktionierend!), Um es einfacher zu machen, unsere Schüler in der Schule zu verwalten.Delphi: wie man einen Excel-Bereich trimmt

Delphi liest einige (noch ältere ...) Visual Foxpro Dbase-Tabellen und sammelt die benötigten Daten in einer Abfrage. Diese Daten sollten nach Excel exportiert werden. „Theoretisch“ alles funktioniert, aber ich habe einige Probleme:

  1. Abfragefelder sind mit vielen führenden Leerzeichen aufgefüllt, diese ein FoxPro Problem zu sein scheint (Ich fand dies: http://www.ml-consult.co.uk/foxst-36.htm, weiß nicht, wie mit ihm arbeiten)
  2. Trimmen durch sQL-Befehle nicht funktioniert (Leerzeichen von foxpro Abfrage erstellt wird, sind die Tabellen „clean“)
  3. versucht, die Dinge in Delphi mit Hilfe von „OnGetText zu erledigen "Methode des Feldes Namen - das hilft, aber innerhalb der Dataset die Räume sind unberührt (nur ihre Feldwerte im Raster sind korrekt) - auch keine Hilfe , weil der Export nach Delphi verwendet die Abfrage
  4. so muss ich die Leerzeichen von Delphi nach Excel loswerden. Ich benutze dies: Exporting data from a DBGrid to Excel und dachte, ich könnte Excel-trim-funtion ausführen, um die Felder zu manipulieren. Meine Frage ist also: Wie kann ich VBA-Code ausführen? Ich fand das: Trim Cells using VBA in Excel

Irgendwelche Ideen? Danke im Voraus!

PS: Ich suchte auch nach einem einfachen "alle Leerzeichen ersetzen, aber nicht in Worten" Weise, dachte an Regexp, aber fand keine Möglichkeit, dies aus meinem Delphi-Code zu tun.

Da es nicht sehr viel Text in der Excel-Tabelle gibt (100 Zeilen, 4 Spalten), könnte ich durch jede einzelne Zelle gehen ... aber das scheint nicht sehr elegant zu sein. How does Trim work in Excel VBA? How to trim text in a column with VBA - Excel

So gibt es den Code für einen einfachen Austausch aller Räume - leider auch es necesserary Raum zwischen zwei Wörter in einer Zelle ersetzt:

ovExcelApp := CreateOleObject('Excel.Application'); 
    try 
    ovExcelApp.displayAlerts := false; 
    ovExcelWorkbook := ovExcelApp.WorkBooks.Add; 
    ovWS := ovExcelWorkbook.Worksheets.Item[1]; 
    ovWS.Activate; 
    ovWS.Select; 
    ovWS.Cells.NumberFormat := AnsiChar('@'); 
    ovRange := ovWS.Range['A1', 'A1']; //go to first cell 
    ovRange.Resize[Data.RecordCount, Data.Fields.Count]; 
    ovRange.CopyFromRecordset(Data, Data.RecordCount, Data.Fields.Count); 
    ovExcelApp.Cells.Replace(
     What := ' ', 
     Replacement := '', 
     LookAt := 2, 
     SearchOrder := 1, 
     MatchCase := False, 
     SearchFormat := False, 
     ReplaceFormat := False 
     ); 
    end; 
    // How could I do a regexp (only replace leading spaces) or do a trim over all cells withing ovWS? 
    ovRange.EntireColumn.AutoFit; 
    ovWS.SaveAs(DestName, 1, '', '', False, False); 

Der Versuch, trimmen Feldwerte bringt einen Fehler:

procedure Tf_dbftools.qADO_einzelnAfterOpen(DataSet: TDataSet); 
begin 
    with qADO_einzeln do begin 
    first; 
    while not eof do begin 
     edit; 
     Fields[0].AsString := trim(fields[0].asstring); 
     Fields[1].AsString := trim(fields[1].asstring); 
     Fields[2].AsString := trim(fields[2].asstring); 
     Fields[3].AsString := trim(fields[3].asstring); 
     next; 
    end; 
    //post -> error 
    end; 
end; 

Ich muss nur die Daten (aus verschiedenen Tabellen) in der QADO-Abfrage bzw. bearbeiten. Datenmenge, um Dinge korrekt nach Excel zu exportieren. Muss ich wirklich die Daten in ein clientDataset kopieren, um sie zu bearbeiten?

+0

Warum trim() in Delphi ** code ** nicht einfach, wenn die Daten auf dem Weg von DBase nach Excel sind? –

+0

Danke für Ihre Antwort, Jan. Aber mit der CopyFromRecordset-Methode habe ich nur ein _Recordset-Objekt. Wie kann ich auf die Feldwerte zugreifen? – Heiko

+0

.. versucht, die "AfterOpen" -Methode zu verwenden und einige aodquery.edit und dann Felder [0] .asString: = trimmen (Felder [0] .asString .. adoquery.post ... aber keine Hilfe, kann nicht schreiben Werte zurück in die Abfrage ..: - \ – Heiko

Antwort

0

Schließlich entschied ich mich für diese (einfache ...) Lösung, die durch jede Zelle Wert Kopieren manuell so dass ich Trimmfunktion Delphi verwenden kann:

.. einige Codes wie oben, aber jetzt „Daten“ ist ein TADOQuery:

data.First; 
    for RowIndex := 0 to Data.RecordCount - 1 do begin 
     for ColumnIndex := 0 to data.Fields.Count - 1 do begin 
     ovWS.Cells[RowIndex+1, ColumnIndex+1].Value := trim(data.Fields[columnIndex].AsString); 

     next ; 
     end; 
    data.Next; 
    next; 

(... aber immer noch fragen, ob es eine einfachere und "sauberere" Art und Weise ... neben der Tatsache, dass Polsterung in Foxpro ist schrecklich!)

+0

eine andere Möglichkeit könnte sein, ein berechnetes Feld für jedes Feld zu erstellen, das eine Manipulation erfordert - du würdest deine Trim-Anweisung in die '' einfügen OnCalcFields() 'Methode. Dies würde bedeuten, dass der Datensatz dann 2 'Versionen' jedes Datums hätte –

Verwandte Themen