LibXls, librairie C++/Excel
Plan :
A. Presentation :
LibXls a été réalisée par des étudiants de l'école Sup'Galilée
dans le cadre d'un projet d'année. Cette librairie permet la
manipulation (creation, lecture, modification, mise en page) de
fichiers excel via un code C++.
Cette librairie utilise deux librairies déjà existantes qui sont
XlsLib pour l’écriture et
LibXls pour la lecture.
Pourquoi ?
- Elles sont gratuites et Open Source
- Elles permettent la gestion des mises en page de fichiers xls aussi bien en lecture qu’en écriture
- Elles
fonctionnent correctement (quelques bugs mais beaucoup moins que les
autres librairies telle que BasicExcel qui ne lit que les fichiers
qu’elle a créés)
- XlsLib est multiplateforme (LibXls a posé quelques soucis de ce point de vue)
Les formats lus par cette API sont :
- XLS
- CSV : Coma Separated Values => données séparées par des points-virgules.
- De plus la méthode permettant de lire les fichiers CSV peut être adaptée lors de son appel en modifiant le séparateur.
Cela est possible à partir du prototype suivant (de la classe XLSFile) :
XLSSheet openCsv( const string csvName, const char separator, const string sheetName)
Les formats de sortie sont :
- XLS
- CSV
- HTML (avec la méthode de copie fournie : copyXlstoHtml).
Cette librairie a été testée sous :
- Windows XP
- Windows VISTA
- Windows 7
- Ubuntu
- Debian
B. Téléchargement :
Vous pouvez télécharger la bibliothèque excel avec le lien ci-dessous :
téléchargement sourceforge
C. Fonctionnalités implémentées :
Dans le but d'offrir le maximum d'options à l'utilisateur, nous avons implémenté de nombreuses méthodes.
Afin
de toutes les évoquer nous allons procéder tout d’abord par une
présentation des types à connaitre qui sont majoritairement issus de la
librairie « XlsLib ». Ensuite nous continuerons sur une présentation
des méthodes de la classe XLSFile, puis celles de XLSSheet. Enfin, nous
finirons par la présentation des fonctions supplémentaires.
Raccourcis :
1. Les principaux types utilisés :
- use_option :
Ce type est utilisé lors de la création de fichier xls avec notre API.
Il permet de determiner si on créé un fichier ou si on veut lire et
ecrire dans un fichier. Les instances de ce type prennent pour valeur :
CREATE, RW
- color_name_t :
Ce type correspond aux couleurs. Les instances de ce type peuvent prendre pour valeur :
CLR_BLACK, CLR_BROWN, CLR_OLIVE_GREEN,
CLR_DARK_TEAL, CLR_DARK_BLUE, CLR_INDIGO,
CLR_DARK_RED, CLR_ORANGE, CLR_DARK_YELLOW,
CLR_TEAL, CLR_BLUE, CLR_BLUE_GRAY,
CLR_RED, CLR_LITE_ORANGE, CLR_LIME,
CLR_AQUA, CLR_LITE_BLUE, CLR_VIOLET,
CLR_PINK, CLR_GOLD, CLR_YELLOW,
CLR_TURQUOISE, CLR_SKY_BLUE, CLR_PLUM,
CLR_ROSE, CLR_TAN, CLR_LITE_YELLOW,
CLR_PALE_BLUE, CLR_LAVENDER, CLR_LITE_TURQUOISE,
CLR_PERIWINKLE, CLR_PLUM2, CLR_IVORY,
CLR_DARK_PURPLE, CLR_CORAL, CLR_OCEAN_BLUE,
CLR_DARK_BLUE2, CLR_PINK2, CLR_YELLOW2,
CLR_VIOLET2, CLR_DARK_RED2, CLR_TEAL2,
CLR_DARK_GREEN, CLR_GRAY80, CLR_GREEN,
CLR_GRAY50, CLR_SEA_GREEN, CLR_GRAY40
CLR_BRITE_GREEN, CLR_GRAY25, CLR_LITE_GREEN,
CLR_WHITE, CLR_ICE_BLUE, CLR_LITE_TURQUOISE2,
CLR_TURQUOISE2, CLR_BLUE2
- fill_option_t :
Ce type permet de definir différents types de fond pour une cellule. Les instances de ce type peuvent prendre pour valeur :
FILL_NONE, FILL_SOLID, FILL_HORIZ_INTER_THICK ,
FILL_ATEN50, FILL_ATEN25, FILL_HORIZ_LINES_THIN,
FILL_ATEN06, FILL_HORIZ_LIN, FILL_VERTICAL_LIN,
FILL_DIAG, FILL_INV_DIAG, FILL_HORIZ_INT_THIN,
FILL_ATEN75, FILL_ATEN12, FILL_DIAG_THICK_INTER,
FILL_INTER_DIAG, FILL_DIAG_THIN, FILL_VERTICAL_LINES_THIN,
FILL_INV_DIAG_THIN
- border_side_t :
Ce type permet de déterminer sur quelle bordure d’une cellule nous
allons effectuer des motifications. Les instances de ce type peuvent
prendre pour valeur :
BORDER_BOTTOM, BORDER_TOP, BORDER_LEFT, BORDER_RIGHT
- border_style_t :
Ce type est utilisé pour affecter un type de bordure à une cellule. Les instances de ce type peuvent prendre pour valeur :
BORDER_THIN, BORDER_MEDIUM, BORDER_DASHED,
BORDER_DOTTED, BORDER_THICK, BORDER_DOUBLE,
BORDER_NONE, BORDER_HAIR
- boldness_option_t :
Ce type est utilisé pour représenter les différents types de gras. Les instances de ce type peuvent prendre pour valeur :
BOLDNESS_BOLD, BOLDNESS_HALF, BOLDNESS_NORMAL, BOLDNESS_DOUBLE
- underline_option_t :
Ce type est utilisé pour décrire les différents types de soulignement.
Les instances de ce type peuvent prendre pour valeur :
UNDERLINE_NONE, UNDERLINE_SINGLE, UNDERLINE_DOUBLE,
UNDERLINE_SINGLEACC, UNDERLINE_DOUBLEACC
- script_option_t :
Ce type est utilisé afin de représenter les différents types d’indices.
Les instances de ce type peuvent prendre pour valeur :
SCRIPT_NONE, SCRIPT_SUPER, SCRIPT_SUB
- halign_option_t :
Ce type est utilisé dans le but de décrire les différents types
d’alignement horizontal. Les instances de ce type peuvent prendre pour
valeur :
HALIGN_GENERAL, HALIGN_LEFT, HALIGN_CENTER,
HALIGN_RIGHT, HALIGN_FILL, HALIGN_JUSTIFY,
HALIGN_CENTERACCROSS
- valign_option_t :
Ce type est utilisé pour décrire les différents types d’alignement
vertical. Les instances de ce type peuvent prendre pour valeur :
VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM,
VALIGN_JUSTIFYS
- txtori_option_t :
Ce type est utilisé afin de représenter les différents types
d’orientation du texte dans une cellule. Les instances de ce type
peuvent prendre pour valeur :
ORI_NONE, ORI_TOPBOTTOMTXT, ORI_90NOCLOCKTXT,
ORI_90CLOCKTXT
2. Les méthodes de XLSFile :
Voici la liste des méthodes de la classe XLSFile et leur fonctionnalité :
- XLSFile(const string chem,use_option m=CREATE) :
Constructeur de la classe XLSFile.
- inline void setFilePath(const string cheminFichier) :
Modification du chemin du fichier.
- inline string getFilePath() :
Obtention du chemin du fichier.
- inline int getNbSheet() :
Obtention du nombre de pages (sheets) du fichier.
- XLSSheet newSheet(const string name="sheet") :
Initalise une feuille de travail (XLSSheet) dans le fichier xls.
- XLSSheet getSheet(const int numPage) :
Retrouve une feuille de travail (XLSSheet) dans le fichier xls.
- void save() :
Sauvegarder du fichier xls.
- void save(const string path) :
Sauvegarde du fichier xls au chemin path (exemple : ./monRep/monFich.xls).
- XLSSheet openCsv(const string csvName,const char separator=';',const string sheetName="sheetCsv")
Et
XLSSheet openCsv2(const string csvName,const char separator=';',const string sheetName="sheetCsv") :
Permet d'ouvrir des fichiers CSV et rempli une feuille à partir de ce fichier.
- void saveToCsv(const string csvName) :
Permet de sauvegarder le fichier xls dans un format CSV au chemin path (exemple : ./monRep/monFich.csv).
3. Les méthodes de XLSSheet :
Voici la liste des méthodes de la classe XLSSheet et leur fonctionnalité :
- XLSSheet(const string nom,workbook w) :
Constructeur de la classe XLSSheet. Ce constructeur crée la feuille à
partir d'un nom et d'un workbook (workBook est un type de XlsLib).
- XLSSheet(worksheet* wsh) :
Ce constructeur crée une feuille XLSSheet à partir d'une autre. Lève une exeption si wsh est NULL.
- inline string getName() :
Retourne le nom de la feuille.
- void deleteContent(const unsigned long int ligne,const unsigned long int colonne) :
Supprime le contenu de la case correspondant à la ligne et la collone données en paramètre.
- void setText(const unsigned long int ligne,const unsigned long int colonne,const string txt) :
Remplit une cellule avec un texte.
- void setNumber(const unsigned long int ligne,const unsigned long int colonne, const double d) :
Remplit une cellule avec un réel.
- void setNumber(const unsigned long int ligne,const unsigned long int colonne, const int i) :
Remplit une cellule avec un entier.
-
void setTabNumber(const int *tab,const unsigned long int nbline ,const
unsigned long int nbCol,const unsigned long int ldep=0 ,const unsigned
long int cdep=0) :
Remplit une feuille avec un tableau
d'entiers. On donne en parametre la ligne et la colonne de la cellule à
partir de laquelle on copie le tableau dans la feuille.
-
void setTabNumber(const double *tab,const unsigned long int
nbLigne,const unsigned long int nbCol,const unsigned long int
ldep=0,const unsigned long int cdep=0) :
Remplit une feuille
avec un tableau de double. On donne en parametre la ligne et la colonne
de la cellule à partir de laquelle on copie le tableau dans la feuille.
-
void setTabText(const string *tab,const unsigned long int nbLigne,const
unsigned long int nbCol,const unsigned long int ldep=0,const unsigned
long int cdep=0) :
Remplit une feuille avec un tableau de
texte. On donne en parametre la ligne et la colonne de la cellule à
partir de laquelle on copie le tableau dans la feuille.
- void setRowHeight(const unsigned long int numLine,const unsigned long int size) :
Fixe la hauteur d'une ligne indique en parametre à une taille indiquée en parametre.
ATTENTION : A faire avant de remplir la ligne
- void setColWidth(const unsigned long int numCol, const unsigned long int size) :
Fixe la largeur d'une colonne indique en parametre à une taille indiquée en parametre.
ATTENTION : A faire avant de remplir la colonne
-
void setCellMerge(const unsigned long int lineDep, const unsigned long
int ColDep, const unsigned long int lineEnd, const unsigned long int
colEnd) :
Definition du debordement d'une cellule sur les autres.
La Cellule de position (LineDep, ColDep) s'etendra jusqu'a la position (LineEnd, ColEnd)
- void setCellBgColor(const unsigned long int line, const unsigned long int col,const color_name_t color) :
Definition de la couleur de fond d'une cellule present dans la ligne et la colonne donnees en parametre.
ATTENTION : A utiliser après avoir rempli la cellule
-
void setCellBorderStyle(const unsigned long int line, const unsigned
long int col, const border_side_t border, const border_style_t bs =
BORDER_THIN, const color_name_t color = CLR_BLACK) :
Definition du style et de la couleur d'un bord d'une cellule.
ATTENTION : A utiliser après avoir rempli la cellule
-
void setCellFrame(const unsigned long int line, const unsigned long int
col, const color_name_t color = CLR_BLACK, const border_style_t bs =
BORDER_THIN) :
Ajoute un cadre de couleur color et de type de bord bs a la cellule de la ligne et colonne.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFont(const unsigned long int line, const unsigned long int col,const string font) :
Definition de la police d'une cellule de la ligne et colonne.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontColor(const unsigned long int line, const unsigned long int col,const color_name_t color) :
Definition de la police d'une cellule de la ligne et colonne.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontHeight(const unsigned long int line, const unsigned long int col,const unsigned int size) :
Definition de la taille de la police dans la cellule.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontBold(const unsigned long int line, const unsigned long int col,const boldness_option_t bold) :
Definition de la taille de la police dans la cellule de la ligne et colonne.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontUnderline(const unsigned long int line, const unsigned long int col,const underline_option_t ul) :
Definition du type de souligne de la cellule de la ligne et colonne.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontScript(const unsigned long int line, const unsigned long int col,const script_option_t sc) :
Definition du Script de la cellule de la ligne et colonne, exposant, indice ou rien.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontItalic(const unsigned long int line, const unsigned long int col,const bool it) :
Definit si le contenu de la cellule de la ligne et colonne est en italic ou non.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontStrikeout(const unsigned long int line, const unsigned long int col,const bool so) :
Definit si le contenu de la cellule est barre ou non.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontOutline(const unsigned long int line, const unsigned long int col,const bool ol) :
Permet d'afficher uniquement le contour du texte.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontShadow(const unsigned long int line, const unsigned long int col,const bool sha) :
Permet d'afficher une ombre sur le contenu de la cellule.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontHAlign(const unsigned long int line, const unsigned long int col,const halign_option_t align) :
Definit l'alignement horizontal du contenu de la cellule.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontVAlign(const unsigned long int line, const unsigned long int col,const valign_option_t align) :
Definit l'alignement vertical du contenu de la cellule.
ATTENTION : A utiliser après avoir rempli la cellule
- void setFontOrientation(const unsigned long int line, const unsigned long int col,const txtori_option_t orient) :
Definit l'orientation du contenu de la cellule.
ATTENTION : A utiliser après avoir rempli la cellule
- string getLabel(const unsigned long int line, const unsigned long int col) :
Recupere le texte d'une case. Leve une exception si la case est vide ou si le contenu n’est pas un label.
- double getNumberDouble (const unsigned long int line, const unsigned long int col) :
Recupere le contenue au format double d'une cellule. Leve une exception
si la case est vide ou que le type lu n’est pas correct.
- double getNumberInt (const unsigned long int line, const unsigned long int col) :
Recupere le contenue au format entier (int) d'une cellule. Leve une
exception si la case est vide ou que le type lu n’est pas correct.
- String getCellType (const unsigned long int line, const unsigned long int col) :
Recupere le type de la cellule (Blank,Integer,Double,String).
- int getMaxCol() :
Recupere la derniere colonne utilisee.
- int getMinCol() :
Recupere la premiere colonne utilisee.
- int getMinRow() :
Recupere la premiere ligne utilisee.
- int getMaxRow() :
Recupere la derniere ligne utilisee.
- bool hasBorderTop(const unsigned long int line, const unsigned long int col) :
Permet de verifier si il y a un bord en haut d'une cellule.
- bool hasBorderRight(const unsigned long int line, const unsigned long int col) :
Permet de verifier si il y a un bord a droite d'une cellule.
- bool hasBorderLeft(const unsigned long int line, const unsigned long int col) :
Permet de verifier si il y a un bord a gauche d'une cellule.
- bool hasBorderBottom(const unsigned long int line, const unsigned long int col) :
Permet de verifier si il y a un bord en bas d'une cellule.
- color_name_t getBgColor(const unsigned long int line,const unsigned long int col):
Permet de recuperer la couleur de fond d'une cellule.
- color_name_t getFontColor(const unsigned long int line, const unsigned long int col) :
Permet de recuperer la couleur de la police d'une cellule.
- string getFontName(const unsigned long int line, const unsigned long int col) :
Permet de recuperer le nom de la police d'une cellule.
- int getFontHeight(const unsigned long int line, const unsigned long int col) :
Permet de recuperer la taille de la police d'une cellule.
- boldness_option_t getBold(const unsigned long int line, const unsigned long int col) :
Permet de recuperer le type de gras du contenu d'une cellule.
- underline_option_t getUnderLine(const unsigned long int line, const unsigned long int col) :
Permet de recuperer le type de souligne du contenu d'une cellule.
- script_option_t getScript(const unsigned long int line,const unsigned long int col) :
Permet de recuperer le type de script (exposant, indice ou rien) du contenu d'une cellule.
- bool IsItalic(const unsigned long int line, const unsigned long int col) :
Permet de verifier si le contenu d'une cellule est en italic.
- halign_option_t getHAlign(const unsigned long int line, const unsigned long int col) :
Permet de recuperer l'option d'alignement horizontal.
- valign_option_t getVAlign(const unsigned long int line, const unsigned long int col) :
Permet de recuperer l'option d'alignement vertical.
- txtori_option_t getOrientation(const unsigned long int line, const unsigned long int col) :
Permet de recuperer l'orientation du contenu d'une cellule.
- int getColspan(const unsigned long int line, const unsigned long int col) :
Permet de recuperer le nombre de colonnes sur lesquelles la cellule est étendue.
- int getRowspan(const unsigned long int line, const unsigned long int col) :
Permet de recuperer le nombre de lignes sur lequel la cellule est étendue.
4. Les fonctions supplémentaires :
Ces
fonctions ont été implémentées afin de permettre la copie de fichier
xls dans différents formats sans avoir à passer par des variables
XLSFile et XLSSheet. Elles lèvent une exception si le fichier source
n’existe pas.
- void copyXls(const string xlsName,const string copyName) :
Permet de réaliser une copie d’un fichier xls.
- string xlsName : le chemin du fichier xls a copier
- string copyName : le chemin de la copie du fichier xls
- void copyXlstoHtml(const string xlsName,const string HtmlName) :
Permet de copier un fichier xls dans un format HTML
- string xlsName : le chemin du fichier xls a copier
- string HtmlName : le chemin de la copie du fichier HTML
- void copyXlstoCsv(const string xlsName,const string csvName) :
Permet de copier un fichier xls dans un format CSV
- string xlsName : le chemin du fichier xls a copier
- string csvName : le chemin de la copie du fichier CSV
D. Mode d’emploi :
Dans cette partie nous allons voir ce qui doit être présent dans votre code si vous voulez utiliser notre API.
1. Inclure les headers de la librairie :
Les headers sont dans le répertoire « headers » fournit avec la
librairie. Si vous apportez des modifications à l’API pensez à mettre à
jour ce répertoire :
Exemple si on est dans le répertoire ou ce situe le répertoire « headers » :
#include "./headers/xlsFile.h"
2. Utiliser le namespace :
En effet notre API utilise un namespace :
using namespace xlsFile;
3. Utilisation des classes XLSFile et XLSSheet :
Une fois les deux étapes précédentes réalisées, il ne vous reste plus qu’a écrire votre code.
Exemple :
//on fait un test de copie du fichier créé
XLSFile xl2("./creation/monFichierXLs.xls",RW);
XLSSheet fxl2 = xl2.getSheet(0); //on recupere la premier feuille
fxl2.deleteContent(0,0); //on supprime un contenu
XLSSheet fxl2b = xl2.openCsv("./CarpetNoise-columns.dat",' ');
xl2.save("./test_copie/testCopieMonFichierXLs.xls");
E. Améliorations possibles :
Dans cette partie, nous proposons une liste d'améliorations possibles de notre API :
- Comme
dit précédemment, notre plus grand regret réside dans le fait que nous
ne permettons pas à l’utilisateur de créer de graphique en rapport avec
ses données directement à partir de notre API. L’implémentation d’un
système d'incorporation d'image dans une feuille Excel est faisable en
utilisant la documentation Microsoft relative au format BIFF. Par
ailleurs, une bonne connaissance du format Bitmap, ou une API
permettant de manipuler ce format de fichier, est recommandé. La
capacité de créer des graphiques 2D et 3D à partir de données
permettent aux utilisateurs de l’API d'exploiter au mieux celles-ci et
de pouvoir rendre le contenu accessible à une majorité de personnes.
- Nous
avons proposé une librairie qui permet de piloter le logiciel libre
Gnuplot. Ce logiciel permet de tracer des graphiques 2D et 3D. Nous
pouvons envisager par la suite d’incorporer cette librairie à notre
projet pour que les utilisateurs tracent leurs graphiques issus de
l'acquisition.
- Implémentation d’un système de gestion
des graphiques. Par exemple, un résultat issu de gnuplot pourrait être
transformé via une librairie annexe en fichier bmp, puis incluse dans
une feuille Excel.
- Multiplier les formats d’entrées et de sorties.
F. Licence :
LibXls is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
LibXls is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with LibXls. If not, see http://www.gnu.org/licenses.
Copyright © COULON, FOURNIER, ROLLAND, ROUSSET
G. Développeurs :
COULON Anthony : http://coulon.anthony.free.fr/
FOURNIER Stephane : http://fournier.website.free.fr/
ROLLAND Cyrille : http://rollandcyrille.free.fr
ROUSSET Yohan : http://rousset.yohan.free.fr/