IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Documents Java Discussion :

[POI] XSSFWorkbook cloneSheet , XmlValueDisconnectedException


Sujet :

Documents Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut [POI] XSSFWorkbook cloneSheet , XmlValueDisconnectedException
    Bonjour à tous,

    j'ai un fichier template.xlsx avec un seul onglet (cellules contenant des formules et styles à respecter)

    Le nombre d'onglets que j'ai à générer est en fonction du nombre d'années que j'aurais à traiter (si je traite les années de 2013 à 2015 j'aurais 3 onglets, un/année).

    je voulais utiliser la méthode cloneSheet et ensuite rattacher la sheet créée à mon XSSFWorkbook, mais je ne vois pas comment.



    pour l'instant dans le template j'ai dupliqué (à la main) l'onglet un nombre suffisant de fois et en fonction des données que je reçoit, je supprime les onglets en trop

    j'utilise la version 3.6 de poi



    Merci d'avance pour ceux qui ont dèjà utilisé cette méthode cloneSheet

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    un exemple très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    inputStream = new FileInputStream(new File(pathname));
    			OPCPackage pkg = OPCPackage.open(inputStream );
    			XSSFWorkbook wb = new XSSFWorkbook(pkg);
     
    			XSSFSheet sheet_0 = wb.getSheetAt(0);
     
                             XSSFRow row = null;
    			XSSFCell cell = null;
     
    			int rowInit = 0;
    			row = sheet_0.getRow(rowInit );			
    			if(row == null){
    				row = sheet_0.createRow(rowInit);
    			}
    			cell = row.getCell(1);
    			if(cell == null){
    				cell = row.createCell(1);
    			}
    			cell.setCellValue("va");
    			//-sheet clonée
    			XSSFSheet sheet_clone = wb.cloneSheet(0);
     
    //			writeInSheet(sheet_0);
    //			writeInSheet(sheet_clone);
     
    			fileOut = new FileOutputStream("cloneSheet" + File.separator + fileName + "_out_" + ext);
    			wb.write(fileOut);
    			inputStream.close();
    			fileOut.close();
    Si je n'écris rien dans les feuilles ça ne plante pas ais dés que je modifie une seule cellule ça plante:

    org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_orphaned(XmlObjectBase.java:1213)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.setCArray(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFRow.onDocumentWrite(XSSFRow.java:392)
    at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2362)
    at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2328)
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:177)
    at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:181)
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:214)
    at lesXls.destestspfff.CloneXSSFSheetTest.main(CloneXSSFSheetTest.java:58)

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    J'ai fait une petite modif et ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    inputStream = new FileInputStream(new File(pathname));
    			OPCPackage pkg = OPCPackage.open(inputStream );
    			XSSFWorkbook wb = new XSSFWorkbook(pkg);
     
    			XSSFSheet sheet_0 = wb.getSheetAt(0);
    			writeInSheet(sheet_0);
     
    			//-sheet clonée
    			XSSFSheet sheet_clone = wb.cloneSheet(0);
    			writeInSheet(sheet_clone);
     
    			fileOut = new FileOutputStream("cloneSheet" + File.separator + fileName + "_out_" + ext);
    			wb.write(fileOut);
    			inputStream.close();
    			fileOut.close();
    			System.out.println(">>> Trt Ok!");
    avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    private static void writeInSheet(XSSFSheet sheet) {
     
    		XSSFRow row = null;
    		XSSFCell cell = null;
     
    		int rowIndex = 9;
    		row = sheet.getRow(rowIndex );			
    		if(row == null){
    			row = sheet.createRow(rowIndex);
    		}
     
    		int cellIndex = 9;
    		cell = row.getCell(cellIndex);
    		if(cell == null){
    			cell = row.createCell(cellIndex);
    		}
    		cell.setCellValue("va");
    	}
    ça marche pas vraiment, j'ai toujours une exception si le rowIndex = 0

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    Solution possible,

    ce n'est pas la valeur du rowIndex (Zéro ou autre) mais le fait d'écrire dans la 1ère sheet_0 (créant des row et cell) avant de faire le clone

    donc je clone ensuite j'écris comme suit:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    XSSFSheet sheet_0 = wb.getSheetAt(0);
    XSSFSheet sheet_clone = wb.cloneSheet(0);
     
    writeInSheet(sheet_0);
    writeInSheet(sheet_clone);
    pourquoi ce comportement (le fait de créer un row et cellules dans la feuille d'origine le fait planter)? je ne sais pas!

    l'essentiel est que maintenant ça ne plante plus! mais si quelqu'un a une explication à ce phénomène je suis preneur

    et Merci!

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 76
    Points : 80
    Points
    80
    Par défaut
    Une solution proposé sur ce lien (http://stackoverflow.com/questions/8...apache-poi-3-7) consiste à utiliser une classe pour créer les rows comme suit:

    j'avoue que je n'ai pas testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    import java.util.Iterator;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
     
    public class PoiHacks
    {
        // Fix of XSSFSheet.createRow(int index)
        public static Row createRow(Sheet sheet, int index) {
            Row row = sheet.getRow(index);
            if(row==null) return sheet.createRow(index);
     
            Iterator it = row.iterator();
            while(it.hasNext()) {
                it.next();
                it.remove();
            }
            return row;
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POI] Style et taille de cellule pour Excel
    Par relivio dans le forum Documents
    Réponses: 6
    Dernier message: 28/05/2014, 10h45
  2. Erreur à la création d'un document poi XSSFWorkbook
    Par Pozzo dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/05/2010, 18h35
  3. [POI / JExcelAPI][premiere fois] comment ça marche ?
    Par Regis.C dans le forum Documents
    Réponses: 13
    Dernier message: 25/11/2009, 10h01
  4. Problème avec la librairie POI
    Par clement42 dans le forum Documents
    Réponses: 3
    Dernier message: 18/11/2005, 19h11
  5. [POI] Usage à partir d'une Servlet
    Par fredmorvant29 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 19/07/2004, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo