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:
- 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)
- Trimmen durch sQL-Befehle nicht funktioniert (Leerzeichen von foxpro Abfrage erstellt wird, sind die Tabellen „clean“)
- 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
- 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?
Warum trim() in Delphi ** code ** nicht einfach, wenn die Daten auf dem Weg von DBase nach Excel sind? –
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
.. 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