> For the complete documentation index, see [llms.txt](https://docs.realmjoin.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.realmjoin.com/fr/dev-reference/report-functions/export-rjrbxlsx.md).

# Export-RjRbXlsx

## Vue d'ensemble

`Export-RjRbXlsx` est l'utilitaire standard pour produire des fichiers de rapport Excel (`.xlsx`) à partir des runbooks de reporting RealmJoin. Il écrit une ou plusieurs tables de `PSCustomObject`s sous forme de **classeur Excel natif** en utilisant uniquement .NET (`System.IO.Compression`) — aucun `ImportExcel`, pas d'automatisation COM, aucun autre module externe n'est requis dans l'environnement Automation.

{% hint style="warning" %}
**Pas encore intégré à RealmJoin.RunbookHelper.** `Export-RjRbXlsx` n'est pas encore fourni avec le **RealmJoin.RunbookHelper** module — il sera inclus dans la **prochaine version du module**. En attendant, la fonction est dupliquée en ligne dans les runbooks qui l'utilisent et peut être copiée à partir de là, par exemple depuis [sync-MFA-secure-users-to-group\_scheduled.ps1](https://github.com/realmjoin/realmjoin-runbooks/blob/master/org/security/sync-MFA-secure-users-to-group_scheduled.ps1) (section *Définitions de fonctions*).
{% endhint %}

Caractéristiques principales :

* **Zéro dépendance à des modules** — le classeur est assemblé directement comme un package Open XML via `System.IO.Compression.ZipArchive`. Cela évite à la fois le coût de démarrage à froid des modules volumineux et les conflits d'assemblage dans les runbooks de reporting mixtes.
* **Sortie stylisée, prête à partager** — chaque feuille de calcul reçoit un tableau Excel stylisé (en-tête bleu marine, lignes zébrées qui suivent le réordonnancement, menus déroulants de filtre), une ligne d'en-tête figée, des largeurs de colonne calculées et une configuration d'impression automatique (orientation dérivée de la largeur du contenu, ligne d'en-tête répétée sur chaque page imprimée). Le premier onglet de feuille est coloré en orange RealmJoin.
* **Cellules fidèles au type** — les nombres .NET deviennent des nombres Excel, `DateTime` les valeurs et les chaînes ISO-8601 (par ex. les champs de date Graph) deviennent de vraies dates Excel triables (localisées par le client), et `http/https` les URL deviennent des liens hypertexte cliquables. Toutes les autres chaînes restent du texte — des valeurs comme les numéros de série ou les IMEI ne sont jamais converties en nombres, et **l'injection de formules est impossible**.
* **Sur une ou plusieurs feuilles de calcul** — canalisez les lignes vers une seule feuille, ou passez un dictionnaire ordonné pour un classeur avec plusieurs feuilles de calcul ainsi qu'une feuille de couverture "Info" facultative.
* **Finition de rapport intégrée** — règles de mise en forme conditionnelle facultatives pour surligner les colonnes d'état, barres de données intégrées aux cellules pour les colonnes numériques, texte d'affichage convivial pour les liens hypertexte et séparateurs de milliers.

Un consommateur typique est un runbook de reporting planifié qui génère des fichiers CSV et XLSX puis les distribue via [Send-RjRbReportEmail](/fr/dev-reference/report-functions/send-rjrbreportemail.md) et/ou [Publish-RjRbFilesToStorageContainer](/fr/dev-reference/report-functions/publish-rjrbfilestostoragecontainer.md).

## Prérequis

Aucun autre prérequis que PowerShell lui-même. La fonction utilise uniquement des types .NET disponibles dans chaque runtime Azure Automation (`System.IO.Compression`, `System.Text`, `System.Xml`-sans génération de chaînes). Aucune connexion Graph ou Az n'est requise — la fonction fonctionne uniquement sur des données locales et écrit un fichier local.

## Démarrage rapide

L'appel minimal viable envoie les lignes vers la fonction et spécifie le chemin de sortie :

```powershell
$devices | Export-RjRbXlsx -Path (Join-Path $env:TEMP 'devices.xlsx') -WorksheetName 'Devices'
```

Cela produit un classeur avec une seule feuille "Devices" : tableau stylisé avec menus déroulants de filtre, ligne d'en-tête figée, colonnes dimensionnées automatiquement et configuration d'impression — prêt à être joint à un e-mail de rapport ou téléversé dans un conteneur de stockage.

## Paramètres

### Jeux de paramètres

La fonction comporte deux jeux de paramètres :

| Jeu de paramètres          | Entrée                                                     | Cas d'utilisation                                                             |
| -------------------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `SingleSheet` (par défaut) | `-InputObject` (également via pipeline) + `-WorksheetName` | Une table, une feuille de calcul.                                             |
| `MultiSheet`               | `-Worksheets` (dictionnaire ordonné)                       | Plusieurs tables sur des feuilles de calcul distinctes dans un seul classeur. |

### Obligatoire

| Paramètre | Type     | Description                                                                    |
| --------- | -------- | ------------------------------------------------------------------------------ |
| `Chemin`  | `string` | Chemin complet du `.xlsx` fichier à créer. **Un fichier existant est écrasé.** |

### Entrée de données

| Paramètre       | Type          | Jeu de paramètres | Description                                                                                                                                                                                            |
| --------------- | ------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `InputObject`   | `object[]`    | `SingleSheet`     | Les lignes à exporter (tableau d'objets ; également acceptées via pipeline). L'ordre des colonnes suit l'ordre des propriétés du premier objet. Les dictionnaires/hashtables sont convertis en objets. |
| `WorksheetName` | `string`      | `SingleSheet`     | Nom de la feuille unique. Par défaut : `Report`.                                                                                                                                                       |
| `Worksheets`    | `IDictionary` | `MultiSheet`      | Dictionnaire ordonné de nom de feuille → lignes, par ex. `([ordered]@{ 'Summary' = $summary; 'Details' = $details })`. Doit contenir au moins une entrée.                                              |

### Facultatif — Contenu et mise en forme

| Paramètre               | Type          | Par défaut | Description                                                                                                                                                                                                                                                                                                                                                |
| ----------------------- | ------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CoverSheet`            | `IDictionary` | —          | Dictionnaire ordonné rendu comme une feuille de couverture "Info" (premier onglet) : un `Title` clé devient le titre, toutes les autres clés deviennent des lignes étiquette/valeur, par ex. `([ordered]@{ Title = 'Rapport d'appareils'; Tenant = 'contoso'; Generated = '2026-07-16 08:00 UTC' })`.                                                      |
| `HighlightRules`        | `object[]`    | —          | Mise en forme conditionnelle pour les colonnes d'état. Tableau de hashtables avec `Column` (nom d'en-tête), `Value` (texte exact de la cellule, insensible à la casse) et `Color` (`Green`, `Red` ou `Yellow` — les préréglages classiques de surbrillance Excel). Les règles sont appliquées sur chaque feuille de calcul qui contient la colonne nommée. |
| `DataBarColumns`        | `object[]`    | —          | Noms de colonnes numériques qui reçoivent une barre de données dans la cellule (orange, dégradé du minimum au maximum), par ex. `@('DeviceCount')`. Les colonnes qui n'existent pas sur une feuille de calcul sont ignorées.                                                                                                                               |
| `HyperlinkText`         | `IDictionary` | —          | Nom de colonne → texte d'affichage pour les cellules de lien hypertexte, par ex. `@{ Portal = 'Ouvrir dans Intune' }`. La cellule affiche le texte convivial, la cible du lien reste l'URL complète. Les colonnes sans correspondance continuent d'afficher l'URL.                                                                                         |
| `NoHyperlink`           | `switch`      | désactivé  | Ne pas convertir `http/https` les chaînes d'URL en liens hypertexte cliquables.                                                                                                                                                                                                                                                                            |
| `HideGridLines`         | `switch`      | désactivé  | Masquez les lignes de grille de la feuille de calcul en dehors du tableau (les lignes de grille sont conservées par défaut pour la lisibilité ; la feuille de couverture les masque toujours).                                                                                                                                                             |
| `UseThousandsSeparator` | `switch`      | désactivé  | Formatez les cellules numériques avec un séparateur de milliers (`#,##0` pour les entiers, `#,##0.00` pour les décimales — localisé par Excel).                                                                                                                                                                                                            |

## Exemples d'utilisation

### Plusieurs feuilles de calcul

```powershell
Export-RjRbXlsx `
    -Worksheets ([ordered]@{ 'Summary' = $summaryRows; 'Details' = $detailRows }) `
    -Path (Join-Path $env:TEMP 'report.xlsx')
```

Les onglets des feuilles apparaissent dans l'ordre du dictionnaire ; le premier onglet est coloré en orange RealmJoin, les onglets restants en gris neutre.

### Feuille de couverture, règles de surbrillance et barres de données

Le modèle complet de « classeur de rapport » avec une feuille de couverture d'information, des colonnes d'état colorées et des barres de données dans les cellules :

```powershell
$coverSheet = [ordered]@{
    Title             = 'Rapport d'appareils'
    'Tenant'          = $tenantDisplayName
    'Generated (UTC)' = (Get-Date).ToUniversalTime().ToString('yyyy-MM-dd HH:mm')
    'Version du runbook' = $Version
    'Total appareils'   = "$($devices.Count)"
}

Export-RjRbXlsx `
    -Worksheets      ([ordered]@{ 'Devices' = $devices }) `
    -Path            (Join-Path $env:TEMP 'device-report.xlsx') `
    -CoverSheet      $coverSheet `
    -HighlightRules  @(
        @{ Column = 'Compliant'; Value = 'yes'; Color = 'Green' },
        @{ Column = 'Compliant'; Value = 'no';  Color = 'Red' }
    ) `
    -DataBarColumns  @('AppCount')
```

La feuille de couverture est insérée comme premier onglet nommé "Info", avec la `Title` valeur comme en-tête bleu marine au-dessus d'une ligne d'accent orange et toutes les autres clés comme lignes étiquette/valeur.

### Texte convivial pour les liens hypertexte

Les colonnes d'URL sont cliquables par défaut et affichent l'URL brute. Associez une colonne à un texte d'affichage convivial pour garder le tableau étroit :

```powershell
$rows = $devices | Select-Object DeviceName, SerialNumber, @{
    n = 'Portal'
    e = { "https://intune.microsoft.com/#view/Microsoft_Intune_Devices/DeviceSettingsMenuBlade/~/overview/mdmDeviceId/$($_.id)" }
}

$rows | Export-RjRbXlsx -Path $xlsxPath -WorksheetName 'Devices' -HyperlinkText @{ Portal = 'Ouvrir dans Intune' }
```

### Combinaison avec les aides à la distribution

Un schéma de bout en bout courant dans les runbooks de reporting — écrire le classeur, puis le joindre à un e-mail de rapport et/ou le téléverser pour obtenir un lien de téléchargement :

```powershell
$xlsxPath = Join-Path $env:TEMP 'report.xlsx'
Export-RjRbXlsx -Worksheets ([ordered]@{ Changes = $changeRows; 'All Users' = $allUserRows }) `
    -Path $xlsxPath -CoverSheet $coverSheet

# Livraison par e-mail — le classeur compact est idéal comme pièce jointe de secours en cas de limite de taille
Send-RjRbReportEmail `
    -EmailFrom       $emailFrom `
    -EmailTo         $EmailTo `
    -Subject         "Rapport — $(Get-Date -Format 'yyyy-MM-dd')" `
    -MarkdownContent $reportMd `
    -Attachments     @($xlsxPath)

# ...ou une livraison via stockage avec un lien de téléchargement à durée limitée
$uploaded = Publish-RjRbFilesToStorageContainer `
    -FilePaths          $xlsxPath `
    -ContainerName      'reports' `
    -ResourceGroupName  $ResourceGroupName `
    -StorageAccountName $StorageAccountName `
    -AddBlobNamePrefix  $true
```

Voir [Send-RjRbReportEmail](/fr/dev-reference/report-functions/send-rjrbreportemail.md) et [Publish-RjRbFilesToStorageContainer](/fr/dev-reference/report-functions/publish-rjrbfilestostoragecontainer.md) pour la partie livraison de ce modèle.

## Gestion des types de cellules

| Valeur d'entrée                                                                  | Rendu sous forme de                                                                                                                                                                 |
| -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Types .NET entiers / à virgule flottante / décimaux                              | Nombre Excel (éventuellement avec séparateur de milliers via `-UseThousandsSeparator`). `NaN`/`Infinity` retombent sur du texte.                                                    |
| `[datetime]`                                                                     | Date Excel réelle ; les valeurs de date seule obtiennent un format de date, les valeurs avec composant horaire obtiennent un format date-heure. Localisé par le client visualiseur. |
| Chaînes de date ISO-8601 (`2026-07-16T08:00:00Z`, champs de date Graph typiques) | Analysées et rendues comme de vraies dates Excel triables.                                                                                                                          |
| `[bool]`                                                                         | Booléen Excel (`TRUE`/`FALSE`).                                                                                                                                                     |
| `http://` / `https://` Chaînes d'URL                                             | Lien hypertexte cliquable (masquer avec `-NoHyperlink`; texte d'affichage via `-HyperlinkText`).                                                                                    |
| Tableaux / collections                                                           | Éléments joints avec `;` dans une seule cellule de texte.                                                                                                                           |
| `$null` / `DBNull`                                                               | Cellule vide.                                                                                                                                                                       |
| Tout le reste                                                                    | Texte brut. Les espaces en début/fin sont conservés ; les chaînes ne sont jamais réinterprétées comme des nombres ou des formules.                                                  |

## Comportement et gestion des erreurs

### Noms de feuilles de calcul

Les noms de feuilles de calcul sont assainis pour respecter les règles d'Excel : les caractères non valides (`[ ] : * ? / \`) sont remplacés, les noms sont tronqués à 31 caractères, les noms vides deviennent `Sheet<n>`, et les doublons obtiennent un `_2`, `_3`, … suffixe.

### En-têtes de colonne

Les noms d'en-tête proviennent de l'ordre des propriétés du premier objet de ligne. Les noms de propriété vides deviennent `Column<n>`; les noms en double (insensibles à la casse) sont dédupliqués avec un `_2`, `_3`, … suffixe, car les colonnes de tableau Excel doivent être uniques et non vides.

### Feuilles de calcul vides

Une feuille de calcul dont l'ensemble de lignes est vide est tout de même écrite — elle contient une seule cellule "Aucune donnée disponible" et aucun tableau. Un dictionnaire vide, en revanche, lève `-Worksheets` dictionary, however, throws `Export-RjRbXlsx : -Worksheets doit contenir au moins une entrée.`

### Limite de lignes

Excel limite les feuilles de calcul à 1,048,576 lignes. La fonction lève `Export-RjRbXlsx : la feuille '<name>' contient <n> lignes - la limite xlsx est de 1048575 lignes de données.` avant d'écrire un fichier invalide. Répartissez les exports très volumineux sur plusieurs feuilles de calcul ou livrez-les plutôt en CSV.

### Règles de surbrillance

* Les règles qui font référence à une colonne inexistante sur une feuille de calcul sont ignorées silencieusement pour cette feuille (elles s'appliquent toujours aux autres feuilles qui contiennent la colonne).
* Une valeur `Color` inconnue génère `Export-RjRbXlsx : couleur de surbrillance inconnue '<color>' - utilisez Green, Red ou Yellow. Règle ignorée.` sous forme d'avertissement et ignore uniquement cette règle.

### Largeurs de colonne

Les largeurs sont calculées à partir de la longueur de l'en-tête et des 1 000 premières lignes de données (bornées entre 8 et 60 caractères), de sorte que les exports très volumineux ne ralentissent pas le calcul des largeurs.

### Fichier de sortie

Un fichier existant à `Chemin` est supprimé puis recréé. La fonction ne crée pas les répertoires parents manquants — assurez-vous que le dossier cible existe (par ex. `New-Item -ItemType Directory`).

## Sorties

La fonction ne renvoie rien. Elle écrit le classeur dans `Chemin` et émet un message détaillé (`Export-RjRbXlsx : a écrit <n> feuille(s) dans <path>`) visible lorsque le runbook s'exécute avec `-Verbose` ou `$VerbosePreference = 'Continue'`.

## Voir aussi

* [Send-RjRbReportEmail](/fr/dev-reference/report-functions/send-rjrbreportemail.md) — distribuez le classeur généré en pièce jointe d'un e-mail de rapport.
* [Publish-RjRbFilesToStorageContainer](/fr/dev-reference/report-functions/publish-rjrbfilestostoragecontainer.md) — téléversez le classeur vers Azure Blob Storage et renvoyez un lien de téléchargement à durée limitée.
* [Paramètres de rapport du runbook](/fr/automatisation/runbooks/runbook-report-settings.md) — configuration centrale des canaux de diffusion du rapport.
* Exemple d'utilisation en ligne : [sync-MFA-secure-users-to-group\_scheduled.ps1](https://github.com/realmjoin/realmjoin-runbooks/blob/master/org/security/sync-MFA-secure-users-to-group_scheduled.ps1) — le runbook qui héberge actuellement la fonction jusqu'à ce qu'elle soit fournie avec le module.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.realmjoin.com/fr/dev-reference/report-functions/export-rjrbxlsx.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
