[Java] Charger un fichier Excel dans une base

Fermé
GillouDeLabas - 20 mars 2007 à 12:25
 benjaa - 7 janv. 2009 à 16:10
Bonjour,

Je viens par le présent message remercier toutes les personnes qui ont répondu aux questions d’autres développeurs bloqués durant leur développement JAVA. Je m’initie actuellement à l’écriture de programme JAVA, et j’ai trouvé une aide précieuse sur ce site. Pour se faire, je viens déposer ma contribution pour les futurs développeurs JAVA.

Mes principaux problèmes étaient de lire un fichier Excel pour enregistrer les données dans une base MS Access. De ce fait, j’ai rencontré un certain nombre de problèmes. Je vais lister des mots clés qui m’ont permis de trouver les informations requises sur le Net afin de faciliter la recherche.

[*]Lecture / Connection / Déclaration / MS Access
[*]Lecture / Connection / Déclaration / Fichier Excel grâce à « JexcelApi »
[*]Formater les décimales avec une virgules / Remplacer un point par une virgule pour la décimale avec java.text.NumberFormat
[*]Formater une date / Format date AAAA/MM/JJ / Format date yyyy/MM/dd avec java.text.DateFormat
[*]Créer / Déclarer / une base MS Access dans ODBC sous Windows


L’installation de « JexcelApi » :
Après avoir récupérer le fichier sur le site http://jexcelapi.sourceforge.net/ créer un sous répertoire « jexcelapi » dans votre répertoire « Java ». Copier l’ensemble du fichier « .zip ». Ajouter le fichier « jxl.jar » avec son chemin complet dans votre CLASSPATH (Poste de travail => Avancé => Variable d’environnement => Variable système). Autres urls http://www.andykhan.com/jexcelapi/ http://www.koders.com/java/fid47965C5D5D85D348F7A7ACB8190819195665D12A.aspx qui peuvent vous aider.


Configuration d’ODBC sous Winsows :
Tout d’abord, nous avons accès sur nos Pc à cet outil de la manière suivante : Démarrer => Paramètres => Panneau de configuration => Outil d’administration => Source de données ODBC. Vous trouverez une petite aide sur l’url odbcintro
S’il vous manque des pilotes ODBC, vous devrez faire comme moi, les chercher sur le Net.


Formater en fonction des paramètres régionaux de votre Pc :
Suivant les cas, vous aurez besoin de transformer le point décimal par une virgule décimale, ajouter le symbole monétaire correspondant à votre pays, afficher une date dans un format spécifique ou un pourcentage. Vous trouverez de l’aide avec l’url https://www.oracle.com/java/technologies/

Pour finir, je colle mon programme dans ce message afin de vous aider à comprendre les différentes classes. Certains diront qu’il est possible d’optimiser certaines commandes, alors je leur serai grès de bien vouloir préciser comment avec la reprise de mon code.

Merci à tous pour votre lecture.

]import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.Sheet;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.LabelCell;
import jxl.NumberCell;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.DriverManager;

import java.util.Date;
import java.util.Locale;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

 

public class T07_LectureExcel extends Frame implements ActionListener, WindowListener
{
	// ---------------------------------------
	// Variable communes
	// ---------------------------------------
	
	TextArea TarTexte = new TextArea();	// La zone de TarTexte pour l'affichage
	String StrgEdit = "";			// Zone de conservation d'affichage
	Statement StatDB = null;		// Intentiation d'une commande sur la base
	ResultSet RstQuery = null;		// Résultat d'une resquête SQL
	String StrgQuery = "";			// Zone de commande SQL
	int intRes = 0;				// Test ajout enregistrement
	
	// Definition des formatages français
	NumberFormat NumForDecimal = NumberFormat.getInstance(Locale.FRENCH);
 	NumberFormat NumForMonnaie = NumberFormat.getCurrencyInstance(Locale.FRENCH);
	NumberFormat NumForPourcent = NumberFormat.getPercentInstance(Locale.FRENCH);
	DateFormat dtfDevis = new SimpleDateFormat("yyyy/MM/dd");
	
	//-----------------------------------------------------------------------
	// Construction de la class EdText
	// D‚finition et affichage de la boŒte de dialogue
	//-----------------------------------------------------------------------
	T07_LectureExcel()
	{
		// Titre de la fenêtre et zone de TarTexte
		super("Liste de fichiers");
		add("Center", TarTexte);

		Locale loc = Locale.getDefault();

		// Définition et affichage du système de menus
		MenuBar mb = new MenuBar();
		Menu ml = new Menu("Fichier");
		mb.add(ml);

		// Définition et affichage du système de sous menu du menu 01
		MenuItem il1 = new MenuItem("Chargement Devis");
		MenuItem il2 = new MenuItem("Quitter");
		ml.add(il1);
		ml.add(il2);
		setMenuBar(mb);

		il1.setActionCommand("Chargement");
		il2.setActionCommand("Quitter");

		il1.addActionListener(this);
		il2.addActionListener(this);

		// Taille par défaut de la Frame
		setSize(600,350);
	}

	//-----------------------------------------------------------------------------
	// Gestion de l'événement Case de fermeture
	//-----------------------------------------------------------------------------
	public void windowClosing(WindowEvent event)
	{
		System.exit(0);
	}
	public void windowClosed(WindowEvent event)
	{
	}
	public void windowDeiconified(WindowEvent event)
	{
	}	
	public void windowIconified(WindowEvent event)
	{
	}	
	public void windowActivated(WindowEvent event)
	{
	}	
	public void windowDeactivated(WindowEvent event)
	{
	}	
	public void windowOpened(WindowEvent event)
	{
	}

	//-----------------------------------------------------------------------------
	// Capture des événements liés au systême de menus
	//-----------------------------------------------------------------------------
	public void actionPerformed(ActionEvent evt)
	{
	
		//-----------------------------------------------------------------------
		// Commande Fichier => Chargement Devis
		//-----------------------------------------------------------------------
		if (evt.getActionCommand().equals("Chargement"))
		{
			FileDialog fichier = new FileDialog(this, "Ouvrir", FileDialog.LOAD);
			fichier.show();
			
			String StrgNom = fichier.getFile();
			String StrgDir = fichier.getDirectory();
			
			// ---------------------------------------			
			// Affichage du Contenu du fichier.
			// ---------------------------------------
			try
			{
				// =====================================
				// Ouverture de la base MS Access
				// =====================================
				
				// Chargement du pilote JDBC
				Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
				
				// URL de connexion
				String StrgUrl = "jdbc:odbc:2007DB";
	
				// Connexion
				Connection ConDB = DriverManager.getConnection(StrgUrl);
	
				// =====================================
				// Ouverture du fichier Excel
				// =====================================
				
				Workbook WbFichier = Workbook.getWorkbook(new File(StrgDir+StrgNom));
				
				// Ouverture de la première feuille, la seconde est 1, etc. 
				Sheet ShtFeuille = WbFichier.getSheet(0); 
								
				// *************************************
				// **         TABLE DEVIS             **
				// *************************************

				// Récupération de la valeur d'une cellule
				Cell cel01 = ShtFeuille.getCell("J4"); 		// Numéro de devis 
				Cell cel02 = ShtFeuille.getCell("O2"); 		// Date du devis
				Cell cel03 = ShtFeuille.getCell("C10"); 	// Nom du contact
				Cell cel04 = ShtFeuille.getCell("C11"); 	// Nom de la société
				Cell cel05 = ShtFeuille.getCell("C12"); 	// Adresse 1
				Cell cel06 = ShtFeuille.getCell("C13"); 	// Adresse 2
				Cell cel07 = ShtFeuille.getCell("Q9"); 		// Classe tarif
				Cell cel08 = ShtFeuille.getCell("R9"); 		// Coefficient tarif
				Cell cel09 = ShtFeuille.getCell("Q12"); 	// Nombre de mois gratuit
				Cell cel10 = ShtFeuille.getCell("Q14"); 	// Durée du contrat
				
				// Convertion de données
				double DblNumDevis = 0;
				String StrgNumDevis = "";
				Date dtDevis = null;
				String StrgNomContact = "";
				String StrgNomSociete = "";
				String StrgNomAdresse1 = "";
				String StrgNomAdresse2 = "";
				String StrgClasseTarif = "";
				double dblCoefTarif = 0;
				double dblNbMoisGratuit = 0;
				double dblDureeContrat = 0;
				
				// ---------------------------------
				// Contrôle du format de la cellule
				// ---------------------------------
				
				// 01 - Vérifie si la valeur est un nombre
				if (cel01.getType() == CellType.NUMBER) 
				{ 
					NumberCell nc = (NumberCell) cel01; 
					DblNumDevis = nc.getValue();
					StrgNumDevis = "" + (int) DblNumDevis;
				}
				
				// 01 - Vérifie si la valeur est une chaîne
				if (cel01.getType() == CellType.LABEL) 
				{ 
					LabelCell lc = (LabelCell) cel01; 
					StrgNumDevis = lc.getString(); 
				} 
				
				// 02 - Vérifie si la valeur est un date 
				if (cel02.getType() == CellType.DATE) 
				{ 
					DateCell dc = (DateCell) cel02; 
					dtDevis = dc.getDate();
				} 
 
				// 03 - Vérifie si la valeur est une chaîne
				//if (cel03.getType() != CellType.EMPTY) 
				
				if (cel03.getType() == CellType.LABEL) 
				{ 
					LabelCell lc = (LabelCell) cel03; 
					StrgNomContact = lc.getString(); 
				}
				
				// 04 - Vérifie si la valeur est une chaîne
				if (cel04.getType() == CellType.LABEL) 
				{ 
					LabelCell lc = (LabelCell) cel04; 
					StrgNomSociete = lc.getString(); 
				}
				
				// 05 - Vérifie si la valeur est une chaîne
				if (cel05.getType() == CellType.LABEL) 
				{ 
					LabelCell lc = (LabelCell) cel05; 
					StrgNomAdresse1 = lc.getString(); 
				}
				
				// 06 - Vérifie si la valeur est une chaîne
				if (cel06.getType() == CellType.LABEL) 
				{ 
					LabelCell lc = (LabelCell) cel06; 
					StrgNomAdresse2 = lc.getString(); 
				}
				
				// 07 - Vérifie si la valeur est une chaîne
				if (cel07.getType() == CellType.LABEL) 
				{ 
					LabelCell lc = (LabelCell) cel07; 
					StrgClasseTarif = lc.getString(); 
				}
				
				// 08 - Vérifie si la valeur est un nombre
				if (cel08.getType() == CellType.NUMBER) 
				{ 
					NumberCell nc = (NumberCell) cel08; 
					dblCoefTarif = nc.getValue(); 
				}
				
				// 09 - Vérifie si la valeur est un nombre
				if (cel09.getType() == CellType.NUMBER) 
				{ 
					NumberCell nc = (NumberCell) cel09; 
					dblNbMoisGratuit = nc.getValue(); 
				}
				
				// 10 - Vérifie si la valeur est un nombre
				if (cel10.getType() == CellType.NUMBER) 
				{ 
					NumberCell nc = (NumberCell) cel10; 
					dblDureeContrat = nc.getValue(); 
				}
				
				// Affichage de la sélection dans l'éditeur
				StrgEdit =	"*************************" + "\n" +
						"**      TABLE DEVIS    **" + "\n" +
						"*************************" + "\n" +
						"Fichier                : " + StrgDir+StrgNom + "\n" +
						"Numéro de devis        : " + StrgNumDevis + "\n" + 
						"Date du devis          : " + dtfDevis.format(dtDevis) + "\n" +
						"Contact                : " + StrgNomContact + "\n" + 
						"Nom de la société      : " + StrgNomSociete + "\n" + 
						"Ligne n°1 de l'adresse : " + StrgNomAdresse1 + "\n" + 
						"Ligne n°2 de l'adresse : " + StrgNomAdresse2 + "\n" + 
						"Classe tarif           : " + StrgClasseTarif + "\n" + 
						"Coefficient tarif      : " + NumForDecimal.format(dblCoefTarif) + "\n" + 
						"Nombre de mois gratuit : " + (int) dblNbMoisGratuit + "\n" + 
						"Durée du contrat       : " + (int) dblDureeContrat + "\n\n";
				TarTexte.setText(StrgEdit);
						
				// Affichage de la requête dans l'éditeur
				StrgEdit = StrgEdit +	"********************************" + "\n" +
							"**  CONTROLE DU DEVIS  **" + "\n" +
							"********************************" + "\n\n";

				// Construction de la requête de selection
				StrgQuery = "SELECT Devis.* FROM Devis WHERE Devis.NumDevis = '" + StrgNumDevis + "'";
				StrgEdit = StrgEdit + StrgQuery + "\n\n";
								
				// Contrôle d'existance du devis dans la table DEVIS
				// -> Penser à déclarer les Field Summary pour utiliser certaines méthodes 
				StatDB = ConDB.createStatement(	ResultSet.TYPE_SCROLL_INSENSITIVE, 
								ResultSet.CONCUR_UPDATABLE );
				RstQuery = StatDB.executeQuery(StrgQuery);
				
				// Positionner le curseur en fin de sélection
				RstQuery.last();
				// Récupérer le nombre de lignes
				int intRes = RstQuery.getRow();
				// Re positionner le curseur au début de sélection
				RstQuery.first();
		
				// Test si un enregistrement est trouvé
				if (intRes == 0)
				{
					// Initialisation du nouvel enregistrement dans la table DEVIS
					StrgQuery = "INSERT INTO Devis VALUES ( '" + StrgNumDevis + "', " +
										"'" + dtfDevis.format(dtDevis) + "', " +
										"'" + StrgDir+StrgNom + "', " +
										"'" + StrgNomContact + "', " +
										"'" + StrgNomSociete + "', " + 
										"'" + StrgNomAdresse1 + "', " + 
										"'" + StrgNomAdresse2 + "', " + 
										"'" + StrgClasseTarif + "', " + 
										"'" + NumForDecimal.format(dblCoefTarif) + "', " +
										"'" + (int) dblNbMoisGratuit + "', " + 
										"'" + (int) dblDureeContrat + "', " + 
										"'" + dtfDevis.format(new Date()) +
										"', null, null)";										
					StrgEdit = StrgEdit + StrgQuery + "\n\n";
					
					// Enregistrement du nouvel enregistrement dans la table DEVIS
					intRes = StatDB.executeUpdate(StrgQuery);
					
					// Test si l'enregistrement a bien été enregistré
					if (intRes == 1 )
						StrgEdit = StrgEdit + "Nouveau devis '" + StrgNumDevis + "' crée dans la table DEVIS. \n\n";
				}
				else
					StrgEdit = StrgEdit + "Le devis '" + StrgNumDevis + "' existe déjà dans la table DEVIS. \n\n";							
				
				
				// Affichage de la requête dans l'éditeur
				TarTexte.setText(StrgEdit);
				
				// ---------------------------------------
				// Fermeture du fichier
				// ---------------------------------------
				WbFichier.close();
				ConDB.close();
			}
			
			// ---------------------------------------			
			// Gestion des erreurs
			// ---------------------------------------
			catch(jxl.read.biff.BiffException biffE)
			{ 
				biffE.printStackTrace();
				System.exit(1);
			}
			catch(IOException ioe)
			{ 
				ioe.printStackTrace();
				System.exit(1);
			}
			catch(ClassNotFoundException cnfee) 
			{
				cnfee.printStackTrace();
				System.exit(1);
			}
			catch(SQLException sqle) 
			{
				System.out.println("SQLException : " + sqle.getErrorCode());
				switch (sqle.getErrorCode())
				{
					default :
					{
						sqle.printStackTrace();
						System.exit(1);
					}
				}
			}

		}

		//-----------------------------------------------------------------------
		// Commande Fichier/Quitter
		//-----------------------------------------------------------------------
		if (evt.getActionCommand().equals("Quitter"))
		{
			System.exit(0);
		}
	}

	//----------------------------------------------------------------------------------
	// D‚finition d'une frame pour l'application et affichage de la
	// boŒte de dialogue
	//----------------------------------------------------------------------------------
	public static void main(String args[])
	{
		T07_LectureExcel editer = new T07_LectureExcel();
		editer.show();
		editer.addWindowListener(editer);
	}		
}
A voir également:

1 réponse

Bonjour,

tt d'abord je tiens a vous remercier pour l'aide que vous apportez a tt le monde en mettant des exemples de codes a la portée.
en fait on est en train de developper une application qui consiste a ecrire ds un fichier excel.
le fichier existe déja et fait de tel sorte e ce qu'il réexploite les données intriduites par ntre proramme java.
ce qu'on cherche c'est coment peut-on ouvrir le fichier sans l'écraser et créer un deuxième.

Merci d'avance.
0