198 votes

Comment lire et écrire un fichier Excel

Je veux lire et écrire un fichier Excel à partir de Java avec 3 colonnes et N lignes, en imprimant une chaîne dans chaque cellule. Quelqu'un peut-il me donner un extrait de code simple pour cela ? Dois-je utiliser une librairie externe ou Java a-t-il un support intégré pour cela ?

Je veux faire ce qui suit :

for(i=0; i <rows; i++)
     //read [i,col1] ,[i,col2], [i,col3]

for(i=0; i<rows; i++)
    //write [i,col1], [i,col2], [i,col3]

0 votes

Avec GemBox.Spreadsheet pour Java c'est simple, il suffit d'itérer entre les lignes d'une feuille et les cellules allouées dans une ligne et d'appeler ExcelCell.getValue() sur chacun d'eux. Par exemple, voir ceci lecture Par exemple, pour l'écriture, vous pouvez également vérifier ce exemple.

160voto

rogeriopvl Points 9619

Essayez le Apache POI HSSF . Voici un exemple de lecture d'un fichier excel :

try {
    POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
    HSSFRow row;
    HSSFCell cell;

    int rows; // No of rows
    rows = sheet.getPhysicalNumberOfRows();

    int cols = 0; // No of columns
    int tmp = 0;

    // This trick ensures that we get the data properly even if it doesn't start from first few rows
    for(int i = 0; i < 10 || i < rows; i++) {
        row = sheet.getRow(i);
        if(row != null) {
            tmp = sheet.getRow(i).getPhysicalNumberOfCells();
            if(tmp > cols) cols = tmp;
        }
    }

    for(int r = 0; r < rows; r++) {
        row = sheet.getRow(r);
        if(row != null) {
            for(int c = 0; c < cols; c++) {
                cell = row.getCell((short)c);
                if(cell != null) {
                    // Your code here
                }
            }
        }
    }
} catch(Exception ioe) {
    ioe.printStackTrace();
}

Sur la page de documentation, vous trouverez également des exemples de la façon d'écrire dans des fichiers Excel.

15 votes

Row.getCell((short)c) ; est déprécié, je pense que je dois utiliser int à la place.

4 votes

En fait, il suffit de retirer le (court) casting poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/

1 votes

Dans mes tentatives d'utiliser ce code, j'ai trouvé que HSSFSheet 's getPhysicalNumberOfRows() semblait renvoyer le nombre de lignes non vides (il n'était pas évident pour moi que c'était ce que "physique" signifiait). Ainsi, si votre fichier Excel comporte de nombreuses lignes vides (pour des raisons de formatage, par exemple), vous aurez peut-être plus de chance en utilisant la méthode suivante rows = sheet.getLastRowNum(); . Cela devrait également vous permettre de supprimer l'astuce (voir commentaire) de la première boucle : for(int i = 0; i <= rows; i++) { (notez le changement de < à <= ).

59voto

Brian Agnew Points 143181

POI Apache peut le faire pour vous. Plus précisément, le HSSF module. Le site guide rapide est le plus utile. Voici comment faire ce que vous voulez - créer spécifiquement une feuille et l'écrire.

Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");

// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);

// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(
createHelper.createRichTextString("This is a string"));
row.createCell(3).setCellValue(true);

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

0 votes

Peut-on le faire en java/spring sans l'aide d'un framework ?

1 votes

Si vous utilisez Spring, ce n'est pas du simple Java. Je pense que si vous voulez lire ces fichiers, POI est la solution.

40voto

Prashant Tiwari Points 11

Ajoutez d'abord tous ces fichiers jar dans le chemin des classes de votre projet :

  1. poi-scratchpad-3.7-20101029
  2. poi-3.2-FINAL-20081019
  3. poi-3.7-20101029
  4. poi-examples-3.7-20101029
  5. poi-ooxml-3.7-20101029
  6. poi-ooxml-schemas-3.7-20101029
  7. xmlbeans-2.3.0
  8. dom4j-1.6.1

Code pour écrire dans un fichier excel :

public static void main(String[] args) {
    //Blank workbook
    XSSFWorkbook workbook = new XSSFWorkbook();

    //Create a blank sheet
    XSSFSheet sheet = workbook.createSheet("Employee Data");

    //This data needs to be written (Object[])
    Map<String, Object[]> data = new TreeMap<String, Object[]>();
    data.put("1", new Object[]{"ID", "NAME", "LASTNAME"});
    data.put("2", new Object[]{1, "Amit", "Shukla"});
    data.put("3", new Object[]{2, "Lokesh", "Gupta"});
    data.put("4", new Object[]{3, "John", "Adwards"});
    data.put("5", new Object[]{4, "Brian", "Schultz"});

    //Iterate over data and write to sheet
    Set<String> keyset = data.keySet();

    int rownum = 0;
    for (String key : keyset) 
    {
        //create a row of excelsheet
        Row row = sheet.createRow(rownum++);

        //get object array of prerticuler key
        Object[] objArr = data.get(key);

        int cellnum = 0;

        for (Object obj : objArr) 
        {
            Cell cell = row.createCell(cellnum++);
            if (obj instanceof String) 
            {
                cell.setCellValue((String) obj);
            }
            else if (obj instanceof Integer) 
            {
                cell.setCellValue((Integer) obj);
            }
        }
    }
    try 
    {
        //Write the workbook in file system
        FileOutputStream out = new FileOutputStream(new File("C:\\Documents and Settings\\admin\\Desktop\\imp data\\howtodoinjava_demo.xlsx"));
        workbook.write(out);
        out.close();
        System.out.println("howtodoinjava_demo.xlsx written successfully on disk.");
    } 
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Code pour la lecture d'un fichier excel

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

public static void main(String[] args) {
    try {
        FileInputStream file = new FileInputStream(new File("C:\\Documents and Settings\\admin\\Desktop\\imp data\\howtodoinjava_demo.xlsx"));

        //Create Workbook instance holding reference to .xlsx file
        XSSFWorkbook workbook = new XSSFWorkbook(file);

        //Get first/desired sheet from the workbook
        XSSFSheet sheet = workbook.getSheetAt(0);

        //Iterate through each rows one by one
        Iterator<Row> rowIterator = sheet.iterator();
        while (rowIterator.hasNext())
        {
            Row row = rowIterator.next();
            //For each row, iterate through all the columns
            Iterator<Cell> cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) 
            {
                Cell cell = cellIterator.next();
                //Check the cell type and format accordingly
                switch (cell.getCellType()) 
                {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "\t");
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.print(cell.getStringCellValue() + "\t");
                        break;
                }
            }
            System.out.println("");
        }
        file.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

15voto

javashlook Points 4800

Vous pouvez également envisager JExcelApi . Je le trouve mieux conçu que POI. Il y a un tutoriel ici .

3 votes

J'ai essayé de visiter la page du tutoriel. Elle semble avoir été supprimée.

5 votes

JExcelApi est destiné aux anciens fichiers binaires .xls (jusqu'à Excel 2003). Apache POI-HSSF s'adresse aux mêmes anciens fichiers .xls, tandis qu'Apache POI-XSSF fonctionne avec les nouveaux fichiers .xlsx (Excel 2007-).

0 votes

L'inconvénient est qu'il ne permet de traiter que les fichiers Excel au format .xls (1997-2003).

9voto

duffymo Points 188155

.csv ou POI le fera certainement, mais vous devez être conscient de l'expérience d'Andy Khan. JExcel . Je pense que c'est de loin la meilleure bibliothèque Java pour travailler avec Excel qui existe.

0 votes

Et c'est commercial !

0 votes

12 ans depuis la réponse originale. Ou était open source en 2009.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X