Comment obtenir une liste de noms de feuilles Excel en Java (POI vs SAX)

introduction

Lorsque vous travaillez avec des fichiers Excel par programme, il est souvent souhaitable d'obtenir une liste de noms de feuille comme étape préliminaire dans l'analyse du contenu de la feuille. J'ai également rencontré une telle situation lors de la création de l'outil de comparaison de fichiers Excel "Square Diff" introduit dans Article précédent.

Dans cet article, je vais vous montrer trois façons d'obtenir une liste de noms de feuille dans un classeur Excel en Java:

Comment utiliser l'API du modèle d'utilisateur Apache POI

Qu'est-ce que Apache POI?

Apache POI est une bibliothèque Java (et son projet) qui peut lire et écrire des fichiers au format Microsoft Office et est publiée par Apache Software Foundation sous la licence Apache 2.0. Vous pouvez l'utiliser en ajoutant la bibliothèque au chemin de construction. (La méthode est présentée à la fin de cet article.)

POI fournit l'API usermodel et l'API eventmodel, qui seront introduites ultérieurement. L'API usermodel sera votre premier choix lorsque vous travaillez avec Excel en Java.

Exemple d'implémentation [^ 1]

[^ 1]: dans l'exemple de code présenté dans cet article, le traitement qui n'est pas lié à la ligne principale, comme le contrôle d'entrée, est omis en raison de la largeur du papier.

Exemple d'implémentation 1: SheetListerWithPOIUsermodelAPI.java


package mypackage;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class SheetListerWithPOIUsermodelAPI {
    
    /**
     *Renvoie une liste de noms de feuilles contenus dans le fichier Excel spécifié.
     * 
     * @fichier de param fichier Excel
     * @retour Liste des noms de feuilles
     */
    public static List<String> getSheetNames(File file) throws Exception {
        
        try (Workbook book = WorkbookFactory.create(file)) {
            
            return IntStream.range(0, book.getNumberOfSheets())
                    .mapToObj(book::getSheetAt)
                    .map(Sheet::getSheetName)
                    .collect(Collectors.toList());
        }
    }
    
    public static void main(String[] args) throws Exception {
        List<String> sheetNames = getSheetNames(
                new File("C:\\Users\\user01\\Desktop\\Liste des ventes de machines de jeu.xls"));
        
        sheetNames.forEach(System.out::println);
    }
}

Résultat d'exécution


Liste des ventes_2016
Graphique_2016
Liste des ventes_2017
Graphique_2017
Liste des ventes_2018
Graphique_2018

Commentaire

L'API du modèle d'utilisateur de POI doit d'abord lire et analyser l'intégralité du fichier Excel. C'est la partie de Workbook book = WorkbookFactory.create (file). Après cela, la liste des noms de feuilles est obtenue en utilisant Workbook # getNumberOfSheets (), Workbook # getSheetAt (int), Sheet # getSheetName (), etc. [^ 2]

L'exemple de code ci-dessus gère les fichiers au format .xls, mais les fichiers au format .xlsx / .xlsm peuvent également être traités.

[^ 2]: La documentation de l'API Apache POI est disponible ici: http://poi.apache.org/apidocs/index.html

Avantages

Un traitement transparent est possible

Diverses API sont fournies pour un traitement transparent sans connaître le format de fichier (format .xls ou format .xlsx / .xlsm).

Modélisation orientée objet et facile à comprendre

Les livres-feuilles-lignes-cellules, etc. sont modélisés dans le style orienté objet auquel les programmeurs Java sont habitués et peuvent être compris et manipulés intuitivement.

Désavantages

Nécessite beaucoup de mémoire et de temps de traitement

Étant donné que l'API usermodel doit d'abord charger et analyser l'intégralité du classeur Excel, même si vous souhaitez simplement obtenir le nom de la feuille, vous avez besoin de la quantité de mémoire et du temps de traitement en fonction du contenu de l'ensemble du fichier Excel. Cela peut être un goulot d'étranglement pratique.

Je ne peux pas atteindre l'endroit qui me démange

L'API usermodel actuelle est loin d'être complète.

Par exemple, dans l'exemple de code ci-dessus, le nom de la feuille graphique est sorti en plus de la feuille de calcul. Cela est difficile si vous souhaitez simplement vous limiter au nom de la feuille de calcul. Ce serait bien d'avoir une API comme Sheet # isChartSheet, mais ce n'est pas le cas.

L'interface / classe de gestion des feuilles Excel a la structure hiérarchique suivante.

Feuille: Interface pour une manipulation transparente de tous types de feuilles
  ├─ XSSFSheet : .xlsx/.feuille de format xlsm
  │    └─ XSSFChartSheet : .xlsx/.Feuille graphique au format xlsm
  │
  └─ HSSFSheet : .feuille de format xls

Par conséquent, si le fichier Excel à traiter est au format .xlsx / .xlsm, vous pouvez exclure la feuille graphique en modifiant le code source comme suit.

Exemple de mise en œuvre 1-Kai


(Omis)
    
    return IntStream.range(0, book.getNumberOfSheets())
            .mapToObj(book::getSheetAt)
            .filter(s -> !(s instanceof XSSFChartSheet))  //Ajoute ça
            .map(Sheet::getSheetName)
            .collect(Collectors.toList());
    
(Omis)

Cependant, il n'existe aucun moyen d'exclure les feuilles graphiques au format .xls [^ 3]. Si vous essayez de faire quelque chose d'un peu élaboré avec POI, vous serez accro à rencontrer de tels problèmes les uns après les autres.

Si ces lacunes ne sont pas un problème, l'API du modèle d'utilisateur POI peut être votre premier choix. Dans d'autres cas, vous devrez recourir à d'autres méthodes.

[^ 3]: Peut-être que je ne sais pas. Si vous le savez, laissez un commentaire.

Comment utiliser l'API Apache POI Eventmodel

Qu'est-ce que l'API eventmodel de POI?

L'API eventmodel est une fonctionnalité fournie pour lire des fichiers Excel rapidement et avec une petite quantité de mémoire, et l'écriture dans des fichiers n'est pas prise en charge.

L'API eventmodel lit le fichier Excel dans un sens du début à la fin et notifie à l'application le contenu du fichier sous la forme d'un événement. L'application effectue son propre traitement en fonction du contenu de l'événement.

«Square Diff» utilise cette méthode pour lire la liste des noms de feuille à partir d'un classeur Excel au format .xls. Voici un exemple d'implémentation lorsque vous travaillez avec un classeur Excel au format .xls.

Exemple d'implémentation

Pour obtenir le nom de la feuille de calcul et le nom de la feuille graphique

Exemple de mise en œuvre 2-a:HSSFSheetListerWithPOIEventAPI.java


package mypackage;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class HSSFSheetListerWithPOIEventAPI {
    
    private static class HSSFSheetListingListener implements HSSFListener {
        
        private final List<String> sheetNames = new ArrayList<>();
        
        @Override
        public void processRecord(Record record) {
            if (record.getSid() == BoundSheetRecord.sid) {
                BoundSheetRecord bSheetRecord = (BoundSheetRecord) record;
                sheetNames.add(bSheetRecord.getSheetname());
            }
        }
    }
    
    /**
     *Renvoie une liste de noms de feuilles contenus dans le fichier Excel spécifié.
     * 
     * @fichier de param fichier Excel
     * @retour Liste des noms de feuilles
     */
    public static List<String> getSheetNames(File file) throws Exception {
        
        try (FileInputStream fis = new FileInputStream(file);
                POIFSFileSystem poifs = new POIFSFileSystem(fis)) {
            
            HSSFRequest req = new HSSFRequest();
            HSSFSheetListingListener listener = new HSSFSheetListingListener();
            req.addListenerForAllRecords(listener);
            HSSFEventFactory factory = new HSSFEventFactory();
            factory.abortableProcessWorkbookEvents(req, poifs);
            
            return listener.sheetNames;
        }
    }
    
    public static void main(String[] args) throws Exception {
        List<String> sheetNames = getSheetNames(
                new File("C:\\Users\\user01\\Desktop\\Liste des ventes de machines de jeu.xls"));
        
        sheetNames.forEach(System.out::println);
    }
}

Résultat d'exécution


Liste des ventes_2016
Graphique_2016
Liste des ventes_2017
Graphique_2017
Liste des ventes_2018
Graphique_2018

Pour obtenir uniquement le nom de la feuille de calcul

Exemple de mise en œuvre 2-b:HSSFSheetListerWithPOIEventAPI.java


package mypackage;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class HSSFSheetListerWithPOIEventAPI {
    
    private static class HSSFSheetListingListener implements HSSFListener {
        
        private final Queue<String> queue = new ArrayDeque<>();
        private final List<String> sheetNames = new ArrayList<>();
        
        @Override
        public void processRecord(Record record) {
            switch (record.getSid()) {
            case BoundSheetRecord.sid:
                BoundSheetRecord bSheetRecord = (BoundSheetRecord) record;
                queue.add(bSheetRecord.getSheetname());
                break;
            
            case BOFRecord.sid:
                BOFRecord bofRecord = (BOFRecord) record;
                
                switch (bofRecord.getType()) {
                case BOFRecord.TYPE_WORKSHEET:
                    sheetNames.add(queue.remove());
                    break;
                
                case BOFRecord.TYPE_CHART:
                    queue.remove();
                    break;
                }
                
                break;
            }
        }
    }
    
    //Après cela, exemple de mise en œuvre 2-Identique à un
    
    /**
     *Renvoie une liste de noms de feuilles contenus dans le fichier Excel spécifié.
     * 
     * @fichier de param fichier Excel
     * @retour Liste des noms de feuilles
     */
    public static List<String> getSheetNames(File file) throws Exception {
        
        try (FileInputStream fis = new FileInputStream(file);
                POIFSFileSystem poifs = new POIFSFileSystem(fis)) {
            
            HSSFRequest req = new HSSFRequest();
            HSSFSheetListingListener listener = new HSSFSheetListingListener();
            req.addListenerForAllRecords(listener);
            HSSFEventFactory factory = new HSSFEventFactory();
            factory.abortableProcessWorkbookEvents(req, poifs);
            
            return listener.sheetNames;
        }
    }
    
    public static void main(String[] args) throws Exception {
        List<String> sheetNames = getSheetNames(
                new File("C:\\Users\\user01\\Desktop\\Liste des ventes de machines de jeu.xls"));
        
        sheetNames.forEach(System.out::println);
    }
}

Résultat d'exécution


Liste des ventes_2016
Liste des ventes_2017
Liste des ventes_2018

Commentaire

Comme mentionné précédemment, l'API eventmodel de POI reçoit le contenu du fichier en tant qu'événement. Vous devez implémenter l'interface HSSFListener et remplacer la méthode processRecord (Record) pour recevoir des événements.

La méthode processRecord (Record) est appelée à chaque fois que le fichier est lu, donc l'application traite en fonction du contenu de l'événement (en particulier, le contenu de l'objet Record passé en argument). Dans l'exemple d'implémentation 2-a, l'événement est record.getSid () == BoundSheetRecord.sid, et dans l'exemple d'implémentation 2-b, record.getSid () == BoundSheetRecord.sid ou record.getSid () == Traitement d'un événement BOFRecord.sid.

Comprendre quels événements se produisent et dans quel ordre peut être une tâche ardue. Je peux voir la documentation de l'API pour l'interface d'enregistrement (http://poi.apache.org/apidocs/org/apache/poi/hssf/record/Record.html) et ses sous-interfaces et sous-classes, ainsi que le code suivant: J'ai progressivement approfondi ma compréhension en comparant le contenu réel de l'événement.

Sortez le contenu réel de l'événement et vérifiez


(Omis)
    
    @Override
    public void processRecord(Record record) {
        System.out.println(record);
    }
    
(Omis)

Notez que seuls les classeurs Excel au format .xls peuvent être traités par les exemples d'implémentation 2-a et 2-b. Il ne peut pas traiter les classeurs Excel au format .xlsx / .xlsm.

Avantages

Fonctionne rapidement avec une petite quantité de mémoire

Étant donné que l'API eventmodel est une méthode de lecture du début à la fin d'un fichier avec un flux, elle fonctionne plus rapidement avec une petite quantité de mémoire par rapport à l'API usermodel, qui est une méthode d'analyse de l'ensemble du contenu du fichier et de le garder en mémoire. ..

Un traitement fin est possible

Puisque le contenu du fichier peut être lu presque directement, il est possible de réaliser un traitement qui ne peut pas être réalisé par l'API du modèle utilisateur.

Désavantages

Nécessite une compréhension de la structure interne du fichier

Afin de traiter avec l'API eventmodel, il est essentiel de comprendre la structure interne du fichier Excel, comme le type d'événements qui se produisent et dans quel ordre.

Il existe un livre de référence. "Kit de développement Microsoft Excel 97". Livres étrangers, épuisés. Au moment de la rédaction de cet article, [les livres d'occasion étaient répertoriés](https://www.amazon.co.jp/Microsoft-Excel-Developers-Kit-Customize/dp/1572314982/ref=sr_1_1?ie=UTF8&qid = 1530997082 & sr = 8-1 & mots-clés = 1572314982).

La documentation de l'API pour la classe d'implémentation Record fait référence à ce livre. Par exemple, dans la documentation API pour la classe BoundSheetRecord, consultez« REFERENCE: PG 291 Microsoft Excel 97 Developer's Kit. (ISBN: 1-57231-498-2) ". Lors de la création d'une application à part entière, vous devrez travailler avec un livre de référence dans une main.

J'ai procédé à l'implémentation tout en vérifiant la documentation de l'API et le contenu réel de l'enregistrement. Dans tous les cas, vous serez obligé de procéder à une implémentation par essais et erreurs.

L'accès aléatoire au contenu des fichiers n'est pas possible

Étant donné que l'API eventmodel ne lit le fichier qu'en ligne droite du début à la fin, s'il est nécessaire d'évaluer le contenu à l'avant du fichier en fonction du contenu à l'arrière du fichier, gérez et enregistrez vous-même le contenu du fichier. est nécessaire.

Comment utiliser SAX

Qu'est-ce que SAX

SAX signifie Simple API for XML et est fourni en tant qu'API standard en Java8 dans le package ʻorg.xml.sax`. Semblable à l'API eventmodel de POI, il lit le fichier XML dans une direction du début à la fin et notifie à l'application le contenu du fichier XML en tant qu'événement.

Comme on le sait, le fichier Excel au format .xlsx / .xlsm est en fait un fichier ZIP composé de plusieurs fichiers XML, vous pouvez donc utiliser SAX pour lire le contenu d'un classeur Excel.

«Square Diff» utilise cette méthode pour lire la liste des noms de feuille à partir d'un classeur Excel au format .xlsx / .xlsm.

Exemple d'implémentation

Pour obtenir le nom de la feuille de calcul et le nom de la feuille graphique

Exemple de mise en œuvre 3-a:XSSFSheetListerWithSAX.java


package mypackage;

import java.io.File;
import java.io.InputStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class XSSFSheetListerWithSAX {
    
    /**
     *Sous forme de fichier zip.xlsx/.Lisez l'entrée suivante du fichier xlsm
     *Extrayez la liste des noms de feuilles.
     * 
     * *.xlsx
     *   +- xl
     *     +- workbook.xml
     */
    private static class Handler1 extends DefaultHandler {
        
        private final List<String> names = new ArrayList<>();
        
        @Override
        public void startElement(
                String uri,
                String localName,
                String qName,
                Attributes attributes) {
            
            if ("sheet".equals(qName)) {
                names.add(attributes.getValue("name"));
            }
        }
    }
    
    /**
     *Renvoie une liste de noms de feuilles contenus dans le fichier Excel spécifié.
     * 
     * @fichier de param fichier Excel
     * @retour Liste des noms de feuilles
     */
    public static List<String> getSheetNames(File file) throws Exception {
        try (FileSystem fs = FileSystems.newFileSystem(file.toPath(), null)) {
            Handler1 handler1 = new Handler1();
            
            try (InputStream is = Files.newInputStream(
                    fs.getPath("xl/workbook.xml"))) {
                
                InputSource source = new InputSource(is);
                XMLReader parser = XMLReaderFactory.createXMLReader();
                parser.setContentHandler(handler1);
                parser.parse(source);
            }
            
            return handler1.names;
        }
    }
    
    public static void main(String[] args) throws Exception {
        List<String> sheetNames = getSheetNames(
                new File("C:\\Users\\user01\\Desktop\\Liste des ventes de machines de jeu.xlsx"));
        
        sheetNames.forEach(System.out::println);
    }
}

Résultat d'exécution


Liste des ventes_2016
Graphique_2016
Liste des ventes_2017
Graphique_2017
Liste des ventes_2018
Graphique_2018

Pour obtenir uniquement le nom de la feuille de calcul

Exemple de mise en œuvre 3-b:XSSFSheetListerWithSAX.java


package mypackage;

import java.io.File;
import java.io.InputStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class XSSFSheetListerWithSAX {
    
    /**
     *Sous forme de fichier zip.xlsx/.Lisez l'entrée suivante du fichier xlsm
     *Extrayez la liste des noms de feuilles et la carte des noms de feuilles et des ID de feuille (relId).
     * 
     * *.xlsx
     *   +- xl
     *     +- workbook.xml
     */
    private static class Handler1 extends DefaultHandler {
        
        private final List<String> names = new ArrayList<>();
        private final Map<String, String> nameToId = new HashMap<>();
        
        @Override
        public void startElement(
                String uri,
                String localName,
                String qName,
                Attributes attributes) {
            
            if ("sheet".equals(qName)) {
                names.add(attributes.getValue("name"));
                nameToId.put(
                        attributes.getValue("name"),
                        attributes.getValue("r:id"));
            }
        }
    }
    
    /**
     *Sous forme de fichier zip.xlsx/.Lisez l'entrée suivante du fichier xlsm
     *Extrayez la carte de l'ID de feuille (relId) et du chemin d'entrée.
     * 
     * *.xlsx
     *   +- xl
     *     +- _rels
     *       +- workbook.xml.rels
     */
    private static class Handler2 extends DefaultHandler {
        
        private final Map<String, String> idToSource = new HashMap<>();
        
        @Override
        public void startElement(
                String uri,
                String localName,
                String qName,
                Attributes attributes) {
            
            if ("Relationship".equals(qName)) {
                idToSource.put(
                        attributes.getValue("Id"),
                        attributes.getValue("Target"));
            }
        }
    }
    
    /**
     *Renvoie une liste de noms de feuilles contenus dans le fichier Excel spécifié.
     * 
     * @fichier de param fichier Excel
     * @retour Liste des noms de feuilles
     */
    public static List<String> getSheetNames(File file) throws Exception {
        try (FileSystem fs = FileSystems.newFileSystem(file.toPath(), null)) {
            
            Handler1 handler1 = new Handler1();
            try (InputStream is = Files.newInputStream(
                    fs.getPath("xl/workbook.xml"))) {
                
                InputSource source = new InputSource(is);
                XMLReader parser = XMLReaderFactory.createXMLReader();
                parser.setContentHandler(handler1);
                parser.parse(source);
            }
            
            Handler2 handler2 = new Handler2();
            try (InputStream is = Files.newInputStream(
                    fs.getPath("xl/_rels/workbook.xml.rels"))) {
                
                InputSource source = new InputSource(is);
                XMLReader parser = XMLReaderFactory.createXMLReader();
                parser.setContentHandler(handler2);
                parser.parse(source);
            }
            
            return handler1.names.stream()
                    .filter(name -> {
                        String id = handler1.nameToId.get(name);
                        String source = handler2.idToSource.get(id);
                        return source.startsWith("worksheets/");
                    })
                    .collect(Collectors.toList());
        }
    }
    
    public static void main(String[] args) throws Exception {
        List<String> sheetNames = getSheetNames(
                new File("C:\\Users\\user01\\Desktop\\Liste des ventes de machines de jeu.xlsx"));
        
        sheetNames.forEach(System.out::println);
    }
}

Résultat d'exécution


Liste des ventes_2016
Liste des ventes_2017
Liste des ventes_2018

Commentaire

Afin de recevoir le contenu du fichier XML comme un événement, il est pratique d'hériter de ʻorg.xml.sax.helpers.DefaultHandler. Parmi les différentes méthodes de rappel fournies par la classe DefaultHandler`, remplacez la méthode de rappel qui correspond à l'événement requis par votre application.

L'exemple de code ci-dessus utilise la méthode startElement (String, String, String, Attributes), qui est appelée à chaque fois que la balise de début d'un fichier XML apparaît.

Dans l'exemple d'implémentation 3-a, l'entrée «xl / workbook.xml» lorsque le fichier Excel est décompressé en tant que fichier zip est ajoutée, et dans l'exemple d'implémentation 3-b, l'entrée «xl / _rels / workbook.xml.rels» est ajoutée. Est en train de lire.

L'explication de la façon de les analyser sera longue, je vais donc l'omettre. En extrayant le fichier Excel au format .xlsx / .xlsm avec l'outil de décompression ZIP, vous pouvez facilement vérifier le contenu des fichiers XML qui composent le fichier Excel. Veuillez lire l'exemple de code ci-dessus tout en vérifiant le fichier Excel que vous avez.

Avantages

Fonctionne rapidement avec une petite quantité de mémoire

Semblable à l'API eventmodel de POI, elle s'exécute rapidement et économise de la mémoire. De plus, il ne peut lire que les fichiers XML nécessaires qui composent un fichier Excel, ce qui le rend encore plus rapide.

Un traitement fin est possible

Puisque le contenu du fichier peut être lu directement, il est possible de réaliser un traitement qui ne peut pas être réalisé par l'API du modèle utilisateur de POI.

Ne nécessite pas de bibliothèque externe

ʻOrg.xml.sax` et ses sous-packages sont fournis en tant qu'API standard dans Java8. Pas besoin de compter sur des bibliothèques externes.

Désavantages

Nécessite une compréhension de la structure interne du fichier

Comme pour l'API eventmodel de POI, une compréhension de la structure interne des fichiers Excel est essentielle. Cependant, la structure des classeurs Excel au format .xlsx / .xlsm est appelée Office Open XML et est normalisée ISO / CEI 29500. Par conséquent, il est relativement facile d'obtenir des informations de spécification. De plus, comme le contenu peut être facilement vérifié avec l'outil de décompression ZIP, on peut dire qu'il est plus facile à manipuler que de manipuler un classeur Excel au format .xls avec l'API eventmodel de POI.

L'accès aléatoire au contenu des fichiers n'est pas possible

Comme l'API eventmodel de POI, SAX ne lit le fichier XML qu'en ligne droite du début à la fin, donc si vous avez besoin d'évaluer le contenu à l'avant du fichier en fonction du contenu à l'arrière du fichier, Il est nécessaire de gérer et d'enregistrer le contenu du fichier avec.

en conclusion

Dans cet article, nous avons présenté les trois méthodes suivantes pour obtenir une liste de noms de feuilles inclus dans un fichier Excel en Java.

Chaque méthode a des avantages et des inconvénients, et nous, les programmeurs, devons les utiliser correctement en fonction de l'objectif.

J'ai moi-même contesté toutes les trois méthodes ci-dessus pour la première fois lorsque j'ai été confronté à la nécessité de créer "square Diff". En particulier, j'ai estimé que la méthode d'utilisation de l'API eventmodel et de SAX était un obstacle de taille, mais étonnamment, ce n'est pas si difficile une fois que vous le lancez, et c'est pratique une fois que vous vous y êtes habitué. Si vous essayez de surmonter la résistance initiale et de relever le défi, la plage de puissance de montage peut s'étendre.

«Square Diff» utilise également plusieurs méthodes pour mettre à jour les fichiers Excel. Je voudrais à nouveau introduire cela dans le manuscrit.

APPENDIX

Comment utiliser la bibliothèque Apache POI en plus du chemin de construction

Vous pouvez tirer parti de cette fonctionnalité en ajoutant certains des fichiers jar fournis par Apache POI à votre chemin de construction. Voici comment ajouter un fichier jar téléchargé manuellement à votre chemin de construction dans Eclipse. (Veuillez cliquer sur d'autres façons d'utiliser Maven, etc.)

1. Téléchargez la bibliothèque (fichier zip)

De la Page de téléchargement du Site POI Apache au fichier zip (poi-bin-3.17 au moment de la rédaction de cet article) -20170915.zip) peuvent être téléchargés.

2. Décompressez le fichier zip

Décompressez le fichier zip n'importe où sur votre PC local. Je pense qu'il sera décompressé comme suit.

poi-3.17
  ├─ docs
│ └─ De nombreux fichiers html
  │
  ├─ lib
  │   ├─ commons-codec-1.10.jar
  │   ├─ commons-collections4-4.1.jar
  │   ├─ commons-logging-1.2.jar
  │   ├─ junit-4.12.jar
  │   └─ log4j-1.2.17.jar
  │
  ├─ ooxml-lib
  │   ├─ curvesapi-1.04.jar
  │   └─ xmlbeans-2.6.0.jar
  │
  ├─ LICENSE
  ├─ NOTICE
  ├─ poi-3.17.jar
  ├─ poi-examples-3.17.jar
  ├─ poi-excelant-3.17.jar
  ├─ poi-ooxml-3.17.jar
  ├─ poi-ooxml-schemas-3.17.jar
  └─ poi-scratchpad-3.17.jar

3. Créez une bibliothèque utilisateur

A) Sélectionnez [Java]> [Build Path]> [User Library]> [New ...] dans les paramètres Eclipse.

B) Entrez le nom de votre choix, par exemple "poi-3.17" et appuyez sur OK.

C) Sélectionnez la bibliothèque utilisateur créée et cliquez sur [Ajouter un JAR externe ...].

D) Spécifiez le fichier jar inclus dans la décompression de 2. ci-dessus. Spécifiez également ce qui est contenu dans le dossier lib et le dossier ooxml-lib.

Il comprend des fichiers jar et des exemples de fichiers pour faire fonctionner Word et PowerPoint ainsi qu'Excel, et si vous utilisez uniquement des fichiers Excel, vous n'avez pas besoin de ces fichiers jar, mais bien, mettez-les tous. Cela ne devrait-il pas être bon?

E) Cliquez sur [Appliquer et fermer].

4. Ajoutez la bibliothèque utilisateur au chemin de construction du projet

A) Sélectionnez le projet et sélectionnez Build Path> Add Library ... dans le menu contextuel.

B) Sélectionnez Bibliothèque utilisateur comme type de bibliothèque et spécifiez la bibliothèque utilisateur que vous avez créée précédemment comme cible.

c'est tout.

Recommended Posts

Comment obtenir une liste de noms de feuilles Excel en Java (POI vs SAX)
Comment nommer des variables en Java
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment obtenir la date avec Java
Comment obtenir une classe depuis Element en Java
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Comment apprendre JAVA en 7 jours
Comment obtenir des paramètres dans Spark
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
Comment concaténer des chaînes avec Java
Comment obtenir la longueur d'un fichier audio avec Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Comment changer le nom de l'application dans les rails
Comment faire une conversion de base en Java
Remplacez List <Optional <T >> par Optional <List <T >> en Java
[Java] Comment obtenir le répertoire actuel
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
[Conception d'architecture] Comment exécuter SQL dans une application Java? 2WaySql contre ORM
[Java] [ibatis] Comment obtenir des enregistrements de relation 1 à N avec List <Map <>>
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Comment créer votre propre annotation en Java et obtenir la valeur
graphql-ruby: Comment obtenir le nom de la requête ou de la mutation dans le contrôleur Remarque
Comment afficher une page Web en Java
Dans Apache POI 3.15, lorsque j'obtiens le résultat d'une formule, FormulaParseException se produit (la formule fait référence à "cellule avec le nom de la feuille comprenant" ・ ")
Comment masquer les champs nuls en réponse en Java
Bibliothèque "OSHI" pour acquérir des informations système avec Java
[Java] Comment obtenir des nombres aléatoires en excluant des nombres spécifiques
Comment obtenir et étudier Java SE8 Gold
Comment résoudre les problèmes d'expression en Java
[Java] Comment obtenir l'URL redirigée finale
Comment écrire Java String # getBytes dans Kotlin?
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Java] Comment obtenir l'URL de la source de transition
Comment appeler des fonctions en bloc avec la réflexion Java
Comment créer un environnement Java en seulement 3 secondes
[Java] Comment omettre le constructeur privé dans Lombok
Exemple de code pour convertir List en List <String> dans Java Stream
Comment entrer / sortir des fichiers mainframe IBM en Java?
java: Comment écrire une liste de types génériques [Note]
[Java] Comment extraire le nom du fichier du chemin
Comment obtenir des informations sur les tables associées dans les tables plusieurs-à-plusieurs
Renommer la feuille Java Excel et définir les couleurs des onglets
[Java] Comment obtenir la valeur maximale de HashMap
Source utilisée pour obtenir l'URL de la source de redirection en Java
Comment afficher un aperçu du navigateur avec VS Code
À partir d'avril 2018 Comment installer Java 8 sur Mac
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment créer un environnement de développement Java avec VS Code
Comment Git gérer les projets Java EE dans Eclipse