使用Docx.js在JavaScript中生成Word文档?

时间:2013-04-09 10:48:30

标签: javascript ms-word docx

我正在尝试使用docx.js生成Word文档,但我似乎无法让它工作。

在修改第247行以修复“'textAlign'未定义错误”后,我将原始代码复制到Google Chrome控制台中

if (inNode.style && inNode.style.textAlign){..}

使函数convertContent可用。结果是一个对象,例如

JSON.stringify( convertContent($('<p>Word!</p>)[0]) )

结果 -

"{"string":
      "<w:body>
            <w:p>
                <w:r>
                    <w:t xml:space=\"preserve\">Word!</w:t>
                </w:r>
            </w:p>
       </w:body>"
 ,"charSpaceCount":5
 ,"charCount":5,
 "pCount":1}"

我复制了

<w:body>
    <w:p>
        <w:r>
            <w:t xml:space="preserve">Word!</w:t>
        </w:r>
    </w:p>
</w:body>

进入Notepad ++并将其保存为扩展名为“docx”的文件,但是当我在MS Word中打开它时却说“由于内容存在问题而无法打开”。

我是否遗漏了某些属性或XML标签?

6 个答案:

答案 0 :(得分:21)

您可以使用docxtemplater(我创建的库)从模板生成Docx文档。

它可以用它们的值替换标签(比如模板引擎),也可以用付费版本替换图像。

以下是模板引擎的演示:https://docxtemplater.com/demo/

答案 1 :(得分:4)

由于本地文件的ajaxCalls(blank文件夹中的所有内容),此代码无法在JSFiddle上运行,或者您应该以ByteArray格式输入所有文件并使用{{1回声API:http://doc.jsfiddle.net/use/echo.html

答案 2 :(得分:1)

我知道这是一个较老的问题,你已经有了答案,但我努力让这一天工作,所以我想我会分享我的结果。

和你一样,我必须通过将行更改为此来修复textAlign错误:

if (inNode.style && inNode.style.textAlign)

此外,它没有处理HTML评论。所以,我必须在for循环中的“#text”节点的检查上方添加以下行:

if (inNodeChild.nodeName === '#comment') continue;

创建docx很棘手,因为到目前为止还没有关于这个东西的文档。但仔细查看代码,我发现它希望HTML位于File对象中。出于我的目的,我想使用我呈现的HTML,而不是用户必须选择上传的某些HTML文件。所以我不得不通过使用它所寻找的相同属性创建我自己的对象并将其传入来欺骗它。为了将其保存到客户端,我使用FileSaver.js,这需要一个blob。我 included this function 将base64转换为blob。所以我实现它的代码就是:

var result = docx({ DOM: $('#myDiv')[0] });
var blob = b64toBlob(result.base64, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
saveAs(blob, "test.docx");

最后,这适用于简单的Word文档,但对于其他任何内容都不是很复杂。我无法渲染任何样式,甚至没有尝试让图像正常工作。我已经放弃了这种方法,现在正在研究DocxgenJS或一些服务器端解决方案。

答案 3 :(得分:1)

答案 4 :(得分:0)

您正在以代码方式执行正确的操作,但您的文件不是有效的docx文件。如果查看docx.js中的docx()函数,您会发现docx文件实际上是一个包含多个xml文件的zip文件。

答案 5 :(得分:0)

我正在使用Open Xml SDK for JavaScript。

http://ericwhite.com/blog/open-xml-sdk-for-javascript/

基本上,在Web服务器上,我有一个空的docx文件作为新模板。 当用户在浏览器中单击新的docx文件时,我将检索空的docx文件作为模板,将其转换为BASE64并将其作为Ajax响应返回。

在客户端脚本中,将BASE64字符串转换为字节数组,并使用openxmlsdk.js将字节数组加载为javascript OpenXmlPackage对象。

加载包后,您可以使用常规OpenXmlPart创建真实文档。 (插入图像,创建表格/行)。

最后一步是将其作为文档流式传输给最终用户。这部分与安全有关。在我的代码中,我将其发送回网络服务器并暂时保存。并准备一个http响应通知最终用户下载它。

检查上面的网址,在JavaScript中有一些有用的示例。