2017-09-26 4 views
1

J'essaie de créer des feuilles Excel en utilisant la fonction spreadsheetaddrows de coldfusion. Étant donné que les tableaux que je crée à partir de feuilles de calcul peuvent être très volumineux, je crée le fichier Excel en morceaux pour éviter de temporiser le serveur. Tout fonctionne bien au début, mais au fur et à mesure que le processus se poursuit, il ralentit vraiment. Par exemple, je testais avec une table qui avait 50 000 lignes et plus et près de 100 colonnes. Cinq heures plus tard, le fichier Excel n'avait même pas atteint 10 000 lignes. = TUne alternative plus rapide aux tabledadadows en coldfusion?

Il semble que spreadsheetaddrows est le problème selon google. Y a-t-il un moyen plus rapide et meilleur pour moi de faire cela?

<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

Avez-vous essayé ''? Si oui, comment cela s'est-il passé? –

+0

Cela ne fonctionnera pas dans mon cas, car j'ai besoin de mettre à jour le fichier de feuille de calcul plusieurs fois, et je ne pense pas que vous pouvez mettre à jour les fichiers avec la balise cfspreadsheet. – Solace

+0

J'ai utilisé https://github.com/cfsimplicity/lucee-spreadsheet pour des feuilles de calcul contenant des milliers de lignes (mais pas 50k +) et cela a bien fonctionné. Peut-être voudra-t-il tenter le coup (vous libère aussi d'être coincé avec ACF si vous souhaitez déménager à Lucee). – Abram

Répondre

0

J'étais curieux donc j'ai essayé une autre approche. Le code ci-dessous s'exécute avec succès et rapidement avec un petit jeu de données. Pour ce que vous faites, cela peut être encore lent et cela peut créer des problèmes d'espace de tas Java, mais cela vaut probablement la peine d'être photographié.

Première - Obtenez les résultats de votre requête dans une feuille de calcul.

<cfquery name="dbdata" datasource="dw"> 
select query goes here 
</cfquery> 

<cfspreadsheet action="write" overwrite="yes" query="dbdata" filename="#completeFileName#"> 

Ensuite, lisez cette feuille de calcul, faites ce que vous avez à faire, et mettre à jour le fichier.

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

En ouvrant le fichier dans Excel, ligne 1 avait des en-têtes de colonne à partir des résultats de la requête, et la cellule A2 contenait «nouvelle valeur.