2011-08-22 4 views
1

J'utilise Apache POI pour créer un fichier Excel [.xls]. Maintenant, un Excel peut avoir 65535 lignes & 256 cols. J'essaye d'écrire le code de Java pour écrire le dossier de xls avec les cellules 65535x256. Je reçois une erreur de tas. Le conf de tas actuel est -Xms512m -Xmx1700m. La taille de la RAM est de 3,5 Go.Erreur de tas lors de l'écriture d'un fichier xls avec Apache POI

Quelle est la solution pour moi? J'utilise des classes HSSF * pour écrire des fichiers xls.

Stack Trace est (j'ai permis à l'verbose: l'option gc)

[Full GC [Tenured: 1092288K->1092288K(1092288K), 3.3174494 secs] 1583807K->1583807K(1583808K), [Perm : 3351K->3351K(12288K)], 3.3174977 secs] [Times: user=3.30 sys=0.03, real=3.33 secs] 
[Full GC [Tenured: 1092288K->1092288K(1092288K), 3.3073908 secs] 1583807K->1583807K(1583808K), [Perm : 3351K->3351K(12288K)], 3.3074374 secs] [Times: user=3.30 sys=0.01, real=3.31 secs] 
[Full GC [Tenured: 1092288K->9438K(1092288K), 0.3264828 secs] 1583807K->9438K(1583808K), [Perm : 3351K->3351K(12288K)], 0.3265362 secs] [Times: user=0.31 sys=0.00, real=0.31 secs] 
Exception in thread "main" Heap 
def new generation total 491520K, used 44939K [0x02990000, 0x23ee0000, 0x23ee0000) 
    eden space 436928K, 10% used [0x02990000, 0x05572fa8, 0x1d440000) 
    from space 54592K, 0% used [0x1d440000, 0x1d440000, 0x20990000) 
    to space 54592K, 0% used [0x20990000, 0x20990000, 0x23ee0000) 
tenured generation total 1092288K, used 9438K [0x23ee0000, 0x66990000, 0x66990000) 
    the space 1092288K, 0% used [0x23ee0000, 0x24817810, 0x24817a00, 0x66990000) 
compacting perm gen total 12288K, used 3357K [0x66990000, 0x67590000, 0x6a990000) 
    the space 12288K, 27% used [0x66990000, 0x66cd7778, 0x66cd7800, 0x67590000) 
No shared spaces configured. 
java.lang.OutOfMemoryError: Java heap space 
    at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:147) 
    at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:125) 
    at org.apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.java:103) 
    at com.test.ExcelWriter.createWorkbook(ExcelWriter.java:119) 
    at com.test.TestMe2.main(TestMe2.java:38) 
+0

Pouvez-vous publier la trace de la pile? Est-ce une erreur pour la mémoire permgen? – Pushkar

+0

posté la trace de la pile –

+4

Vous créez un énorme fichier Excel. Vous pourriez envisager d'utiliser le format csv au lieu d'utiliser les classes HSSF * ... ce serait probablement moins cher de la mémoire. – VirtualTroll

Répondre

2

Essayez de régler les Xms et Xmx à la même valeur à savoir

-Xms1700m -Xmx1700m 

Est-ce que ce travail pour vous?

public static void main(String[] args) { 
    try { 
    FileOutputStream fileOut = new FileOutputStream("poi-test.xls"); 
    HSSFWorkbook workbook = new HSSFWorkbook(); 
    CreationHelper createHelper = workbook.getCreationHelper(); 
    HSSFSheet worksheet = workbook.createSheet("POI Worksheet"); 

    for(int i=0; i<20000; i++) { 
     Row row = worksheet.createRow(i);    
     row.createCell(0).setCellValue(createHelper.createRichTextString("row " + i));     
    }    

    fileOut.flush(); 
    workbook.write(fileOut); 
    fileOut.close();    
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 
+0

ne fonctionne pas :-( –

+0

même exception? Pouvez-vous poster le code? Il devrait être possible de faire sans tenir le document entier en mémoire, aussi le point d'Amine est sur place ici, vous pouvez écrire le fichier au format CSV et l'ouvrir dans Excel – eon

1

J'ai continué à obtenir les problèmes avec le fichier xls. Finalement, j'ai dû convaincre le client pour un format csv. Maintenant, je suis capable d'exporter plus de 20000 enregistrements. Merci @Amine, @Apache Fan, @eon pour vos précieuses suggestions.

Questions connexes