Présentation
Cette bibliothèque est inspirée de la documentation officielle disponible sur https://xuri.me/excelize/fr/.
Installation
Pour utiliser la dernière version d'Excelize, vous devez disposer de Go 1.15 ou supérieur.
- Commande d'installation
go get github.com/xuri/excelize
- Si vous utilisez Go Modules
go get github.com/xuri/excelize/v2
Mise à jour
go get -u github.com/xuri/excelize/v2
Création d'un fichier
func NewFile() *File
La fonction NewFile permet de créer un nouveau classeur Excel. Le classeur nouvellement créé contient par défaut une feuille de calcul nommée Sheet1.
Modifier le nom de la feuille
func (f *File) SetSheetName(oldName, newName string)
Cette fonction permet de renommer une feuille de calcul en fonction des noms ancien et nouveau (sensibles à la casse). Le nom de la feuille peut contenir jusqu'à 31 caractères. Cette fonctionnalité modifie uniquement le nom de la feuille sans metttre à jour les noms de feuilles dans les formules ou références liées aux cellules. Par conséquent, le changement de nom peut provoquer des erreurs de formule ou des problèmes de référence.
Assignation par ligne
func (f *File) SetSheetRow(sheet, axis string, slice interface{}) error
Cette fonction permet d'assigner des valeurs par ligne selon le nom de la feuille (sensible à la casse), les coordonnées de départ et une référence de type slice. Par exemple, pour assigner des valeurs à partir de la cellule B6 sur la ligne 6 d'une feuille nommée Sheet1:
err := f.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2})
Définition des formules
func (f *File) SetCellFormula(sheet, axis, formula string, opts ...FormulaOpts) error
Cette fonction permet de définir une formule pour une cellule donnée selon le nom de la feuille (sensible à la casse) et les coordonnées de la cellule. Le résultat de la formule peut être calculé lorsque le fichier est ouvert avec Office Excel ou via la fonction CalcCellValue. Si Excel ne calcule pas automatiquement la formule après l'ouverture, appeler UpdateLinkedValue pour vider le cache des cellules.
Fusion de cellules
func (f *File) MergeCell(sheet, hcell, vcell string) error
Cette fonction permet de fusionner des cellules selon le nom de la feuille (sensible à la casse) et la zone de coordonnées. Seule la valeur de la cellule supérieure gauche est conservée, les autres valeurs sont ignorées. Par exemple, pour fusionner la zone D3:E9 sur une feuille nommée Sheet1:
err := f.MergeCell("Sheet1", "D3", "E9")
Si la zone de coordonnées chevauche des cellules déjà fusionnées, ces dernières seront supprimées.
Application de styles aux cellules
func (f *File) SetCellStyle(sheet, hcell, vcell string, styleID int) error
Cette fonction permet d'appliquer un style aux cellules selon le nom de la feuille, la zone de coordonnées et l'index de style. L'index de style peut être obtenu via la fonction NewStyle. Attention: dans une même zone, les propriétés diagonalDown et diagonalUp doivent avoir la même couleur. SetCellStyle remplace le style existant sans fusionner ou superposer les styles.
Définiiton de la largeur des colonnes
func (f *File) SetColWidth(sheet, startcol, endcol string, width float64) error
Cette fonction permet de définir la largeur d'une ou plusieurs colonnes selon le nom de la feuille (sensible à la casse), la plage de colonnes et la valeur de largeur. Par exemple, pour définir la largeur des colonnes A à H à 20:
classeur := excelize.NewFile()
err := classeur.SetColWidth("Sheet1", "A", "H", 20)
Création d'un tableau
func (f *File) AddTable(sheet, hcell, vcell, format string) error
Cette fonction permet de créer un tableau selon le nom de la feuille, la zone de coordonnées et le format conditionnel.
Note: la zone du tableau doit contenir au moins deux lignes: une ligne d'en-têtes (type chaîne) et une ligne de données. Les caractères des en-têtes de colonne doivent être uniques et les données doivent être définies avant d'appeler AddTable. Les zones de plusieurs tableaux ne peuvent pas se chevaucher.
Le paramètre optionnel table_name permet de définir un nom personnalisé pour le tableau. Les noms de tableaux dans une même feuille doivent être uniques.
Les styles de tableau supportés par Excelize:
TableStyleLight1 - TableStyleLight21
TableStyleMedium1 - TableStyleMedium28
TableStyleDark1 - TableStyleDark11
Enregistrement du fichier
func (f *File) SaveAs(name string) error
La fonctoin SaveAs permet d'enregistrer le document Excel dans un fichier spécifié.
Exemple pratique
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
"os"
"strconv"
"time"
)
func main() {
// Création d'un nouveau classeur Excel
classeur := excelize.NewFile()
// Définition du nom de la feuille
nomFeuille := "Résultats des examens"
classeur.SetSheetName("Sheet1", nomFeuille)
// Préparation des données
donnees := [][]interface{}{
{"Tableau des statistiques d'examens"},
{"Nom de l'examen: Examen du premier trimestre", nil, nil, "Sciences humaines", nil, nil, "Sciences naturelles"},
{"N°", "Numéro étudiant", "Nom", "Histoire", "Géographie", "Philosophie", "Biologie", "Chimie", "Physique", "Total", "Moyenne"},
{1, "1001", "Dupont Jean", 11, 22, 33, 44, 55, 66, nil, nil},
{2, "1002", "Martin Pierre", 11, 22, 33, 44, 55, 66, nil, nil},
{3, "1003", "Bernard Sophie", 11, 22, 33, 44, 55, 66, nil, nil},
{4, "1004", "Durand Marie", 11, 22, 33, 44, 55, 66, nil, nil},
{5, "1005", "Leroy Luc", 11, 22, 33, 44, 55, 66, nil, nil},
{6, "1006", "Moreau Émile", 11, 22, 33, 44, 55, 66, nil, nil},
}
// Insertion des données ligne par ligne
for index, ligne := range donnees {
nomCellule, err := excelize.JoinCellName("A", index+1)
if err != nil {
fmt.Printf("Erreur lors de la génération du nom de cellule: %s\n", err)
return
}
err = classeur.SetSheetRow(nomFeuille, nomCellule, &ligne)
if err != nil {
fmt.Printf("Échec de l'écriture des données: %s\n", err)
return
}
}
// Configuration des formules
zoneRef := "J4:J9"
typeFormule := excelize.STCellFormulaTypeShared
optionsFormule := excelize.FormulaOpts{Type: &typeFormule, Ref: &zoneRef}
err := classeur.SetCellFormula(nomFeuille, "J4", "=SUM(D4:I4)", optionsFormule)
if err != nil {
fmt.Printf("Échec de la définition de la formule: %s\n", err)
return
}
// Nettoyage du cache des cellules
err = classeur.UpdateLinkedValue()
if err != nil {
fmt.Printf("Échec du nettoyage du cache: %s\n", err)
return
}
// Application des formules pour chaque ligne
for i := 5; i <= 9; i++ {
indice := strconv.Itoa(i)
err = classeur.SetCellFormula(nomFeuille, "J"+indice, fmt.Sprintf("=SUM(D%s:I%s)", indice, indice), optionsFormule)
if err != nil {
fmt.Printf("Échec de la définition de la formule: %s\n", err)
return
}
}
// Fusion des cellules
err = classeur.MergeCell(nomFeuille, "A1", "K1")
if err != nil {
fmt.Printf("Échec de la fusion des cellules: %s\n", err)
return
}
err = classeur.MergeCell(nomFeuille, "A2", "C2")
if err != nil {
fmt.Printf("Échec de la fusion des cellules: %s\n", err)
return
}
err = classeur.MergeCell(nomFeuille, "D2", "F2")
if err != nil {
fmt.Printf("Échec de la fusion des cellules: %s\n", err)
return
}
err = classeur.MergeCell(nomFeuille, "G2", "I2")
if err != nil {
fmt.Printf("Échec de la fusion des cellules: %s\n", err)
return
}
// Création des styles
styleCentre, err := classeur.NewStyle(&excelize.Style{
Border: nil,
Fill: excelize.Fill{},
Font: nil,
Alignment: &excelize.Alignment{
Horizontal: "center",
Indent: 0,
JustifyLastLine: false,
ReadingOrder: 0,
RelativeIndent: 0,
ShrinkToFit: false,
TextRotation: 0,
Vertical: "",
WrapText: false,
},
Protection: nil,
NumFmt: 0,
DecimalPlaces: 0,
CustomNumFmt: nil,
Lang: "",
NegRed: false,
})
styleEnTete, err := classeur.NewStyle(&excelize.Style{
Border: nil,
Fill: excelize.Fill{
Type: "pattern",
Pattern: 1,
Color: []string{"DFEBF6"},
Shading: 0,
},
Font: nil,
Alignment: &excelize.Alignment{
Horizontal: "center",
Indent: 0,
JustifyLastLine: false,
ReadingOrder: 0,
RelativeIndent: 0,
ShrinkToFit: false,
TextRotation: 0,
Vertical: "",
WrapText: false,
},
Protection: nil,
NumFmt: 0,
DecimalPlaces: 0,
CustomNumFmt: nil,
Lang: "",
NegRed: false,
})
if err != nil {
fmt.Printf("Échec de la création du style: %s\n", err)
return
}
// Application des styles
_ = classeur.SetCellStyle(nomFeuille, "A1", "A1", styleEnTete)
_ = classeur.SetCellStyle(nomFeuille, "A2", "A2", styleCentre)
_ = classeur.SetCellStyle(nomFeuille, "D2", "D2", styleCentre)
_ = classeur.SetCellStyle(nomFeuille, "G2", "G2", styleCentre)
// Définition de la largeur des colonnes
_ = classeur.SetColWidth(nomFeuille, "D", "D", 7)
// Création du tableau
err = classeur.AddTable(nomFeuille, "A3", "K9", `{"table_name":"tableau","table_style":"TableStyleLight21"}`)
if err != nil {
fmt.Printf("Échec de la création du tableau: %s\n", err)
return
}
// Enregistrement du fichier
_ = os.MkdirAll("excel", os.ModePerm)
nomFichier := "excel/" + strconv.FormatInt(time.Now().Unix(), 10) + ".xlsx"
err = classeur.SaveAs(nomFichier)
if err != nil {
fmt.Printf("Échec de l'enregistrement du fichier: %s\n", err)
return
}
}