Erreur lors de la Lecture de Gros Fichiers Excel (xlsx) Via Apache POI
Je suis en train de lire les gros fichiers excel xlsx via Apache POI, dire de 40 à 50 MO. Je suis sortir de mémoire exception. Le courant de segment de mémoire est de 3 go.
Je peux lire les petits fichiers excel sans aucun problème. J'ai besoin d'un moyen de lire les gros fichiers excel, puis en réponse par le Printemps excel vue.
public class FetchExcel extends AbstractView {
@Override
protected void renderMergedOutputModel(
Map model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String fileName = "SomeExcel.xlsx";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
OPCPackage pkg = OPCPackage.open("/someDir/SomeExcel.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(pkg);
ServletOutputStream respOut = response.getOutputStream();
pkg.close();
workbook.write(respOut);
respOut.flush();
workbook = null;
response.setHeader("Content-disposition", "attachment;filename=\"" +fileName+ "\"");
}
}
J'ai d'abord commencé à l'aide de XSSFWorkbook workbook = new XSSFWorkbook(FileInputStream in);
mais c'était coûteux par Apache POI API, donc je suis passé à l'OPC paquet façon, mais toujours le même effet. Je n'ai pas besoin d'analyser ou traiter le fichier, il suffit de le lire et de le retourner.
Essayez SXSSF poi.apache.org/spreadsheet/index.html
J'ai besoin d'un exemple. J'ai chercher sur le web mais ne peut pas trouver un exemple pour la lecture de grandes feuilles via SXSSF, autrement, n'aurait pas posé la question en premier lieu.
avez-vous cette option? -Xms1024M -Xmx2048M
Tant pis, SXSSF est destiné à écrire de grandes quantités de données. Donner du segment de la JVM, plus de mémoire et éviter que de tels commentaires grossiers.
Avez-vous essayé une connexion ODBC? Peut-être sera une meilleure approche
J'ai besoin d'un exemple. J'ai chercher sur le web mais ne peut pas trouver un exemple pour la lecture de grandes feuilles via SXSSF, autrement, n'aurait pas posé la question en premier lieu.
avez-vous cette option? -Xms1024M -Xmx2048M
Tant pis, SXSSF est destiné à écrire de grandes quantités de données. Donner du segment de la JVM, plus de mémoire et éviter que de tels commentaires grossiers.
Avez-vous essayé une connexion ODBC? Peut-être sera une meilleure approche
OriginalL'auteur jamesT | 2012-10-22
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas de mentionner si vous avez besoin de modifier la feuille de calcul ou pas.
Ce qui peut être évident, mais si vous n'avez pas besoin de modifier la feuille de calcul, vous n'avez pas besoin de l'analyser et de l'écrire, vous pouvez simplement lire les octets du fichier, et d'écrire des octets, comme vous le feriez avec, disons, une image, ou tout autre format binaire.
Si vous avez besoin de modifier la feuille de calcul avant de l'envoyer à l'utilisateur, à ma connaissance, vous pourriez avoir à prendre une approche différente.
Chaque bibliothèque que je suis au courant pour la lecture des fichiers Excel en Java lit toute la feuille de calcul en mémoire, de sorte que vous devez avoir 50 mo d'espace mémoire disponible pour chaque feuille de calcul qui pourraient éventuellement être traitées simultanément. Cela implique, comme d'autres l'ont souligné, en ajustant le segment de mémoire disponible pour la VM.
Si vous avez besoin de traiter un grand nombre de feuilles de calcul simultanément, et il ne peut pas allouer assez de mémoire, pensez à utiliser un format qui peut être diffusé, au lieu de lire tout à la fois dans la mémoire. Le format CSV peut être ouvert par Excel, et j'ai eu de bons résultats dans le passé en paramètre le type de contenu application/vnd.ms-excel, réglage du nom de fichier de l'attachement à quelque chose se terminant en ".xls", mais en fait revenir CSV contenu. Je n'ai pas essayé ce dans une couple d'années, donc, YMMV.
OriginalL'auteur GreyBeardedGeek
Voici un exemple de lire un gros fichier xls en utilisant l'analyseur sax.
Un grand merci pour l'extrait de code. Apache POI devrais poster dans leur documentation, un exemple comme celui ci-dessus pour faire la publicité de ces Api plus facilement.
Merci une tonne!! Pourriez-vous nous dire comment tenir compte des cellules vides d'excel à l'aide du code ci-dessus?
Est-il possible à l'aide d'un itérateur / à base de ligne de base de l'approche? J'aimerais conclure un itérateur autour d'elle avec hasNext() et next() de méthodes, de sorte que l'appelant a le plus d'influence. Dans ce cas, l'approche basée j'ai aucun contrôle sur le progrès, parce que je dois récupérer tous les événements jusqu'à ce qu'aucun des événements sont là.
mais c'est un xlsx analyseur de ne pas xls analyseur 🙁
OriginalL'auteur O.C.
Dans le bellwo exemple, je vais ajouter un code complet comment analyser complet d'un fichier excel (pour moi 60Mo) dans la liste des objets sans aucun problème de "de mémoire" et fonctionnent très bien:
vous devez ajouter un calss qui implémente
Pour plus d'informations visitez cette lien
OriginalL'auteur BERGUIGA Mohamed Amine
J'ai moi aussi été confronté au même problème de OOM lors de l'analyse fichier xlsx...après deux jours de lutte acharnée, j'ai enfin trouvé le code ci-dessous qui a été vraiment parfait;
Ce code est basé sur sjxlsx. Il lit le xlsx et les stocke dans un HSSF feuille.
OriginalL'auteur Meer Nasirudeen