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"无效
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值