Créer une application JAVA à partir d'un fichier Excel

Franz87 Messages postés 1 Date d'inscription jeudi 1 juin 2023 Statut Membre Dernière intervention 1 juin 2023 - 1 juin 2023 à 00:31
 Franz87 - 1 juin 2023 à 16:38

Quelqu'un peut-il m'aider? Je veux créer une application java à base d'un tableau Excel pour que ça puisse faire exactement le même travail.

4 réponses

KX Messages postés 16747 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 9 juillet 2024 127
1 juin 2023 à 08:48

Bonjour,

À part les éventuelles formules qui se cachent dans les champs calculés qui peuvent être plus ou moins compliquées à retranscrire, c'est un travail relativement simple et très automatique.

Il y a néanmoins deux approches possibles : faire une interface graphique qui ressemble à la feuille Excel (plus ergonomique), ou un programme console (plus simple) qui pose les questions une à une pour remplir les entrées et donner les résultats.


Bonjour
 

graphique je peux réaliser un visuel de ce que je vois comme application. mais côté code, je suis nulle. je ne sais pas comment démarrer. comment coller du code ou quel code coller derrière le graphisme que je vais réaliser.

KX Messages postés 16747 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 9 juillet 2024 127
1 juin 2023 à 16:27

"je ne sais pas comment démarrer"
Pour un affichage de type grille Excel comme tu peux le faire, ça s'automatise assez facilement, tu peux considérer ce petit bout de code, j'en donnerai un exemple d'utilisation en dessous.

import javax.swing.*;
import java.awt.*;
import java.util.*;

public class GridContainerBuilder {
    private final Map<Point, Component> components = new HashMap<>();
    private int nbRows = 0, nbCols = 0;

    public GridContainerBuilder add(Point point, Component component) {
        nbCols = Math.max(nbCols, point.x);
        nbRows = Math.max(nbRows, point.y);
        components.put(point, component);
        return this;
    }

    public GridContainerBuilder add(int colX, int colY, Component component) {
        return add(new Point(colX, colY), component);
    }

    public GridContainerBuilder add(String excelXY, Component component) {
        return add(excelCoordinates(excelXY), component);
    }

    public Container build() {
        var container = new Container();
        var layout = new GroupLayout(container);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(group(layout, true));
        layout.setVerticalGroup(group(layout, false));
        container.setLayout(layout);
        return container;
    }

    private GroupLayout.SequentialGroup group(GroupLayout layout, boolean isHorizontal) {
        var sequentialGroup = layout.createSequentialGroup();
        for (int sequentialIndex = 0, sequentialLimit = isHorizontal ? nbCols : nbRows; sequentialIndex <= sequentialLimit; sequentialIndex++) {
            var parallelGroup = layout.createParallelGroup();
            for (int parallelIndex = 0, parallelLimit = isHorizontal ? nbRows : nbCols; parallelIndex <= parallelLimit; parallelIndex++) {
                var point = isHorizontal ? new Point(sequentialIndex, parallelIndex) : new Point(parallelIndex, sequentialIndex);
                components.putIfAbsent(point, new Label());
                parallelGroup.addComponent(components.get(point));
            }
            sequentialGroup.addGroup(parallelGroup);
        }
        return sequentialGroup;
    }

    private static Point excelCoordinates(String excelXY) {
        int x = 0, y = 0;
        for (var i = 0; i < excelXY.length(); i++) {
            var c = excelXY.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                x = 26 * x + c - 'A' + 1;
            } else if (c >= 'a' && c <= 'z') {
                x = 26 * x + c - 'a' + 1;
            } else if (c >= '0' && c <= '9') {
                y = 10 * y + c - '0';
            }
        }
        return new Point(x - 1, y - 1);
    }
}

"quel code coller derrière le graphisme"
Il s'agira plus ou moins de la retranscription des formules Excel existantes.

Avec ton image, je distingue trois types de cellules dans la feuille Excel :

  • Les libellés (exemple : A4, A5, A6), c'est le plus facile, c'est juste du texte qui ne change jamais
  • Les entrées (exemple : B4, B5), c'est là où l'utilisateur saisit des valeurs, chaque modification entraine un recalcul du résultat dans Excel, mais dans ton application, une alternative plus simple serait d'rajouter un bouton qui calcul tous les résultats qu'au moment où on appuie dessus.
  • Les sorties (exemple : B6) c'est le résultat des différents calculs obtenu en fonction des entrées, 

Si on utilise le code précédent, en l'application à ton exemple des cellules A4:B6 ça donne ceci :

import javax.swing.*;
import java.time.LocalDate;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        var formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

        var b4Text = new JTextArea(LocalDate.now().format(formatter));
        var b5Text = new JTextArea(Year.now().atMonth(12).atDay(31).format(formatter));
        var b6Text = new JTextArea();

        var a1Button = new JButton("Calcul");
        a1Button.addActionListener(e -> {
            var b4Date = LocalDate.parse(b4Text.getText(), formatter);
            var b5Date = LocalDate.parse(b5Text.getText(), formatter);
            var b6Integer = ChronoUnit.DAYS.between(b4Date, b5Date);
            b6Text.setText(String.valueOf(b6Integer));
        });

        var frame = new JFrame();
        frame.add(new GridContainerBuilder()
                .add("A1", a1Button)
                .add("A4", new JLabel("DATE D'EFFET")).add("B4", b4Text)
                .add("A5", new JLabel("DATE D'ECHEANCE")).add("B5", b5Text)
                .add("A6", new JLabel("PERIODE DE COUVERTURE")).add("B6", b6Text)
                .build());
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

On obtient alors une interface assez similaire à la feuille Excel :

Ne sachant pas ce que doit faire la feuille Excel, j'ai essayé d'inventer des trucs pour l'exemple :

  • La date d'effet (B4) est par défaut la date du jour
  • La date d'échéance (B5) est par défaut le dernier jour de l'année courante
  • La période de couverture est recalculé quand on appuie sur le bouton, c'est le nombre de jours de différence entre les deux dates précédentes.

Au final, rien de très compliqué à part reprendre de la feuille Excel chaque champs calculé et reporter le calcul dans l'action du bouton.


Mon frère, je vois que tu es vraiment caller en matière de programmation. Le fichier en faite est un tarifeur pour le calcule de prime d'assurance en assurance maladie. J'ai envie de mettre ne place une application qui peut le faire de façon automatisé en renseignant progressivement certaine informations. Je pourrais mieux te l'expliquer car cette application pourrais servir au plus grand nombre. le calcul automatisé n'est qu'une parti de ce que je veux obtenir comme application.

Rejoignez-nous