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

`docx-preview`通常是一个工具或库,用于在静止状态(即静态环境)下预览`.docx`文档的内容。这种预览功能允许用户在无需打开完整的Microsoft Word或其他兼容软件的情况下,快速查看文档的基本信息、标题、图像、表格和其他元素。 ### `docx-preview`的功能 1. **内容浏览**:预览可以显示文档的大纲结构、标题层次、图片缩略图、文本段落等,提供对文档整体布局的初步了解。 2. **数据提取**:某些`docx-preview`工具可能能够提取文档的关键信息,如文档创建日期、作者姓名、特定页面或章节的文字摘要等。 3. **安全性考量**:在静默环境中预览文档有助于保护敏感信息的安全,避免在未授权情况下公开展示敏感内容。 4. **集成便利**:这类工具往往易于集成到现有应用或脚本中,便于自动化处理文档预览任务。 ### 使用场景 - **在线服务**:例如,在线存储服务或协作平台可能会利用`docx-preview`来提供预览功能,让用户可以在浏览器内查看文档。 - **报告生成系统**:自动化报告系统可能需要在生成最终PDF或电子邮件之前预览Word文档的内容。 - **数据分析工具**:在进行大数据分析时,可能需要快速扫描大型Word文档集以获取大致信息概览,此时`docx-preview`非常有用。 ### 实现方法 为了在你的项目中集成`docx-preview`功能,你可以: 1. **查找合适的库**:在GitHub上搜索“Python docx preview”、“JavaScript docx viewer”等关键词,找到相关的开源库或应用程序。 2. **安装依赖**:如果选择的是库,则按照指示安装所需的Python包管理器命令(如pip),或者在前端项目中添加相应的npm或Yarn命令。 3. **配置使用**:根据所选库的文档说明,将所需代码片段嵌入你的项目中,设置预览选项(如是否显示所有页面、是否提取元数据等)。 4. **测试验证**:确保预览功能按预期工作,并适配不同的文档格式版本以及特殊字符、编码等问题。 ### 相关问题: 1. **如何优化`docx-preview`加载速度?** - 确保使用的`docx`解析库支持流式读取和部分加载文档。 - 避免一次性加载整个文档内容,而是只加载当前预览视图所需的部分。 - 对于大型文件,考虑使用分页预览机制。 2. **如何处理非标准或损坏的.docx文件?** - 使用错误检测机制识别并报告无法预览的文件。 - 提供替代方案或提示用户尝试其他方法打开文件。 3. **如何实现跨平台的.docx预览支持?** - 根据目标平台选择合适的开发语言和库。 - 使用平台独立的解决方案,如Web技术,确保在不同操作系统和设备上的兼容性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值