Exporter les données d’un JTable en Excel

JTable est un composant Swing flexible qui est très bien adapté pour afficher des données dans un format tabulaire. Dans ce tutoriel nous allons découvrir comment exporter les données d’un JTable en Excel.

Excel utilise une mise en forme compliquée pour ses fichiers natifs .xls mais il prend également en charge d’autres formats. Pour ce tutoriel, nous utiliserons les valeurs séparées par des tabulations (TSV – Tab-Separated Values), qui sont couramment utilisées pour transférer des informations d’un programme de base de données vers une feuille de calcul.


 

Explication :
public void export(JTable table, File file){

Ici, nous avons une méthode qui accepte deux paramètres : une table d’où proviennent les données et un fichier dans lequel les données seront écrites.
 

TableModel m = table.getModel();

Chaque objet table utilise un modèle de table pour gérer les données de table réelles. Ainsi, dans ce code, l’objet model a été défini comme TableModel. La méthode getModel() renvoie ensuite le modèle de l’objet table, qui a été passé en paramètre, puis l’affecte à l’objet model. Par conséquent, l’objet model contient désormais les données à écrire dans le fichier Excel.
 

FileWriter fw = new FileWriter(file);

La classe FileWriter est destinée à l’écriture de flux de caractères. Cette ligne de code construit un objet FileWriter avec un objet File dans lequel écrire.
 

for(int i = 0; i < m.getColumnCount(); i++){
	fw.write(m.getColumnName(i) + "\t");
}

Cette boucle parcourt les colonnes, puis écrit simplement le nom de la colonne suivi d’une tabulation ("\t") dans l’objet FileWriter jusqu’à la dernière colonne, puis passe à la ligne suivante ("\n").
 

for(int i=0; i < m.getRowCount(); i++) {
	for(int j=0; j < m.getColumnCount(); j++) {
		fw.write(m.getValueAt(i,j).toString()+"\t");
	}
	fw.write("\n");
}

La boucle précédente faisait une boucle sur une seule ligne (évidemment, il n’y a qu’une seule ligne pour les noms de colonne). Cette fois, il parcoure une ligne pour obtenir la valeur de chaque colonne, l’écrira dans l’objet FileWriter suivi d’une tabulation ("\t"), puis passera à la ligne suivante ("\n"). Ce processus sera répété jusqu’à la dernière ligne … et cela explique la nécessité d’une boucle imbriquée – la boucle externe répète ce que la boucle interne a répété.
 

fw.close();

Ferme le flux de données.
 
 

Exemple Complet:
import javax.swing.table.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;

class JTableToExcel extends JFrame
{
	//Header de JTable 
	String[] columns = new String[] {
        "Id",
        "Nom", 
        "Adresse", 
        "Taux horaire", 
	};

	//données pour JTable dans un tableau 2D
	Object[][] data = new Object[][] {
        {1, "Thomas", "Paris", 20.0 },
        {2, "Jean", "Marseille", 50.0 },
        {3, "Yohan", "Lyon", 30.0 },
        {4, "Emily", "Toulouse", 60.0 },
        {5, "Alex", "Nice", 10.0 },
        {6, "Nicolas", "Lille", 11.5 },
	};
 
	//crée un JTable avec des données
	JTable table = new JTable(data, columns);
	JPanel panel = new JPanel(new BorderLayout());
	JButton btn = new JButton("Export");

	public JTableToExcel(){
		setSize(450,200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setTitle("Exporter JTable en Excel");
		panel.add(btn, BorderLayout.SOUTH);
		panel.add(new JScrollPane(table), BorderLayout.NORTH);
		add(panel);
		setVisible(true);
		btn.addActionListener(new MyListener());
	}

	public void export(JTable table, File file){
		try
		{
			TableModel m = table.getModel();
			FileWriter fw = new FileWriter(file);

			for(int i = 0; i < m.getColumnCount(); i++){
				fw.write(m.getColumnName(i) + "\t");
			}

			fw.write("\n");

			for(int i=0; i < m.getRowCount(); i++) {
				for(int j=0; j < m.getColumnCount(); j++) {
					fw.write(m.getValueAt(i,j).toString()+"\t");
				}
				fw.write("\n");
			}

			fw.close();
		}
		catch(IOException e){ System.out.println(e); }
	}

	public static void main(String[] args){
        new JTableToExcel();
	}

	class MyListener implements ActionListener{
	    public void actionPerformed(ActionEvent e){
	       if(e.getSource() == btn){
	         JFileChooser fchoose = new JFileChooser();
	         int option = fchoose.showSaveDialog(JTableToExcel.this);
	         if(option == JFileChooser.APPROVE_OPTION){
	           String name = fchoose.getSelectedFile().getName(); 
	           String path = fchoose.getSelectedFile().getParentFile().getPath();
	           String file = path + "\\" + name + ".xls"; 
	           export(table, new File(file));
	         }
	       }
	    }
	}
}

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *