Question

Je cherche à écrire dans un fichier Excel (.xls MS Excel 2003 Format) fichier en utilisant Java programatically. Les fichiers de sortie Excel peuvent contenir ~ 200.000 lignes que je prévois de partager sur le nombre de feuilles (64k lignes par feuille, en raison de la limite Excel).

Je l'ai essayé d'utiliser les API de POI apache mais il semble être un porc de mémoire en raison du modèle d'objet API. Je suis obligé d'ajouter des cellules / feuilles à l'objet de classeur en mémoire et une seule fois toutes les données sont ajoutées, je peux écrire le classeur dans un fichier! Voici un exemple de la façon dont l'apache recommande i écrire des fichiers Excel à l'aide de leur API:

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");

//Create a row and put some cells in it
Row row = sheet.createRow((short)0);

// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Il est clair que, l'écriture de lignes ~ 20k (avec quelques colonnes 10-20 dans chaque rangée) me donne la redoutée « java.lang.OutOfMemoryError: espace de tas Java ».

J'ai essayé heapsize initiale JVM croissante et la taille de tas max en utilisant Xms et paramètres Xmx comme Xms512m et Xmx1024. Encore ne peux pas écrire plus de 150k lignes au fichier.

Je cherche un moyen de diffuser vers un fichier excel au lieu de construire le fichier entier en mémoire avant de l'écrire sur le disque qui nous l'espérons économiser beaucoup d'utilisation de la mémoire. Une API ou solutions seraient appréciés, mais je suis limité à l'utilisation de Java. Merci! :)

Était-ce utile?

La solution

Toutes les API Java existantes tentent de construire le document entier dans la mémoire vive à la fois. Essayez d'écrire un fichier XML conforme au nouveau format de fichier XSLX à la place. Pour commencer, je vous suggère de construire un petit fichier sous la forme souhaitée dans Excel et enregistrez-le. Ouvrez ensuite et examiner la structure et remplacer les pièces que vous voulez.

Wikipedia a un .

Autres conseils

Essayez d'utiliser SXSSF , thats grande chose pour d'énormes documents xls, son document de construction et ne pas manger RAM du tout, en utilisant becase nio

Je devais partager mes fichiers en plusieurs fichiers Excel afin de surmonter l'exception de l'espace de tas. Je me suis dit que près de 5 km des lignes avec 22 colonnes était à ce sujet, donc je viens de faire ma logique pour que chaque rangée 5k je finirais le fichier, commencer une nouvelle et juste numerate les fichiers en conséquence.

Dans les cas où j'avais 20k + lignes à écrire j'aurais 4+ différents fichiers représentant les données.

Jetez un oeil à la HSSF sérialiseur du projet cocon .

  

Le sérialiseur HSSF attrape événements SAX et crée une feuille de calcul dans le format XLS utilisé par Microsoft Excel

Il y a aussi JExcelApi, mais ses utilisations plus de mémoire. Je pense que vous devez créer .csv et l'ouvrir dans Excel. il vous permet de passer beaucoup de données, mais vous ne serez pas en mesure de faire une « Excel magique ».

Pensez à utiliser le format CSV. De cette façon, vous n'êtes pas limité par la mémoire plus --Bien, peut-être que pendant préremplissant les données pour CSV, mais cela peut être fait efficacement ainsi, par exemple des sous-ensembles de lignes interrogation de DB en utilisant par exemple LIMIT/OFFSET et écrire immédiatement à déposer au lieu de transporter la totalité du contenu de la table DB dans la mémoire de Java avant d'écrire une ligne. La limitation Excel des lignes de quantité dans une « feuille » augmentera à environ un million.

Cela dit, si les données sont effectivement en provenance d'un DB, alors je serais obligé de bien si Java est reconsidère le bon outil pour cela. La plupart des DBs décents ont une fonction d'exportation à CSV qui peut effectuer cette tâche beaucoup plus efficace indubitablement. En cas de MySQL par exemple, vous pouvez utiliser le LOAD DATA INFILE commande pour cela.

Nous avons développé une bibliothèque java à cet effet et il est actuellement disponible en tant que projet open source https: // github .com / jbaliuka / x4j-analytique . Nous l'utilisons pour le reporting opérationnel. Nous générons d'énormes fichiers Excel, ~ 200 000 devraient fonctionner sans problème, Excel parvient à ouvrir ces fichiers aussi. Notre code utilise POI pour charger le modèle, mais le contenu généré est transmis en continu directement fichier XML ou sans couche modèle d'objet en mémoire.

Est-ce problème de mémoire se produit lorsque vous insérez des données dans la cellule, ou lorsque vous effectuez le calcul / génération de données?

Si vous allez charger des fichiers dans un fichier Excel qui se composent de format modèle statique prédéfini, alors mieux d'enregistrer un modèle et de réutiliser plusieurs fois. Normalement les cas modèle se produisent lorsque vous allez générer un rapport quotidien des ventes ou etc ...

Sinon, chaque fois que vous avez besoin de créer une nouvelle ligne, frontière, colonne etc à partir de zéro.

Jusqu'à présent, Apache POI est le seul choix que je trouve.

"Il est clair que, l'écriture ~ lignes de 20k (avec quelques colonnes 10-20 dans chaque rangée) me donne la redoutée "java.lang.OutOfMemoryError:"." Espace de tas Java

"Enterprise IT"

Qu'est-ce que vous pouvez faire effectuer l'insertion des est- données par lots. Créer une table queuetask, à chaque fois après générer 1 page, reste pendant quelques secondes, puis continuer la deuxième partie. Si vous êtes inquiétude au sujet des changements de données dynamiques au cours de votre tâche de file d'attente, vous pouvez d'abord obtenir la clé primaire dans Excel (en se cachant et verrouiller la colonne de vue de l'utilisateur). première manche sera insérer la clé primaire, puis la deuxième course de file d'attente en avant sera lue dans le bloc-notes et faire la partie de tâche en partie.

Nous avons quelque chose de très similaire, même quantité de données, et nous avons dû passer à JExcelApi parce que POI est si lourd sur les ressources. Essayez JExcelApi, vous ne le regretterez pas lorsque vous devez manipuler de gros fichiers Excel-!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top