那些在Docx.js踩过的坑

一、依赖篇

npm i --save docx@8.5.0
npm i --save file-saver

二、导出篇

// 必须的导入包
import FileSaver, { saveAs } from 'file-saver'
import {
  Document,
  Packer
} from 'docx'

const doc = new Document({.............});

// 导出代码

Packer.toBlob(doc).then((blob) => {
  saveAs(blob, `${name}.docx`);
});

三、Document篇

  • sections: readonly ISectionOptions[]:定义文档的节(section)。每个节可以有不同的布局和格式。(下面所有的都放在sections:{ children:[ new 段落, new 表格........... ] }

  • title?: string:文档的标题。

  • subject?: string:文档的主题。

  • creator?: string:文档的创建者。

  • keywords?: string:与文档相关的关键字,用于搜索和索引。

  • description?: string:文档的描述。

  • lastModifiedBy?: string:最后修改文档的用户。

  • revision?: number:文档的修订版本号。

  • externalStyles?: string:外部样式表的链接。

  • styles?: IStylesOptions:自定义的样式选项,定义文档中的样式。

  • numbering?: INumberingOptions:定义文档的编号格式(如段落编号、列表编号)。

  • comments?: ICommentsOptions:文档的评论设置。

  • footnotes?: { readonly [key: string]: { readonly children: readonly Paragraph[]; }; }:脚注设置,允许在文档中添加脚注内容。

  • background?: IDocumentBackgroundOptions:文档背景选项,允许设置文档的背景样式。

  • features?: { readonly trackRevisions?: boolean; readonly updateFields?: boolean; }:文档特性选项:

    • updateFields: 是否在打开文档时更新字段。
    • trackRevisions: 是否跟踪修订。
  • compatibilityModeVersion?: number:兼容模式版本号,用于确保文档在不同版本的 Word 中的兼容性。

  • compatibility?: ICompatibilityOptions:其他兼容性选项,用于控制文档的行为。

  • customProperties?: readonly ICustomPropertyOptions[]:自定义属性,允许添加额外的元数据到文档中。

  • evenAndOddHeaderAndFooters?: boolean:是否使用不同的页眉和页脚用于奇数和偶数页。

  • defaultTabStop?: number:默认制表位,控制制表符的停靠位置。

  • fonts?: readonly FontOptions[]:字体选项,定义文档中使用的字体。

四、段落篇

        new Paragraph({                    //需要导入
          text: `姓名:${name}`,
          heading: HeadingLevel.HEADING_1, // 需要导入HeadingLevel
          alignment: AlignmentType.CENTER, // 需要导入AlignmentType
          children:[
            new TextRun("66666"),          // 需要导入TextRun
            new TextRun("随便输入"),
          ]
        }),

效果如下:

注意:Paragraph不能嵌套Table!!!

五、表格篇

        new Table({
          // 文件页边距为默认设置时, 表格总宽度最佳为9010
          // 567 = 1cm
          layout: TableLayoutType.FIXED, // 确保列宽被应用, 这样下面的columnWidths属性才会生效
          columnWidths: [1021, 1815, 1758, 2098, 2098],
          rows: [
            new TableRow({
              children: [
                new TableCell({
                  children: [new Paragraph("1行1列")],
                  verticalAlign: VerticalAlign.CENTER  // 单元格垂直居中,需要导入VerticalAlign
                }),
                new TableCell({
                  children: [new Paragraph("1行2列")],
                  verticalAlign: VerticalAlign.CENTER
                }),
                new TableCell({
                  children: [new Paragraph("1行3列")],
                  verticalAlign: VerticalAlign.CENTER
                }),
                new TableCell({
                  children: [new Paragraph("1行4列")],
                  verticalAlign: VerticalAlign.CENTER
                }),
                new TableCell({
                  children: [new Paragraph("1行5列")],
                  verticalAlign: VerticalAlign.CENTER
                })
              ],
              height: {
                value: 397, // '0.7cm'    // 行高为0.7cm
                rule: TableRowHeight.ATLEAST     // 需要导入TableRowHeight,表示至少0.7cm
              }
            }),
            new TableRow({
              children: [
                new TableCell({
                  children: [new Paragraph("2行1列")],
                  verticalAlign: VerticalAlign.CENTER  // 单元格垂直居中,需要导入VerticalAlign
                }),
                new TableCell({
                  children: [new Paragraph("2行2列")],
                  verticalAlign: VerticalAlign.CENTER
                }),
                new TableCell({
                  children: [new Paragraph("2行3列")],
                  verticalAlign: VerticalAlign.CENTER
                }),
                new TableCell({
                  children: [new Paragraph("2行4列")],
                  verticalAlign: VerticalAlign.CENTER
                }),
                new TableCell({
                  children: [new Paragraph("2行5列")],
                  verticalAlign: VerticalAlign.CENTER
                })
              ],
              height: {
                value: 397, // '0.7cm'
                rule: TableRowHeight.ATLEAST
              }
            }),
          ]
        }),

效果如下:

注意:Paragraph不能嵌套Table!!!可以利用ES6语法 ...arr 自定义多行最后写rows[...arr]就可以

六、持续更新...

### 关于 Mammoth.jsdocx.js 的集成 Mammoth.js 是一种用于将 `.docx` 文件转换为 HTML 或纯文本的工具库[^1]。而 `docx.js` 则是一个专注于创建和操作 `.docx` 文档的 JavaScript 库[^3]。 #### 集成思路 为了实现两者的结合,可以利用以下方式: - 使用 `docx.js` 创建或修改 `.docx` 文件。 - 将生成的 `.docx` 文件通过流的形式传递给 Mammoth.js 进行解析并转化为 HTML。 以下是具体的代码示例: ```javascript // 导入必要的模块 const { DocX } = require('docx'); const mammoth = require("mammoth"); const fs = require("fs"); // 使用 docx.js 创建一个新的 .docx 文件 function createDocxFile() { const doc = new DocX(); // 添加段落到文档中 doc.addSection({ properties: {}, children: [ doc.createParagraph("这是一个测试段落"), ], }); // 返回 Promise 形式的二进制数据流 return doc.save(); } // 调用函数生成 .docx 文件并将其转为 HTML async function convertToHtml() { try { // 获取 .docx 数据流 const buffer = await createDocxFile(); // 使用 Mammoth.js 解析 .docx 并转换为 HTML const result = await mammoth.convertToHtml({ buffer }); console.log(result.html); // 输出生成的 HTML 内容 // 可选:保存到本地文件 fs.writeFileSync("output.html", result.html); } catch (error) { console.error("发生错误:", error.message); } } convertToHtml(); // 执行转换逻辑 ``` 上述代码展示了如何先使用 `docx.js` 动态生成一个简单的 `.docx` 文件,并立即将其交给 Mammoth.js 处理以获得对应的 HTML 表达形式[^2]。 --- ### 注意事项 1. **环境配置** 确保已安装所需依赖项,可以通过 npm 安装这些包: ```bash npm install docx mammoth ``` 2. **兼容性问题** 如果遇到某些复杂样式无法完全保留的情况,可能需要调整 Mammoth.js 的选项参数来优化输出效果。 3. **性能考量** 对于大规模批量处理场景下,建议评估内存占用情况以及异步执行效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ℋᙚᵐⁱᒻᵉ鲸落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值