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.xlsx
fichier 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.json
nommés . normalQues.json
A 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.xlsx
est le suivant :
Le processus de conversion en fichier json
Importer xlsx
et 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 :
Obtenir les noms de toutes les feuilles dans le fichier xlsx
console.log(workBook.SheetNames);
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 :
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 :
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 :
(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_json
ajouter 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.
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. .
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 fs
la 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 创建成功!!!`)
}
})
})
À 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.
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.
paramètres additionnels
Si vous ne souhaitez pas générer de fichiers JSON dans le même répertoire, vous pouvez path
dé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 创建成功!!!`)
}
})
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 :
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 创建成功!!!`)
}
})
})