生成和导出word文件是我们在进行实际开发中比较常见的需求之一。而在nodejs中,我们可以利用一些库来完成这个功能。
以下是使用nodejs生成和导出word的完整攻略,包含两个示例:
1. 安装依赖
首先,我们需要使用npm
来安装需要的依赖库。
其中,docx
可以用来生成word,而fs
则是node文件系统模块,用于文件的读写操作,path
则是node的路径处理模块,使我们更方便地处理文件路径。
```bash
npm install docx fs path --save
2. 创建模板文件
在生成word文件之前,我们需要创建一个word文件模板,在模板中定义我们想要生成的内容。
可以使用Microsoft Word或其他编辑器来创建模板文件,将其保存为.docx
格式,并将其放在项目中的合适位置。
3. 创建生成word的脚本
接下来,我们可以创建一个generateDoc.js
文件,用于编写生成word文件的脚本。
首先,我们需要引入依赖库和我们自己创建的模板文件:
const fs = require("fs");
const path = require("path");
const Docxtemplater = require("docxtemplater");
const templateDocxPath = path.resolve(__dirname, "template.docx");
const content = { name: "John Doe", age: "30" };
其中,templateDocxPath
是模板文件的路径,content
是用于填充模板中的内容,后面我们会使用它来生成word内容。
接下来,我们可以读取模板文件内容,将其传递给Docxtemplater
库:
const templateContent = fs.readFileSync(templateDocxPath, "binary");
const doc = new Docxtemplater();
doc.loadZip(new JSZip(templateContent));
然后,我们将content
中的内容传递给模板进行填充:
doc.setData(content);
doc.render();
最后,我们可以将生成的文件保存到指定路径下:
const outputFilePath = path.resolve(__dirname, "output.docx");
const outputContent = doc.getZip().generate({ type: "nodebuffer" });
fs.writeFileSync(outputFilePath, outputContent);
以上就是一个简单的生成word文件的脚本。
4. 示例一:使用单个模板文件来生成多个word文件
有时,我们需要使用单个模板文件来生成多个word文件,例如在批量生成合同、报价单等场景下。
为了达到这个目的,我们可以将上面的脚本封装成一个函数,并使用不同的数据来调用它,例如:
function generateDocUsingTemplate(content, templateDocxPath) {
const templateContent = fs.readFileSync(templateDocxPath, "binary");
const doc = new Docxtemplater();
doc.loadZip(new JSZip(templateContent));
doc.setData(content);
doc.render();
const outputFilePath = path.resolve(
__dirname,
`output_${content.name}.docx`
);
const outputContent = doc.getZip().generate({ type: "nodebuffer" });
fs.writeFileSync(outputFilePath, outputContent);
}
generateDocUsingTemplate({ name: "John Doe", age: "30" }, templateDocxPath);
generateDocUsingTemplate({ name: "Jane Doe", age: "28" }, templateDocxPath);
在这个示例中,我们创建了一个generateDocUsingTemplate
函数,它接受两个参数——content
和templateDocxPath
。我们通过在generateDocUsingTemplate
函数中调用fs.readFileSync
来读取模板文件内容,使用不同的数据填充模板,然后将生成的文件保存到指定路径下。
通过分别调用generateDocUsingTemplate
函数来生成两个word文件,命名为output_John Doe.docx
和output_Jane Doe.docx
。
5. 示例二:生成表格和图片
除了文本内容,我们也可以在生成word文件时添加表格和图片。
为了演示这一点,我们可以在模板文件中添加一个表格和一个图片。
在表格中,我们列出了一个人的一周日程安排,如下所示:
时间 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | 星期六 | 星期日 |
---|---|---|---|---|---|---|---|
上午9点-10点 | 公司 | 公司 | 屋里 | 屋里 | |||
上午10点-11点 | 公司 | 公司 | 屋里 | 屋里 | |||
上午11点-12点 | 公司 | 公司 | 屋里 | 屋里 | |||
下午1点-2点 | 家里 | 家里 | 客户 | 客户 | 加油站 | add.jpg | |
下午2点-3点 | 家里 | 家里 | 客户 | 客户 | 加油站 | add.jpg |
其中,最后一个单元格包含了一张图片,我们需要将它添加到word文件中。
下面是一个演示如何添加表格和图片的简单示例:
const width = 600;
const height = 400;
const imageFilePath = path.resolve(__dirname, "add.jpg");
const content = {
name: "John Doe",
age: "30",
table: [
["上午9点-10点", "", "", "公司", "", "公司", "屋里", "屋里"],
["上午10点-11点", "", "", "公司", "", "公司", "屋里", "屋里"],
["上午11点-12点", "", "", "公司", "", "公司", "屋里", "屋里"],
["下午1点-2点", "家里", "家里", "", "客户", "客户", "加油站", imageFilePath],
["下午2点-3点", "家里", "家里", "", "客户", "客户", "加油站", imageFilePath],
],
};
const templateDocxPath = path.resolve(__dirname, "template.docx");
const templateContent = fs.readFileSync(templateDocxPath, "binary");
const doc = new Docxtemplater();
doc.loadZip(new JSZip(templateContent));
// 注意:需要将JSZip的v3版本降级到v2以避免出现错误
doc.setOptions({
parser: function () {
return JSON.parse.apply(JSON, arguments);
},
});
doc.setData(content);
doc.render();
const outputFilePath = path.resolve(__dirname, "output.docx");
const outputContent = doc.getZip().generate({ type: "nodebuffer" });
fs.writeFileSync(outputFilePath, outputContent);
在这个示例中,我们首先定义了一些用于插入图片的变量——width
、height
和imageFilePath
,这些变量将在生成word文件时使用。后面,我们将表格中的数据和模板文件传递给Docxtemplater
库,使用setData
方法填充模板中的内容,并使用render
方法生成word文件。
最后,我们将生成的文件保存到指定路径。在table
数组中,每个数组项都是一个代表一行的数组,数组中的每个元素都代表一个单元格内容。如果一个单元格包含图片,我们需要将该单元格的内容设置为图片的文件路径。
这就是如何使用nodejs生成和导出word的完整攻略。希望这可以帮助你快速了解如何在nodejs中实现这一功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs 生成和导出 word的实例代码 - Python技术站