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] Copie de colonne de fichier Excel érronée


Sujet :

Documents Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut [POI] Copie de colonne de fichier Excel érronée
    Bonjour,

    Je travaille sur une application utilisant l'API POI-XSSF - Java API To Access Microsoft Excel Format Files, dont le but est copier le contenu d'un fichier Excel vers texte.

    Mon problème est qu'après avoir copié vers le fichier texte, il y a une colonne qui affiche SUM(E1:E4) au lieu d'afficher le contenu de la ligne.

    Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Eh bien, il suffirait de calculer la somme toi-même. POI est très clair sur le fait que ce n'est pas son rôle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    tu dois probablement récupérer la valeur de tes cellules par un toString().

    Voici ci-après un petit exemple pour récupérer les valeurs de cellules, y compris la valeur calculée des cellules contenant une formule. Tu y trouveras un exemple de lecture depuis le cache, et une lecture avec réévaluation de la formule (qui n'est nécessaire que si ton programme modifie des cellules).

    Le tableau contenu dans le fichier xls est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    | A | B | C | D             |
    | 1 | 2 | 3 | =somme(A1:C1) |
    Le résultat affiché est :
    1.0 => 1.0
    2.0 => 2.0
    3.0 => 3.0
    SUM(A1:C1) => 6.0
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    public class CellFormulaDemo {
     
    	public static void main(String[] args) {
    		boolean reeval=false; // si false, alors on lit les valeurs calculées stockées dans le cache, si true, on recalcule les formules
    		try {
    			demo("c:/temp/test.xls", reeval);
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    	}
     
    	public static void demo(String filepath, boolean reeval) throws Throwable {
    		FileInputStream fis = new FileInputStream(filepath);
    		try {
    			Workbook wb = new HSSFWorkbook(fis);
    			Sheet sheet = wb.getSheetAt(0);
    			FormulaEvaluator evaluator = wb.getCreationHelper()
    					.createFormulaEvaluator();
    			for (char c : new char[] { 'A', 'B', 'C', 'D' }) {
    				System.out.print(getCellString(sheet, c + "1"));
    				System.out.print(" => ");
    				if ( reeval ) {
    					System.out.println(evalCellValue(sheet, evaluator, c + "1"));
    				}
    				else {
    					System.out.println(getCellValue(sheet, c + "1"));
    				}
    			}
    		} finally {
    			try {
    				fis.close();
    			} catch (IOException e) {
    			}
    			;
    		}
    	}
     
    	private static String getCellString(Sheet sheet, String cellid) {
    		CellReference cellReference = new CellReference(cellid);
    		Row row = sheet.getRow(cellReference.getRow());
    		Cell cell = row.getCell(cellReference.getCol());
    		return cell.toString();
    	}
     
    	private static Object getCellValue(Sheet sheet, 
    			String cellid) {
    		CellReference cellReference = new CellReference(cellid);
    		Row row = sheet.getRow(cellReference.getRow());
    		Cell cell = row.getCell(cellReference.getCol());
     
    		switch (cell.getCellType()) {
    		case Cell.CELL_TYPE_BOOLEAN:
    			return cell.getBooleanCellValue();
    		case Cell.CELL_TYPE_NUMERIC:
    			return cell.getNumericCellValue();
    		case Cell.CELL_TYPE_STRING:
    			return cell.getStringCellValue();
    		case Cell.CELL_TYPE_FORMULA:
    			return getCachedValue(cell);
    		}
    		return null;
        }
    	private static Object getCachedValue(Cell cell) {
    		switch (cell.getCachedFormulaResultType()) {
    		case Cell.CELL_TYPE_BOOLEAN:
    			return cell.getBooleanCellValue();
    		case Cell.CELL_TYPE_NUMERIC:
    			return cell.getNumericCellValue();
    		case Cell.CELL_TYPE_STRING:
    			return cell.getStringCellValue();
    		}
    		return null;
    	}
     
    	private static Object evalCellValue(Sheet sheet, FormulaEvaluator evaluator,
    			String cellid) {
    		CellReference cellReference = new CellReference(cellid);
    		Row row = sheet.getRow(cellReference.getRow());
    		Cell cell = row.getCell(cellReference.getCol());
     
    		switch (cell.getCellType()) {
    		case Cell.CELL_TYPE_BOOLEAN:
    			return cell.getBooleanCellValue();
    		case Cell.CELL_TYPE_NUMERIC:
    			return cell.getNumericCellValue();
    		case Cell.CELL_TYPE_STRING:
    			return cell.getStringCellValue();
    		case Cell.CELL_TYPE_FORMULA:
    			return evaluate(cell, evaluator);
    		}
    		return null;
    	}
     
    	private static Object evaluate(Cell cell, FormulaEvaluator evaluator) {
    		CellValue cellValue = evaluator.evaluate(cell);
     
    		switch (cellValue.getCellType()) {
    		case Cell.CELL_TYPE_BOOLEAN:
    			return cellValue.getBooleanValue();
    		case Cell.CELL_TYPE_NUMERIC:
    			return cellValue.getNumberValue();
    		case Cell.CELL_TYPE_STRING:
    			return cellValue.getStringValue();
    		}
    		return null;
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut
    Rebonjour

    Quand j'ai modifié dans le code car ma somme sum(E1:E4) comme ça
    for (char c : new char[] { 'E1', 'E2', 'E3','E4'})

    il ya une erreur aui dit que : unclosed character literal

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par extjs Voir le message
    Rebonjour

    Quand j'ai modifié dans le code car ma somme sum(E1:E4) comme ça
    for (char c : new char[] { 'E1', 'E2', 'E3','E4'})

    il ya une erreur aui dit que : unclosed character literal
    C'est normal que tu aies cette erreur : c'est un tableau de char et E1 n'est pas un char, mais 2 caractères, donc forcément une chaîne.

    Si ton but est de parcourir les cellules E1 à E4, tu peux faire :
    for (String cellId : new String[] { "E1", "E2", "E3","E4"})

    Ensuite le principe, ce n'est pas de parcourir les cellules correspondant à une formule, ce qui t'obligerait à interpréter toutes les formules excel. Tu dois parcourir les cellules de ton doc et récupérer les valeurs de chaque cellule, comme la méthode getCellValue(...) de mon exemple.

    Tu peux parcourir des cellules dont les ids sont explicitement listés dans un tableau, comme dans mon exemple, si ton doc en entrée est toujours le même, ou utiliser les méthodes sheet.getLastRowNum()
    et row.getLastCellNum() et parcourir les cellules...

    Mais pour récupérer la valeur calculée d'une cellule contenant une formule, pas besoin d'interpréter la formule et de parcourir les cellules que la formule utilise : regarde juste getCellValue(...) dans mon exemple pour voir comment obtenir la vraie valeur finale de n'importe quel cellule de n'importe quel type.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Par défaut
    Bonjour

    J'ai fait comme vous m'avez indiqué l'autre fois pour le String.
    En fait j'ai deux classes : ExtractExcelToCSV et CellFormula.

    Mon problème est que quand j'appelle ces deux classes dans le code de bouton de mon Frame, les erreurs suivantes sont affichées :
    java.lang.NullPointerException
    Erreur
    at project.CellFormula.getCellString(CellFormula.java:62)
    at project.CellFormula.demo(CellFormula.java:41)
    at project.Frame2.jButton2ActionPerformed(Frame2.java:90)
    at project.Frame2.access$000(Frame2.java:13)
    at project.Frame2$1.actionPerformed(Frame2.java:42)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

    voici la partie de code du bouton qui appelle les deux classes :

    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
     private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     
    try{
     
     
           CellFormula cf= new CellFormula();
            boolean reeval=true; // si false, alors on lit les valeurs calculées stockées dans le cache, si true, on recalcule les formules
    	cf.demo("c:/vir.xlsx", reeval);
            ExtractExcelToCSV ex=new ExtractExcelToCSV();
     
            ex.convertExcelToCsv();
     
    	System.out.println("hello");
     
    JOptionPane.showMessageDialog(this, "copie réussie","succés",JOptionPane.INFORMATION_MESSAGE);
    }
         catch (Exception e) {
                e.printStackTrace();
     
    {System.out.println("Erreur");
        JOptionPane.showMessageDialog(this,
        "Copie échouée",
        "erreur",
        JOptionPane.ERROR_MESSAGE);}
         }  catch (Throwable ex) {
                Logger.getLogger(Frame2.class.getName()).log(Level.SEVERE, null, ex);
            }
    }

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    la stacktrace de l'exception dit qu'il y a une erreur (un appel de méthode sur une variable qui contient null) dans la classe CellFormula, à la ligne 62 :

    project.CellFormula.getCellString(CellFormula.java:62)
    C'est le source de CellFormula qui est pertinent, en particulier la ligne 62, pour comprendre la cause de l'erreur.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/01/2015, 15h38
  2. Réponses: 8
    Dernier message: 11/12/2007, 17h04
  3. [ASE 12.5] MAJ colonne depuis fichier Excel
    Par Thig dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 23/11/2006, 14h02
  4. [ASE 12.5] MAJ colonne depuis fichier Excel
    Par Thig dans le forum Sybase
    Réponses: 1
    Dernier message: 23/11/2006, 14h02
  5. [Servlet]POI et affichage d'un fichier excel dans IE
    Par vseb99 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 08/02/2006, 13h59

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