docx.js使用初步
官网教程: https://docx.js.org/#/
docx.js是干什么的?
docx.js使用js语法,可以自定义docx元素(段落,表格)和属性(字体,行距)等
注意事项
- word里的字号是以half-points(半磅为单位。
字号‘初号’对应磅值42,字号‘小初’对应磅值36。 字号‘一号’对应磅值26,字号‘小一’对应磅值24。 字号‘二号’对应磅值22,字号‘小二’对应磅值18。 字号‘三号’对应磅值16,字号‘小三’对应磅值15。 字号‘四号’对应磅值14,字号‘小四’对应磅值12。 字号‘五号’对应磅值10.5,字号‘小五’对应磅值9。 字号‘六号’对应磅值7.5,字号‘小六’对应磅值6.5。 字号‘七号’对应磅值5.5,字号‘八号’对应磅值5。 - 使用前要使用cnpm install --save docx导入依赖dependencies:“docx”: “版本号”。
- 需要导入相应模块才能使用。const { Document, Packer, Paragraph, Table, TableCell, TableRow, WidthType,TextRun, HeadingLevel, Alignment, AlignmentType, LevelFormat, convertInchesToTwip} = require(‘docx’);
- 比如 heading1,等的样式如果不自定义,将使用默认的样式。段落里添加heading: HeadingLevel.HEADING_标题等级,
如heading: HeadingLevel.HEADING_2。设置这一段为二级标题。 - new 多个Paragrap会自动换行,而new 多个TextRun则不会,要添加break: 1,但是是软回车会导致文本对齐方式为两端对齐。注意text属性的字符串中加"\n"无效。
实例
const remote = require('@electron/remote');
const path = require('path');
const fs = require('fs');
const { Document, Packer, Paragraph, Table, TableCell, TableRow, WidthType,TextRun, HeadingLevel, Alignment, AlignmentType, LevelFormat, convertInchesToTwip} = require('docx');//electrion使用 CommonJS 语法导入了模块
const table = new Table({
rows: [
new TableRow({
children: [
new TableCell({
children: [new Paragraph({
text:"表格第一行第一列",
style:"text",
alignment: AlignmentType.CENTER,})],//文字水平居中
}),
],
}),
],
width: {//指定表格宽度,否则默认按单元格内容大小确定表格宽度
size: 10000,//10000个二十分之一点,大概17.64 厘米
type: WidthType.DXA,//二十分之一点
}
});
let paras=[
new Paragraph({
text:"一级标题,水平居中",
heading: HeadingLevel.HEADING_1,
alignment: AlignmentType.CENTER,//段落水平居中
}),
new Paragraph({
text:"二级标题",
heading: HeadingLevel.HEADING_2,
}),
new Paragraph({
text:"正文使用自定义样式,缩进,时间:"+this.getCurrentTime(),
style:"text",//表示该段使用自定义样式里的”text"样式,text为paragraphStyles里的一个样式中的id属性值
indent: { left: convertInchesToTwip(0.3) },//缩进
}),
new Paragraph(para),//para是一个对象,可包含text,style,heading等段落的属性。
table//一个表格
]
const doc = new Document({
styles: {//文档的样式属性,用来自定义样式
default: {//系统默认的一些元素的属性,如一级标题,二级标题
heading1: {
run: {
size: 22 * 2,//size以half-points(半磅)为单位,22磅对应二号size,字号‘二号’对应磅值22,字号‘小二’对应磅值18。 字号‘三号’对应磅值16,
bold: true,//加粗
},
paragraph: {
spacing: {
// befort: 1.41*20*22,
after: 1.1 * 20 * 22,//设置一级标题为行距为1.1倍的字体大小,以twip(缇)为单位,一磅等于20twip
},
},
},
heading2: {
run: {
font: {
ascii: "Times New Roman",
eastAsia: "等线 Light",
cs: "minorBidi",
hAnsi: "minorHAnsi",
},
size: 32,//三号字体,16*2,
bold: true,//加粗
//color: "#000000",
},
paragraph: {
spacing: {
//设置一级标题后行距为0.9倍的字体大小
after: 0.9 * 20 * 16,
},
},
},
},
paragraphStyles: [//数组,表明可以定义不同的样式,使用id在引用时加以区分
{
id: "text",//
name: "text",
basedOn: "Normal",
next: "Normal",
quickFormat: true,
run: {//段落文字属性定义
font:{//只用于设置字体,color和size设置在这里是无效的,同时外面也无法设置字体
ascii: "Times New Roman",//设置英文字体
eastAsia: "宋体",//设置中文,要设置eastAsia,否则中文有问题
cs: "minorBidi",
hAnsi: "minorHAnsi",
},
color: "#000000",//加不加#都行
size: 28,//字号‘四号’对应磅值14
},
paragraph: {//
spacing: {
after: 0.8*20 * 14,//设置一级标题为行距为0.8倍的字体大小,以twip(缇)为单位,一磅等于20twip
},
}
},
],
},
sections: [
{
children: paras,
},
{
children:[new Paragraph({
children:[
new TextRun({
text:"textRun1,shading",
shading: {
type: ShadingType.REVERSE_DIAGONAL_STRIPE,
color: "00FFFF",
fill: "FF0000",
},
break: 1,//一个换行
}),
new TextRun({
text:"textRun2,黄色高亮"+"\n",
highlight: "yellow",
break: 1,//一个换行
}),
new TextRun({
text:"textRun",
break: 1,//一个换行
}),
]
})]
}
],
});
let Path="D:/myother/test2/"+"doctest.docx"//路径要确定到生成的文件名
Packer.toBuffer(doc).then((buffer) => {p
fs.writeFile(Path, buffer, error => {
if (error) throw error;
console.log("成功保存至:",Path);
ElementPlus.ElMessage({
message: '已保存至:' + Path,
type: 'success',
center: true,
})
});
});
上述代码中,TextRun部分的效果如下,可见
break: 1产生换行,但是是软回车会导致对齐方式为两端对齐,而不是想要的左对齐。注意text属性的字符串中加"\n"无效