0
votes

convertir le type de cellule double Excel en type de chaîne en utilisant POI

Je lis un fichier Excel qui a des cellules en double type. Je souhaite les lire et les imprimer sous forme de chaînes.

Mon exemple de fichier Excel contient les données suivantes.

Date | Ville | Crédit | Débit | Solde | Type 10-01-2019 | New Delhi | 1000000.00 || 1000000.00 | CR 10-01-2019 | Mumbai | 50000000.00 | 40000000.00 | 10000000.00 | CR 10-01-2019 | Chennai || 200000,00 | 200000,00 | DR 10-01-2019 | Kolkatta || 10000,00 | 10000,00 | DR 10-01-2019 | Srinagar | 100000000.00 | 40000000.00 | 60000000.00 | CR

Je veux imprimer le double montant sous forme de chaînes.

J'ai essayé le code suivant:

public static void main(String[] args) throws  FileNotFoundException{
        FileInputStream CA = new FileInputStream(new File("C:/Java projects/RBI/RBI.xlsx"));

        public static void main(String[] args) throws  FileNotFoundException{
        FileInputStream CA = new FileInputStream(new File("C:/Java projects/RBI/RBI.xlsx"));

    try
    {
        XSSFWorkbook CAworkbook = new XSSFWorkbook(CA);
        XSSFSheet sheet = CAworkbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheet.iterator();

        ArrayList<String> CA1 = new ArrayList<String>();

        while (rowIterator.hasNext())
        {
            Row row = rowIterator.next();
            Iterator<Cell> cellIterator = row.cellIterator();
            CA1.add( row.getCell(1) + "|" +row.getCell(2)+ "|" +row.getCell(3)+ "|" + row.getCell(4)+ "|" +row.getCell(5)+ "|" + row.getCell(6));   
            System.out.println( row.getCell(1) + "|" +row.getCell(2)+ "|" +row.getCell(3)+ "|" + row.getCell(4)+ "|" +row.getCell(5)+ "|" + row.getCell(6)); 
        }

    }
    catch (IOException e) {
            e.printStackTrace();
        }

}

La sortie est comme ci-dessous: -

10-01-2019 | New Delhi | 1000000.0 || 1000000.0 | CR 10-01-2019 | Mumbai | 5.0E7 | 4.0E7 | 1.0E7 | CR 10-01-2019 | Chennai || 200000,0 | 200000,0 | DR 10-01-2019 | Kolkatta || 10000,0 | 10000,0 | DR 10-01-2019 | Srinagar | 1.0E8 | 4.0E7 | 6.0E7 | CR


1 commentaires

3 Réponses :


0
votes

Si le problème est au format des doubles que vous avez, utilisez simplement String.format ("%. 2f", row.getCell (n)) au lieu de simplement row.getCell (n) Ce n'est pas un problème de framework POI mais de mesure du formatage des données Java . Veuillez suivre ceci < / a> ou ceci pour obtenir plus d'informations sur le sujet

UPD En fait, row.getCell (n) renvoie une instance de XSSFCell afin d'obtenir correctement et explicitement une valeur, vous devez utiliser row.getCell (n) .getNumericCellValue () < / code> méthode. Ou vous pouvez simplement appeler un row.getCell (n) .getStringCellValue () pour obtenir une valeur de chaîne directement


0 commentaires

1
votes

Vous avez plusieurs possibilités de créer une String à partir de votre double , mais toutes ne conservent pas toujours la représentation décimale régulière.

Je prendrai la première de vos nombres qui est affiché en représentation exponentielle comme le nombre d'exemple.

    DecimalFormat decimalFormat = new DecimalFormat("#.00#")
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        Iterator<Cell> cellIterator = row.cellIterator();
        String date = row.getCell(1);
        String city = row.getCell(2);
        // now apply the DecimalFormat
        String credit = decimalFormat.format(row.getCell(3));
        String debit = decimalFormat.format(row.getCell(4));
        String balance = decimalFormat.format(row.getCell(5));
        String type = row.getCell(6);

        /*
         * also you might want to have a single String concatenation 
         * of the other Strings if you use it more than once
         */
        String line = date + "|" + city + "|" + credit + "|" + debit 
                          + "|" + balance + "|" + type;

        CA1.add(line);   
        System.out.println(line); 
    }

La conclusion est d'appliquer une mise en forme désirée avant de créer une représentation String d'un double . Ma recommandation est de créer un DecimalFormat une fois (peut-être même en tant qu'attribut de classe ou constante) et de l'appliquer dans l'itération sur les cellules lors de la création de variables String à utiliser ultérieurement opérations. Ce faisant, vous n'avez pas à répéter les appels à l'itérateur de cellule, ce qui facilite la lecture de votre code:

public static void main(String[] args) {
    // your number that causes problems
    double a = 100000000.00;
    // just printing it will give you 1.0E8, not desired
    System.out.println(a);
    // using String.valueOf will output 1.0E8, not desired
    System.out.println(String.valueOf(a));
    // same thing if you box it and use toString(): 1.0E8, not desired
    System.out.println(new Double(a).toString());
    /* 
     * first operation that comes nearer to the desired output
     * gives 100000000.000000, better, but not desired
     */
    System.out.println(String.format("%f", a));
    // applying a specific formatting...
    DecimalFormat decimalFormat = new DecimalFormat("#.00#");
    // ... will give you the output you want to have, which is 100000000.00
    System.out.println(decimalFormat.format(a));
}

important: DecimalFormat semble dépendre de la valeur par défaut du système pour la représentation décimale car il renvoie 100000000,00 (attention à la virgule) dans mon IDE, qui se trouve sur une installation Windows européenne.


0 commentaires

0
votes

La solution simple serait

BigDecimal.valueOf( cell.getNumericCellValue()).toPlainString();


0 commentaires