Nodejs traite les fichiers xlsx pour générer des fichiers json

Il existe plusieurs façons pour nodejs de traiter les fichiers xlsx, et la bibliothèque js-xlsx est utilisée ici ;

besoin

Il existe un fichier xlsx contenant plusieurs feuilles différentes, il faut lire les données des différentes feuilles de ce tableau et générer un fichier json correspondant pour chaque feuille.

Par exemple, il existe un template.xlsxfichier nommé , et il contient deux feuilles, qui sont respectivement 错误码, 常见问题et le contenu de ces deux feuilles doit être lu séparément pour générer deux fichiers errorCode.jsonnommés . normalQues.jsonA l'intérieur de chaque fichier json se trouve un tableau d'objets.

js-xlsx

L'article est relativement long, vous pouvez directement tirer jusqu'à la fin pour voir le code final.

Tout d'abord, vous devez installer le package xlsx :

npm install xlsx

Le nom du fichier xlsx utilisé par le texte template.xlsxest le suivant :

insérez la description de l'image ici
insérez la description de l'image ici

Le processus de conversion en fichier json

Importer xlsxet lire des fichiers locaux

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理

const workBook = xlsx.readFile("template.xlsx",{
    
    }) // 获取整个xlsx文档

Le classeur contient beaucoup de contenu et d'attributs, ce qui suit n'est qu'une partie de la capture d'écran :

insérez la description de l'image ici
insérez la description de l'image ici
insérez la description de l'image ici

Obtenir les noms de toutes les feuilles dans le fichier xlsx

console.log(workBook.SheetNames);

insérez la description de l'image ici

Obtenir le contenu de toutes les feuilles dans le fichier xlsx

cosnole.log(workBook.Sheets);

Les folios ainsi obtenus sont un objet contenant tout le contenu des folios, et le format est :

insérez la description de l'image ici
insérez la description de l'image ici

Convertir au format json

const {
    
    Sheets,SheetNames} = xlsx.readFile("template.xlsx",{
    
    }) // 获取整个xlsx文档

let output = []

SheetNames.forEach(item => {
    
    
    const arr = xlsx.utils.sheet_to_json(Sheets[item])
    output.push(arr)
}) 

console.log(output)

À ce stade, vous constaterez qu'après la sortie de la sortie, vous obtenez un tableau comme celui-ci :
insérez la description de l'image ici

En effet xlsx.utils.sheet_to_json, certains paramètres peuvent être transmis et différentes sorties peuvent être contrôlées via ces paramètres :

insérez la description de l'image ici
(Source de l'image : js-xlsx utilise le résumé pour réaliser l'analyse frontale Excel )

Selon nos besoins, ici, nous pouvons ajouter un en-tête à chaque ligne de données, puis xlsx.utils.sheet_to_jsonajouter un { header: 2 }paramètre à la fonction pour obtenir l'effet souhaité. L'effet des différents paramètres peut se référer à cet article : Recherche sur l'attribut header dans xlsx.utils.sheet_to_json

Donc, nous venons de changer la table en ceci, et y ajoutons un en-tête. Notez que l'en-tête ici est le nom d'attribut de chaque objet dans le fichier json généré plus tard.
insérez la description de l'image ici
insérez la description de l'image ici

Ajoutez des paramètres au code :

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理

const {
    
    Sheets,SheetNames} = xlsx.readFile("template.xlsx",{
    
    }) // 获取整个xlsx文档

let output = []

SheetNames.forEach(item => {
    
    
    const arr = xlsx.utils.sheet_to_json(Sheets[item],{
    
     header: 2 })
    output.push(arr)
}) 

console.log(output)

Le résultat obtenu à ce moment est comme indiqué dans la figure ci-dessous. On peut voir qu'un tableau bidimensionnel est généré à ce moment, la partie supérieure est la sortie 错误码de la feuille et la partie inférieure est 常见问题la sortie de la feuille. .

insérez la description de l'image ici

Générer un fichier JSON

À ce stade, le format du fichier json est correct, puis nous devons mettre le tableau correspondant à chaque feuille dans le fichier json correspondant. Vous pouvez utiliser fsla bibliothèque pour générer des fichiers json.

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理
const fs = require("fs");

const {
    
    Sheets,SheetNames} = xlsx.readFile("template.xlsx",{
    
    }) // 获取整个xlsx文档

SheetNames.forEach(item => {
    
    
    const arr = xlsx.utils.sheet_to_json(Sheets[item],{
    
     header: 2 })

    let outputFileName = "";

    switch (item) {
    
    
        case "错误码":
            outputFileName = "errorCode"
            break;

        case "常见问题":
            outputFileName = "normalQues"
            break;
    
        default:
            break;
    }

    //定义输出文件路径
    fs.writeFile(`${
      
      outputFileName}.json`, JSON.stringify(arr, '' , ''), (err) => {
    
    
        if (err) {
    
    
            console.log(err)
        } else {
    
    
            console.log(`${
      
      outputFileName}.json 创建成功!!!`)
        }
    })
}) 

insérez la description de l'image ici

À ce moment, dans le même répertoire, deux fichiers json correspondants sont générés, la sortie que nous voulons a été obtenue et l'exigence a été réalisée.

insérez la description de l'image ici

insérez la description de l'image ici

PS : S'il existe un fichier portant le même nom auparavant, ou si deux fichiers json ont été générés en l'exécutant auparavant, lorsque le code est exécuté à nouveau, il ne signalera pas d'erreur car les deux fichiers json existaient auparavant, mais écrasera le contenu du fichier précédent.

insérez la description de l'image ici

paramètres additionnels

Si vous ne souhaitez pas générer de fichiers JSON dans le même répertoire, vous pouvez pathdéfinir un répertoire différent en :

	const path = require("path")
	......
	
    //定义输出文件路径
    const outputFile = path.join(__dirname, `output/${
      
      outputFileName}.json`)
    fs.writeFile(outputFile, JSON.stringify(arr, '' , ''), (err) => {
    
    
        if (err) {
    
    
            console.log(err)
        } else {
    
    
            console.log(`output/${
      
      outputFileName}.json 创建成功!!!`)
        }
    })

insérez la description de l'image ici

Mais faites très attention : vous devez vous assurer que le dossier de sortie existe avant d'exécuter le programme, sinon une erreur sera signalée :

insérez la description de l'image ici

code définitif

const xlsx = require("xlsx");  // 想要直接操作本地文件只能采用nodejs的方式,client端无法处理
const fs = require("fs");
const path = require("path")

const {
    
    Sheets,SheetNames} = xlsx.readFile("template.xlsx",{
    
    }) // 获取整个xlsx文档

SheetNames.forEach(item => {
    
    
    const arr = xlsx.utils.sheet_to_json(Sheets[item],{
    
     header: 2 })

    let outputFileName = "";

    switch (item) {
    
    
        case "错误码":
            outputFileName = "errorCode"
            break;

        case "常见问题":
            outputFileName = "normalQues"
            break;
    
        default:
            break;
    }

    //定义输出文件路径
    const outputFile = path.join(__dirname, `output/${
      
      outputFileName}.json`)
    fs.writeFile(outputFile, JSON.stringify(arr, '' , ''), (err) => {
    
    
        if (err) {
    
    
            console.log(err)
        } else {
    
    
            console.log(`output/${
      
      outputFileName}.json 创建成功!!!`)
        }
    })
}) 

Je suppose que tu aimes

Origine blog.csdn.net/Charonmomo/article/details/130688125
conseillé
Classement