Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ouverture de .xlsm impossible

Sujet résolu
    30 octobre 2014 à 15:24:22

    Bonjour à tous,

    Je me permet de faire appel à vous ne trouvant pas la solution. Je cherche à lire un fichier .xlsm seulement la console me renvoie ce message : 

    Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

    at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3044)

    at org.apache.xmlbeans.impl.store.Cur$CurLoadContext.attr(Cur.java:3065)

    at org.apache.xmlbeans.impl.store.Locale$SaxHandler.startElement(Locale.java:3263)

    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.reportStartTag(Piccolo.java:1082)

    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseAttributesNS(PiccoloLexer.java:1802)

    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseOpenTagNS(PiccoloLexer.java:1521)

    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseTagNS(PiccoloLexer.java:1362)

    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseXMLNS(PiccoloLexer.java:1293)

    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.parseXML(PiccoloLexer.java:1261)

    at org.apache.xmlbeans.impl.piccolo.xml.PiccoloLexer.yylex(PiccoloLexer.java:4812)

    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yylex(Piccolo.java:1290)

    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.yyparse(Piccolo.java:1400)

    at org.apache.xmlbeans.impl.piccolo.xml.Piccolo.parse(Piccolo.java:714)

    at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3479)

    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1277)

    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1264)

    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)

    at org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument$Factory.parse(Unknown Source)

    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:188)

    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:180)

    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:300)

    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:165)

    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:200)

    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:79)

    at essaiXLS.UtilitaireXLS.CreerJTablePlanning(UtilitaireXLS.java:173)

    at essaiXLS.UtilitaireXLS$1.run(UtilitaireXLS.java:362)

    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)

    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:715)

    at java.awt.EventQueue.access$400(EventQueue.java:82)

    at java.awt.EventQueue$2.run(EventQueue.java:676)

    at java.awt.EventQueue$2.run(EventQueue.java:674)

    at java.security.AccessController.doPrivileged(Native Method)

    Avec le même fichier en format .xls tout se déroule bien.

    Ci-joint le code :

    public class UtilitaireXLS {
    
    	public UtilitaireXLS(){
    
    	}	
            
            public static JTable CreerJTablePlanning(File file) throws FileNotFoundException, IOException{
    		//Creer nouvelle table
    		JTable table = new JTable();
    
    		//Lecture du fichier excel
    		InputStream inp = new FileInputStream(file);
    		
    		Workbook wb = null;
    		try {
    			wb = WorkbookFactory.create(inp);
    
    		} catch (InvalidFormatException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		//Recupére page 1 du fichier xls
    		Sheet sheet = wb.getSheetAt(0);
    
    		//compte nombre de lignes
    		int Nrow = sheet.getLastRowNum()+1;
    		System.out.println("nr "+Nrow);
    
    
    		//nombre de colonnes
    		int st = 9;
    		System.out.println(st);
    
    		//créer nouveau tableau d'objet
    		Object[][] o = new Object[Nrow][st];
    
    		//en tete du tableau
    		String[] titre = new String[st];
    		for(int i = 0;i<st;i++){
    			titre[i] = ""+i;
    		}
    
    		//parcours la feuille et on recup les lignes une par une
    		for(int i = 0; i<Nrow;i++){
    			Row row = sheet.getRow(i);
    
    			//parcours la ligne pour récupérer les colonnes
    			if(row!=null){
    				for(int j = 0;j<st;j++){
    					//Récupère la cellule puis sa valeur
    					Cell cell = row.getCell((short)j);
    					Object value = ContenuCellulePlanning(wb,cell,j);
    					//System.out.println(value.toString());
    					o[i][j] = value;
    				}
    			}
    		}
    
    		inp.close();
    		table.setModel(new DefaultTableModel(o, titre));
    		return table;
    	}
    
    	public static void main(String args[]) {
    		java.awt.EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					//Chargement du fichier Planning
    					File planning = new File("/Users/bjb/Desktop/PLANNING ECHANTILLONS.xlsx");
    
    					JTable tableur2 = CreerJTablePlanning(planning);
    
    					//FENETRE PLANNING
    					tableur2.setFont(new Font(Font.SERIF,Font.PLAIN,10));
    
    					JFrame cadre2 = new JFrame();
    					cadre2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    					cadre2.setVisible(true);
    					cadre2.setSize(1200, 500);
    					JScrollPane panel2 = new JScrollPane();
    					panel2.setViewportView(tableur2);
    					cadre2.add(panel2);
    
    
    				}catch (FileNotFoundException ex) {
    					Logger.getLogger(UtilitaireXLS.class.getName()).log(Level.SEVERE, null, ex);
    				}catch (IOException ex) {
    					Logger.getLogger(UtilitaireXLS.class.getName()).log(Level.SEVERE, null, ex);
    				}
    			}
    		});
    	}
    
    }

    D'après la console cela viendrait de là:

    wb = WorkbookFactory.create(inp);

    Mais je ne trouve pas la solution.

    Merci d'avance.

    -
    Edité par BJB 30 octobre 2014 à 15:25:10

    • Partager sur Facebook
    • Partager sur Twitter
      30 octobre 2014 à 15:34:57

      OutOfMemory signifie que ton application manque de mémoire ram et qu'elle ne peut plus rien "retenir"

      Relance ton application et regarde dans le Windows Task Manager l'évolution de sa mémoire ram. Une fois ton application lancée, un nouveau processus du style "java.exe" ou "javaw.exe" (Je ne sais plus) devrait apparaître.

      Regarde l'évolution de la mémoire ram et dis nous quelle est sa valeur quand l'appli plante.

      A partir de là, on pourra déterminer si on doit allouer plus de mémoire à ton application ou bien si tu as une fuite mémoire.

      • Partager sur Facebook
      • Partager sur Twitter
        30 octobre 2014 à 15:47:41

        Dans le moniteur de tâche j'obtiens ça:

        Et ça reste constant pendant l'execution et aussi durant le plantage.

        J'ai essayé d'allouer plus de mémoire en manipulant le fichier eclipse.ini mais ça ne change rien.

        • Partager sur Facebook
        • Partager sur Twitter
          3 novembre 2014 à 8:49:05

          Bonjour, je reviens vers vous car je n'ai toujours pas trouvé la solution.

          J'ai remplacé 

          wb = WorkbookFactory.create(file);

          Par

          InputStream inp = new FileInputStream(file);
          XSSFWorkbook wb = new XSSFWorkbook(inp);

          Mais rien n'y fait, ça ne fonctionne pas.

          Pourtant, comme je l'ai écrit sur le premier post, le même fichier en .xls s'ouvre parfaitement bien.

          Je ne comprend vraiment pas.

          • Partager sur Facebook
          • Partager sur Twitter
            3 novembre 2014 à 10:38:06

            Dans le menu Run -> Run configuration, choisis la configuration qui lance ta classe. Dans le 2ième onglet "Arguments", dans le champ "VM argument", ajoute ceci "-Xmx1024m" et relance ta classe.

            Refais le monitoring de ton processus et partage le nous.

            J'espère que ça aidera...


            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2014 à 15:48:12

              Merci beaucoup d'avoir pris le temps de chercher d'où venait le problème. Mais j'ai pu ouvrir la feuille que je voulais en contournant le problème. J'ai créé une macro excel qui copiait le contenu de ma "feuille 1" vers un nouveau classeur qui se sauvegardait à la fermeture du fichier.

              C'est du bricolage certes mais ça fonctionne et le programme Java est plus rapide car il n'a qu'une feuille à traiter au lieu d'une dizaine.

              Je met le code de la macro pour ceux qui sont intéressé:

              Sub macro()
               Dim objWorkbookCible As Workbook
               Dim objworkbooksource As Workbook
               Set objworkbooksource = ActiveWorkbook
               Worksheets(1).Copy
               Set objWorkbookCible = ActiveWorkbook
               ActiveWorkbook.SaveAs Filename := "chemin du fichier" & objworkbooksource.Worksheets(1).Name
               ActiveWorkbook.close
               objworkbooksource.close
              End Sub



              • Partager sur Facebook
              • Partager sur Twitter

              Ouverture de .xlsm impossible

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown