Как использовать for для библеотеке Docx js?

Рейтинг: 0Ответов: 2Опубликовано: 25.05.2023

Я хотел генерировать docx документы через код с помощью js,html страницы и библеотеку docx, но когда я создаю текст с помощью цикла, то по какой-то причине из-за цикла текст не создается.

может я делаю что-то не так?

import { Document, Packer, Paragraph, TextRun } from "docx"
import { saveAs } from "file-saver"

const title = document.getElementById("titleDoc").value
let titleArray = title.split("\n", title.length)

function ticket(title) {
    for(let i = 0; i < title.length; i++){
       new Paragraph({
            children: [
               new TextRun({
                  text: title[i],
                  bold: true,
                  size: 28
            }),
          ]
     })
   }     
}
document.getElementById("generate").addEventListener(
  "click",
  function () {
    const doc = new Document({
      sections: [
        {
          properties: {},
          children: [
            ticket(titleArray)
          ]
        }
      ]
    });

Packer.toBlob(doc).then((blob) => {
  console.log(blob);
  saveAs(blob, "example.docx");
  console.log("Document created successfully");
});
  },
  false
)

Ответы

▲ 0Принят

Кажется, я понял, что происходит. При использовании цикла for в children объекта sections вы должны обернуть каждый элемент в фигурные скобки. Это можно сделать с помощью метода map(). Попробуйте изменить свой код следующим образом:

function generate() {
    const title = document.getElementById("titleDoc").value
    let titleArray = title.split("\\\\n", title.length)

    function ticket(title) {
      let paragraphs = [];
      for (let i = 0; i < title.length; i++) {
        paragraphs.push(
          new Paragraph({
            children: [
              new TextRun({
                text: title[i],
                bold: true,
                size: 28
              })
            ]
          })
        );
      }
      return paragraphs;
    }

    const doc = new Document({
      sections: [
        {
          properties: {},
          children: ticket(titleArray).map((paragraph) => {
            return { type: "paragraph", children: [paragraph] };
          })
        }
      ]
    });

    Packer.toBlob(doc).then((blob) => {
      console.log(blob);
      saveAs(blob, "example.docx");
      console.log("Document created successfully");
    });
  }

document.getElementById("generate").addEventListener("click", generate, false);

Теперь каждый элемент массива ticket(titleArray) будет обернут в фигурные скобки и не должен вызывать синтаксических ошибок. Если вы хотите использовать только первый элемент массива, вы можете использовать ticket(titleArray)[0], Надеюсь, этот вариант поможет!)

▲ 0

Возможно, проблема заключается в том, что функция ticket(title) не возвращает новый параграф. Попробуйте изменить функцию следующим образом:

function ticket(title) {
  let paragraphs = [];
  for (let i = 0; i < title.length; i++) {
    paragraphs.push(
      new Paragraph({
        children: [
          new TextRun({
            text: title[i],
            bold: true,
            size: 28
          })
        ]
      })
    );
  }
  return paragraphs;
}

Затем, когда вы вызываете функцию ticket(titleArray) в children объекта sections, оберните ее в фигурные скобки:

children: [
  ...ticket(titleArray)
]

Надеюсь, это поможет решить проблему!)