2017-09-26 1 views
1

Ich versuche, Excel-Tabellen mit Coldfusion-Tabellenkalkulationsfunktion zu erstellen. Da die Tabellen, aus denen ich Kalkulationstabellen erzeuge, sehr groß sein können, erstelle ich die Excel-Datei in Blöcken, um den Server nicht zu verzögern. Alles funktioniert zunächst gut, aber im Laufe des Prozesses wird es wirklich langsamer. Zum Beispiel habe ich mit einer Tabelle getestet, die 50.000 plus Zeilen und fast 100 Spalten hatte. Fünf Stunden später hatte die Excel-Datei nicht einmal 10.000 Zeilen erreicht. = TSchnellere Alternative zu Tabellenkappen in der Coldfusion?

Es scheint, dass Google Tablestread das Problem ist. Gibt es dafür einen schnelleren und besseren Weg?

<cfloop index="i" from="#start#" to="#end#" step="10"> 
<!-- variables --> 
<cfset plus = #i# + 9> 
<cfif #plus# gt #end#> 
<cfset plus = #end#> 
</cfif> 
<!-- /variables --> 


<!-- get i to i+9 records --> 
<cfquery name="query" datasource="datasource"> 
    select * 
    from (select a.*, rownum rnum 
      from (select * from table order by id) a 
      where rownum <= #plus# 
     ) 
    where rnum >= #i# 
</cfquery> 

<cfif it's the first time doing this> 
    <!-- import from database query and save as excel sheet --> 
    <cfset spreadsheetAddRows(theSheet, query)> 

    <cfif reached the end of the query> 
    <cfspreadsheet action = "write" 
    overwrite = "true" 
    filename = "file.xls" 
    name="theSheet" 
    > 

    </cfif> 

<cfelseif 2nd or more time doing this> 
    <!-- add new rows to excel object --> 
    <cfset spreadsheetAddRows(temp, query)> 

    <!-- overwrite existing xls file with new data --> 
    <cfspreadsheet action="write" 
        overwrite="true" 
        filename="file.xls" 
        name="temp" 
    > 
</cfif> 

+0

Haben Sie versucht, ''? Wenn ja, wie ist das zustande gekommen? –

+0

Das funktioniert in meinem Fall nicht, weil ich die Tabellenkalkulationsdatei mehrmals aktualisieren muss, und ich glaube nicht, dass Sie Dateien mit dem cfspreadsheet-Tag aktualisieren können. – Solace

+0

Ich habe https://github.com/cfsimplicity/lucee-spreadsheet für Kalkulationstabellen mit Tausenden von Zeilen (obwohl nicht 50k +) verwendet und es hat sich gut entwickelt. Vielleicht wollen Sie es versuchen (auch befreit Sie davon, mit ACF stecken, wenn Sie nach Lucee ziehen wollen). – Abram

Antwort

0

Ich war neugierig, so dass ich einen anderen Ansatz versucht. Der folgende Code wird erfolgreich und schnell mit einem kleinen Datensatz ausgeführt. Für das, was Sie tun, könnte dies immer noch langsam sein und es könnte Java-Heap-Space-Probleme verursachen, aber es ist wahrscheinlich einen Versuch wert.

Erstens - Holen Sie Ihre Abfrageergebnisse in eine Tabelle.

Dann lesen Sie diese Tabelle, tun, was Sie tun müssen, und aktualisieren Sie die Datei.

<cfscript> 
abc = spreadsheetread(completefilename); 
spreadsheetsetcellvalue(abc, 'new value', 2, 1); 
spreadsheetwrite(abc, completeFileName, true); 
</cfscript> 

wenn ich die Datei in Excel geöffnet, Reihe 1 hatten Spaltenüberschriften aus den Abfrageergebnissen und Zelle A2 enthaltenen neuen Wert '.

Verwandte Themen