Ich habe Delpi 5 Professional. Ich muss Daten von DBASE nach EXCEL97 konvertieren. Geht das über die BDE? Wie speichere ich die Datei?
Announcement
Collapse
No announcement yet.
In EXCEL97 Datei schreiben
Collapse
X
-
Hallo Andreas,
versuch es über einen BDE-Alias, der ODBC als Treiber und dort eine Data Source für Excel-Tabellen verwendet.
Zuerst den ODBC Treiber für Excel installieren und eine Data Source dafür einrichten. Anschließend definierst Du in der BDE einen ODBC-Alias für diese Data Source. Mit diesem Alias kannst Du dann in Delphi z.B. eine TTable öffnen und damit auf die Excel-Tabelle zugreifen.
Aber wenn Du mit D5 arbeitest, warum verwendest Du nicht die OLE-Server für Excel. Das ist sicher komfortabler als über die BDE. Ich guck mal nach einem Bsp.
Gruß FalWenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.
Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!
-
Hallo,
ich hab noch ein bißchen was rausgekürzt (ich hoffe nicht zu viel ;-).
Der Vorteil dieser Variante ist die volle Kontrolle über das Excel-Sheet, also nicht nur Daten reinschreiben sondern eben auch Formatierung, Berechnung etc. - eben (fast) alles was man in Excel in VB machen kann.
AppExcel:Variant;<br>
<br>
function Tfrm_Main.ExcelConnect: Boolean;<br>
begin<br>
if not FExcelConnected then<br>
begin<br>
try<br>
AppExcel := CreateOleObject('Excel.Application');<br>
FExcelConnected := True;<br>
Result := True;<br>
except<br>
Result := False;<br>
raise;<br>
end;<br>
end<br>
else Result := True;<br>
end;<br>
<br>
procedure Tfrm_Main.ExcelDisconnect;<br>
begin<br>
if FExcelConnected then<br>
begin<br>
{CloseDok;}<br>
try<br>
AppExcel.Quit;<br>
finally<br>
FExcelConnected := False;<br>
AppExcel := 0;<br>
end;<br>
end;<br>
end;<br>
<br>
function Tfrm_Main.ExcelExport;<br>
var<br>
FWS, FWB, FWC: Variant;<br>
I, J: Integer;<br>
begin<br>
if ExcelConnect then<br>
try<br>
FWB := AppExcel.Workbooks.Add(xlWBATWorksheet);<br>
FWS := FWB.WorkSheets.Item[1];<br>
with DT_ADOQuery do<br>
begin<br>
for I := 0 to FieldCount - 1 do<br>
begin<br>
FWC := FWS.Cells[1, I + 1];<br>
{FWC.NumberFormat := 'Text';}<br>
FWC.Value := DT_ADOQuery.FieldDefs[I].Name;<br>
end;<br>
First;<br>
J := 2;<br>
while not EOF do<br>
begin<br>
for I := 0 to FieldCount - 1 do<br>
begin<br>
FWC := FWS.Cells[J, I + 1];<br>
{FWC.NumberFormat := 'Text';}<br>
FWC.Value := DT_ADOQuery.Fields[I].AsString;<br>
end;<br>
Next;<br>
Inc(J);<br>
end;<br>
FWB.Close(True);<br>
Result := True;<br>
end;<br>
except<br>
Result := False;<br>
MessageDlg('Datenexport zu MS Excel nicht möglich!', mtError, [mbOK], 0);<br>
raise;<br>
end<br>
else begin<br>
MessageDlg('Datenexport zu MS Excel nicht möglich!', mtError, [mbOK], 0);<br>
Result := False;<br>
end;<br>
end;<br>
<br>
procedure Do_Excel;<br>
begin<br>
if ExcelExport then MessageDlg('Exceltabelle erfolgreich erstellt!', mtInformation, [mbOK], 0)<br>
else MessageDlg('Exceltabelle konnte nicht erstellt werden!', mtInformation, [mbOK], 0);<br>
end;<br>
<br>
Gruß FalWenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.
Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!
Comment
-
Hallo Andreas,
wenn Du nur schnell mal eine Tabelle oder eine SQL-Ergebnis-Tabelle übertragen willst, hat sich bei mir folgender Code bewährt, den ich eine allgemeinen Unit abgespeichert habe und durch
InitDB.ExportExcel(dbquSQL);
von überall aus aufgerufen werden kann.
procedure TInitDB.ExportExcel(DataSet: TDBDataSet);<br>
var<br>
..sWert : String;<br>
..Excel : Variant;<br>
..iSpalte,<br>
..iZeile : Integer;<br>
<br>
begin<br>
..try<br>
....Excel:=CreateOleObject('Excel.Application');<b r>
..except<br>
....ShowMessage('Excel konnte nicht gestartet werden!');<br>
....Exit;<br>
..end;<br>
..Excel.Visible:=true;<br>
..Excel.Workbooks.Add;<br>
<br>
..for iSpalte:=1 to DataSet.FieldCount do<br>
....Excel.Cells[1, iSpalte].Value:=DataSet.Fields[iSpalte-1].FieldName;<br>
<br>
..DataSet.First;<br>
..iZeile:=1;<br>
..while not DataSet.EOF do<br>
..begin<br>
....for iSpalte:=1 to DataSet.FieldCount do<br>
....begin<br>
......sWert:=DataSet.Fields[iSpalte-1].AsString;<br>
{ Alle Typen : ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor }
{ unbehandelte Typen: ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor }
......if DataSet.Fields[iSpalte-1].DataType in [ftFloat, ftCurrency] then<br>
......begin<br>
........if pos(',', sWert)>0 then sWert[pos(',', sWert)]:='.'<br>
......end<br>
......else if DataSet.Fields[iSpalte-1].DataType in [ftString] then<br>
........sWert:=#39+sWert;<br>
......Excel.Cells[iZeile+1, iSpalte].Value:=sWert;<br>
....end;<br>
....DataSet.next;<br>
....inc(iZeile);<br>
..end;<br>
end;<br>
Comment
Comment