package importation.xls;
import gui.MotsCleProjet;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import modele.course.Tournee;
import modele.course.Trajet;
/**
* <p>XlsTourneeImportateur : c'est une classe qui importe les fichiers (tourn�es) au format Xls</p>
* <p> Il importe les deux fichiers en m�me temps,
* il s'agit de la feuille excel de la tourn�e et des trajets</p>
*
*
* @author Kasandra
*
*/
public class XlsTourneeImportateur {
/**
* importe les fichiers
* @param fluxFichier : flux entr�e
* @param nomDeLaFeuilleTourn�e : feuille de la tourn�e
* @param decodeurTournee :d�codeur de la tourn�e
* @param nomDeLaFeuilleTrajet : feuille des trajets
* @param decodeurTrajet : d�codeur des trajets
*
* @return Collection<Tournee>
*
* @throws Exception
*/
public Collection<Tournee> importe(InputStream fluxFichier, String nomDeLaFeuilleTourn�e, IXlsDecodeur<Tournee> decodeurTournee, String nomDeLaFeuilleTrajet, IXlsDecodeur<Trajet> decodeurTrajet) throws Exception {
Workbook classeur = null;
try {
// prend dans un fichier Xls et lit le contenu du fichier entr�
classeur = Workbook.getWorkbook(fluxFichier);
//Obtient la feuille avec le nom sp�cifi� � partir de ce classeur.
Sheet feuilleTourn�e = classeur.getSheet(nomDeLaFeuilleTourn�e);
//d�finit un ensemble de couples (tableau cl�/valeur pour la tournee
final HashMap<String, Tournee> tourn�es = importeTourn�es(feuilleTourn�e, decodeurTournee);
Sheet feuilleTrajets = classeur.getSheet(nomDeLaFeuilleTrajet);
importeTrajets(feuilleTrajets, decodeurTrajet, new ITrajetListener() {
@Override
public void onTrajet(String idTourn�e, Trajet trajet) {
Tournee tournee = tourn�es.get(idTourn�e);
tournee.addTrajet(trajet);
trajet.setTournee(tournee);
}
});
return tourn�es.values();
}
finally {
if (classeur != null) {
classeur.close();
}
}
}
/**
* importe les trajets
* @param feuilleTrajets: feuille excel trajet
* @param decodeurTrajet : d�codeur trajet
* @param trajetListener
*
* <p> Si le contenu de la cellule c'est une date, il le formate au format voulu.</p>
* <p> Dans notre cas, on a besoin d'afficher seulement l'heure.</p>
*/
private void importeTrajets(Sheet feuilleTrajets, IXlsDecodeur<Trajet> decodeurTrajet, ITrajetListener trajetListener) {
final int nombreDeLignes = feuilleTrajets.getRows();
int[] colonnesALire = decodeurTrajet.colonnesALire();
for (int numeroDeLigne = 0; numeroDeLigne < nombreDeLignes; numeroDeLigne++) {
Map<Integer,String> ligne = new HashMap<Integer,String>();
for (int numeroDeColonne : colonnesALire) {
String valeurDeLaCellule;
Cell cellule = feuilleTrajets.getCell(numeroDeColonne,numeroDeLigne);
if (cellule.getType() == CellType.DATE) {
//Une cellule de feuille de calcul qui contient une date
DateCell celluleDate = (DateCell) cellule;
Date date = celluleDate.getDate();
valeurDeLaCellule = new SimpleDateFormat(MotsCleProjet.TIME_FORMAT).format(date);
} else {
valeurDeLaCellule = cellule.getContents();
}
ligne.put(numeroDeColonne,valeurDeLaCellule);
}
trajetListener.onTrajet(ligne.get(0), decodeurTrajet.decode(ligne));
}
}
/**
* <p>Importe la tourn�e </p>
* <p>Il re�oit en param�tre :</p> *
* @param feuilleTourn�e : feuille excel de la tourn�e
* @param decodeurTournee : d�code la tourn�e
*
* <p> Si le contenu de la cellule c'est une date, il le formate au format voulu.</p>
* <p> Dans notre cas, on a besoin d'afficher la date et l'heure.</p>
*
* @return tourn�es
*/
private HashMap<String, Tournee> importeTourn�es(Sheet feuilleTourn�e, IXlsDecodeur<Tournee> decodeurTournee) {
HashMap<String, Tournee> tourn�es = new HashMap<String, Tournee>();;
final int nombreDeLignes = feuilleTourn�e.getRows();
int[] colonnesALire = decodeurTournee.colonnesALire();
for (int numeroDeLigne = 0; numeroDeLigne < nombreDeLignes; numeroDeLigne ++) {
Map<Integer,String> ligne = new HashMap<Integer,String>();
for (int numeroDeColonne : colonnesALire) {
String valeurDeLaCellule;
Cell cellule = feuilleTourn�e.getCell(numeroDeColonne,numeroDeLigne);
if (cellule.getType() == CellType.DATE) {
//Une cellule de feuille de calcul qui contient une date
DateCell celluleDate = (DateCell) cellule;
Date date = celluleDate.getDate();
valeurDeLaCellule = new SimpleDateFormat(MotsCleProjet.DATE_TIME_FORMAT).format(date);
} else {
valeurDeLaCellule = cellule.getContents();
}
ligne.put(numeroDeColonne,valeurDeLaCellule);
}
tourn�es.put(ligne.get(0),decodeurTournee.decode(ligne));
}
return tourn�es;
}
/**
* l'interface ITrajetListener
* @author Kasandra
*
*/
private interface ITrajetListener {
/**
*
* @param idTourn�e
* @param trajet
*/
void onTrajet(String idTourn�e, Trajet trajet);
}
}