Achtergronden genereren van ods formaat bestanden

In eerste instantie gebruikte ik hiervoor de odfpy bibliotheek.

Die blijkt niet al te best bruikbaar,

  • het is baggertraag (voor kleinere bestanden met minder dan 10000 resultaten al gauw een factor 50 trager dan het maken van een zip download).
  • Bovendien slurpt het excessief veel geheugen, bij iets grotere bestanden gaat het systeem swappen!

Ik denk dat het proces zal crashen als het geheugengebruik maar groot genoeg wordt. In elk geval is het vastlopen van het hele systeem bepaald niet denkbeeldig!!

Kortom ik ben nu op zoek naar een eigen aanpak. Immers er is maar een heel beperkte set van alle mogelijkheden van een spreadsheet nodig, nl alleen het vullen met data.


Aanpak:

  1. het ods bestand is een ziparchief met daarin de bestanden:
    • content.xml (hierin zit alle data)
    • meta.xml (hierin zit metadata, per run aanpassen, datum/tijd van aanmaak)
    • styles.xml (stijl info, hoeft waarschijnlijk niet per run aangepakt te worden)
    • mimetype (definitie van het gebruikte mime, Multipurpose Internet Mail Extensions) vast
    • de map META-INF het bestand manifest.xml (ook vast)
  2. ik ga een vaste structuur opbouwen in een aparte map met de vaste bestanden (meta.xml, styles.xml, mimetype, META-INF/manifest.xml)
  3. per run maak ik in die vaste structuur het bestand content.xml, vervolgens zip ik de complete inhoud van de map en geef het zip bestand een ods extentie. Dit kan omdat via het wachtrij mechanisme van downloads ervoor gezorgd wordt dat alle downloads achter elkaar gemaakt worden!!

Resultaat: ongeveer 10 keer sneller dan odfpy. LET OP: vanwege lettertekens met accenten en dergelijke moet het content.xml bestand gemaakt worden met encoding='iso-8859-15' en het schrijven naar het xml bestand moet ook gebeuren met: textdoc.write( string.encode("latin-1") )

Het ruimtebeslagprobleem blijft!