Ist ihr beliebiger Befehl in Foxpro, die den DBF in ein bestimmtes Excel-Blatt konvertieren. Ich habe drei DBF (dbf_1, dbf_2, dbf_3). Mein aktuelles Programm konvertiert die Datei unter Verwendung Kopie in "filename.xls" Typ fox2x und dann werde ich manuell die Konsolidierung aller Blatt in eine Excel kopieren. Für mich ist diese Methode, die ich benutze, in Ordnung, aber was ist, wenn sie 20 oder mehr dbf sind, die ich konsolidieren werde. Ist ihr beliebiger Befehl in FoxPro, der die DBFs in eine Excel-Datei konvertiert. Ich benutze bereits die foxpro Automation, aber es ist zu langsam.COPY TO Excel Blatt in Foxpro
Antwort
Nein, gibt es nicht.
Auch "kopieren zu ... typ fox2x". obwohl besser als viele andere type selektionen (wie csv und xls) sollte nicht gewählt werden, wenn es bessere möglichkeiten gibt.
Sie sagen, Automatisierung ist langsam, aber nicht wissen, ob Sie wirklich Automatisierung langsam finden, oder wenn Sie es auf die Weise versucht haben, die Sie nicht verwenden sollten, um Daten nach Excel zu übertragen. Im folgenden Beispiel verwenden Sie eine der Varianten meiner "vfp2excel" -Funktion und -Automation. Es überträgt die Daten von Kunden, Mitarbeitern, Bestellungen, OrdItems und Produkten in 2,5 Sekunden auf meinem Rechner. Wenn Sie es wirklich so langsam dann keinen Würfel gemeint, sonst ist hier die Probe:
* These represent complex SQL as a sample
Select emp_id,First_Name,Last_Name,;
Title,Notes ;
from (_samples+'\data\employee') ;
into Cursor crsEmployee ;
readwrite
Replace All Notes With Chrtran(Notes,Chr(13)+Chr(10),Chr(10))
Select cust_id,company,contact,Title,country,postalcode ;
from (_samples+'\data\customer') ;
into Cursor crsCustomer ;
nofilter
Select * ;
from (_samples+'\data\orders') ;
into Cursor crsOrders ;
nofilter
Select * ;
from (_samples+'\data\orditems') ;
into Cursor crsOrderDetail ;
nofilter
Select * ;
from (_samples+'\data\products') ;
into Cursor crsProducts ;
nofilter
* Now we want to get these on 3 sheets
* Sheet1: Employees only
* Sheet2: Customers only
* Sheet3: Orders, ordItems, Products layed out horizontally
Local oExcel
oExcel = Createobject("Excel.Application")
With oExcel
.DisplayAlerts = .F.
.Workbooks.Add
.Visible = .T.
With .ActiveWorkBook
For ix = 1 To 3 && We want 3 Sheets
If .sheets.Count < m.ix
.sheets.Add(,.sheets(.sheets.Count)) && Add new sheets
Endif
Endfor
* Name the sheets
.WorkSheets(1).Name = "Employees"
.WorkSheets(2).Name = "Customers"
.WorkSheets(3).Name = "Order, OrderDetail, Products" && max sheetname is 31 chars
* Start sending data
* First one has headers specified
VFP2Excel('crsEmployee', .WorkSheets(1).Range("A1"), ;
"Id,First Name,Last Name,Employee Title,Comments about employee") && To sheet1, start at A1
VFP2Excel('crsCustomer', .WorkSheets(2).Range("A1")) && To sheet2, start at A1
VFP2Excel('crsOrders', .WorkSheets(3).Range("A1")) && To sheet3, start at A1
* Need to know where to put next
* Leave 2 columns empty - something like 'G1'
lcRange = _GetChar(.WorkSheets(3).UsedRange.Columns.Count + 3) + '1'
* To sheet3, start at next to previous
VFP2Excel('crsOrderDetail', .WorkSheets(3).Range(m.lcRange))
lcRange = _GetChar(.WorkSheets(3).UsedRange.Columns.Count + 3) + '1'
* To sheet3, start at next to previous
VFP2Excel('crsProducts', .WorkSheets(3).Range(m.lcRange))
#Define xlJustify -4130
#Define xlTop -4160
* I just happen to know notes in at column 5 from SQL
* No need to query from excel to keep code simple
* Lets format that column specially instead of leaving
* at the mercy of Excel's autofitting
.WorkSheets(1).UsedRange.VerticalAlignment = xlTop && set all to top
With .WorkSheets(1).Columns(5)
.ColumnWidth = 80 && 80 chars width
.WrapText = .T.
* .HorizontalAlignment = xlJustify && doesn't work good always
Endwith
* Finally some cosmetic stuff
For ix=1 To 3
With .WorkSheets(m.ix)
.Columns.AutoFit
.Rows.AutoFit
Endwith
Endfor
.WorkSheets(1).Activate
Endwith
Endwith
* Author: Cetin Basoz
* This is based on earlier VFP2Excel function codes
* that has been published on the internet, at various sites
* since 2001. Not to be messed with others' code who named the same but has
* nothing to do with the approaches taken here (unless copy & pasted and claimed
* to be their own work, <s> that happens).
Procedure VFP2Excel(tcCursorName, toRange, tcHeaders, tnPrefferredWidthForMemo)
* tcCursorName
* toRange
* tcHeaders: Optional. Defaults to field headers
* tnPrefferredWidthForMemo: Optional. Default 80
* Function VFP2Excel
tcCursorName = Evl(m.tcCursorName,Alias())
tnPrefferredWidthForMemo = Evl(m.tnPrefferredWidthForMemo,80)
Local loConn As AdoDB.Connection, loRS As AdoDB.Recordset,;
lcTemp,lcTempDb, oExcel,ix, lcFieldName, lcHeaders
lnSelect = Select()
lcTemp = Forcepath(Sys(2015)+'.dbf',Sys(2023))
lcTempDb = Forcepath(Sys(2015)+'.dbc',Sys(2023))
Create Database (m.lcTempDb)
Select * From (m.tcCursorName) Into Table (m.lcTemp) Database (m.lcTempDb)
Local Array aMemo[1]
Local nMemoCount
nMemoCount = 0
lcHeaders = ''
For ix = 1 To Fcount()
lcFieldName = Field(m.ix)
If Type(Field(m.ix))='M'
nMemoCount = m.nMemoCount + 1
Dimension aMemo[m.nMemoCount]
aMemo[m.nMemoCount] = m.ix
Replace All &lcFieldName With Chrtran(&lcFieldName,Chr(13)+Chr(10),Chr(10))
Endif
lcHeaders = m.lcHeaders + Iif(Empty(m.lcHeaders),'',',')+Proper(m.lcFieldName)
Endfor
tcHeaders = Evl(m.tcHeaders,m.lcHeaders)
Use In (Juststem(m.lcTemp))
Close Databases
Set Database To
loStream = Createobject('AdoDb.Stream')
loConn = Createobject('ADODB.Connection')
loRS = Createobject("ADODB.Recordset")
loConn.ConnectionString = "Provider=VFPOLEDB;Data Source="+m.lcTempDb
loConn.Open()
loRS = loConn.Execute("select * from "+m.lcTemp)
loRS.Save(loStream)
loRS.Close
loConn.Close
Erase (m.lcTemp)
* Use first row for headers
Local Array aHeader[1]
loRS.Open(loStream)
toRange.Offset(1,0).CopyFromRecordSet(loRS) && Copy data starting from headerrow + 1
Set Safety Off
Delete Database (m.lcTempDb) Deletetables
Select (m.lnSelect)
For ix=1 To Iif(!Empty(m.tcHeaders), ;
ALINES(aHeader, m.tcHeaders,1,','), ;
loRS.Fields.Count)
toRange.Offset(0,m.ix-1).Value = ;
Iif(!Empty(m.tcHeaders), ;
aHeader[m.ix], ;
Proper(loRS.Fields(m.ix-1).Name))
toRange.Offset(0,m.ix-1).Font.Bold = .T.
Endfor
#Define xlJustify -4130
#Define xlTop -4160
* This part is cosmetic
toRange.WorkSheet.Activate
With toRange.WorkSheet.UsedRange
.VerticalAlignment = xlTop && set all to top
For ix=1 To m.nMemoCount
With .Columns(aMemo[m.ix])
.ColumnWidth = m.tnPrefferredWidthForMemo && 80 chars width
.WrapText = .T.
Endwith
Endfor
.Columns.AutoFit
.Rows.AutoFit
Endwith
Endproc
* Return A, AA, BC etc noation for nth column
Function _GetChar
Lparameters tnColumn && Convert tnvalue to Excel alpha notation
If m.tnColumn = 0
Return ""
Endif
If m.tnColumn <= 26
Return Chr(Asc("A")-1+m.tnColumn)
Else
Return _GetChar(Int(Iif(m.tnColumn % 26 = 0,m.tnColumn - 1, m.tnColumn)/26)) + ;
_GetChar((m.tnColumn-1)%26+1)
Endif
Endfunc
Dies ist, was ich gesucht habe :-) ich mit meinem Wissen über Excel-Automatisierung Programmierung in Visual FoxPro wurde versucht, aber immer Fehler bekommen. Meine Aufgabe war es, "n" Sheets von einem großen Cursor zu erstellen, den ich bezüglich der Kundenauswahl des Attributnamens vom Cursor analysieren möchte, um auch "n" Blätter zu erhalten. Dieses Beispiel ist für 3 Cursor und 3 Blätter und es ist generisch. Aber ich brauche diese für „n“ Cursor und ein Attribut die Kunden zu deutlichen wählen und bekommen „n“ Sheets in einer Excel Datei. So, jetzt habe ich dynamische Verfahren. Ich habe diesen Code angepasst und löste mein Problem, das ich für ungefähr 4 Tage zu beenden versuche. Also noch einmal vielen Dank für diesen Code und natürlich werde ich nicht ändern VFP2Excel Verfahren und schrieb woanders mein Name. Danke für die Hilfe !
Es gibt keine nativen VFP-Funktion, dies zu tun, aber es ist ein wunderbares Open-Source-Projekt, das eine Klasse hat, der dies sehr einfach machen:
VFPX Arbeitsmappe Xlsx (siehe hier) : https://vfpx.codeplex.com/wikipage?title=XLSXWorkbook
Es verfügt über 3 magische Funktionen, die genau das tun, was Sie gefragt:
- CreateWorkbook()
- AddSheet()
- SaveTableToWorkbook()
(Repeat-Befehle 2 und 3 für jede DBF/Sheet Sie erstellen möchten)
Es ist gut dokumentiert, mit einem 54-seitigen PDF und Code Probe, die alles erklärt, was Sie wissen müssen.
- 1. Wie HTML-Tabelle copy-paste-able to Excel
- 2. Ant Copy-Datei in Blatt-Verzeichnis
- 3. Excel-Blatt Name Fehler
- 4. Kopie Excel-Blatt (mit Diagrammen) zu einem anderen Excel-Blatt
- 5. VFP 5 COPY TO Befehl
- 6. Postgres COPY TO NULL Ganzzahlen
- 7. Daten extrahiert von Acces to Excel wird automatisch zu mehr Blatt als das definierte Blatt
- 8. Excel Blatt mit Birne
- 9. ASP.NET manuplating Excel-Blatt
- 10. Excel-Blatt Projektreferenzen
- 11. Verwenden von Excel 2010 mit Visual FOXPRO
- 12. hold-to-copy in der uiwebview-Unterklasse
- 13. Drucken Embedded Excel-Blatt
- 14. Matlab Laden alten Excel-Blatt
- 15. Format Liste in einem Excel-Blatt, um ein anderes Blatt
- 16. herunterladen alle Spalte in Excel-Blatt
- 17. Drools zu Regel Excel-Blatt
- 18. Pandas Dataframe zu Excel Blatt
- 19. Schreiben Sie MS Excel-Blatt
- 20. Design Tische für Daten in Excel-Blatt
- 21. importieren Sie Excel-Blatt in Winform
- 22. Excel VBA mehrere Diagramme in neues Blatt
- 23. Wie schneidet man Excel-Blatt in VBA
- 24. Pass Zeilennummer als Variable in Excel-Blatt
- 25. Finding Wert von Excel-Blatt in Python
- 26. Exportieren von Daten in Excel-Blatt
- 27. Google Formular speichern in Excel-Blatt
- 28. müssen Excel Blatt in Benutzer Desktop erstellen
- 29. Excel-Blatt Kopie zu einem anderen Excel in asp.net
- 30. Kopieren Excel Blatt Daten auf ein anderes Blatt mit C#
Vielen Dank für Ihre Hilfe.Mein Problem in Foxpro Automation ist, dass in meinem Bericht übertreffen viele Formeln enthalten sind, warum es sehr langsam ist. Ich überlege gerade, wie man ein bestimmtes Blatt in die FoxPro Automation kopiert, so dass ich nach dem Übertragen der Daten in Excel die Blätter mit der Formel in die Arbeitsblätter kopieren werde. – Vic
Ich glaube, du hast den Code nicht gelesen. Sie können die Tabelle (n) mit der Formel als Vorlage speichern und die neue Excel-Arbeitsmappe basierend auf dieser Vorlage hinzufügen, oder Sie können die Formel für mehrere Zellen gleichzeitig schreiben. Oder es werden nur einzelne Befehle benötigt, um die Arbeitsblätter von einer anderen Arbeitsmappe in eine Arbeitsmappe zu kopieren. –