Как использовать for для библеотеке Docx js?
Я хотел генерировать 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
)
Ответы (2 шт):
Возможно, проблема заключается в том, что функция 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)
]
Надеюсь, это поможет решить проблему!)
Кажется, я понял, что происходит. При использовании цикла 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], Надеюсь, этот вариант поможет!)