14

我正在尝试使用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 标记或其他东西?

4

6 回答 6

21

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

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

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

于 2013-07-24T13:29:41.690 回答
4

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

于 2013-06-05T13:30:18.413 回答
2

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

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

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

此外,它不处理 HTML 注释。for因此,我必须在循环中检查“#text”节点上方添加以下行:

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

创建 docx 很棘手,因为目前还没有关于这件事的文档。但是查看代码,我看到它期望 HTML 位于 File 对象中。出于我的目的,我想使用我呈现的 HTML,而不是用户必须选择上传的一些 HTML 文件。所以我不得不通过使用它正在寻找的相同属性创建我自己的对象并将其传递进来来欺骗它。为了将它保存到客户端,我使用FileSaver.js,它需要一个 blob。我包含了这个将 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或一些服务器端解决方案。

于 2014-09-12T14:26:11.900 回答
2

您可能会发现此链接很有用,

http://evidenceprime.github.io/html-docx-js/

这里有一个在线演示:

http://evidenceprime.github.io/html-docx-js/test/sample.html

于 2017-04-05T03:00:10.017 回答
0

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

于 2013-06-04T11:27:00.620 回答
0

我正在使用适用于 JavaScript 的 Open Xml SDK。

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

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

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

一旦你加载了包,你就可以使用常规的 OpenXmlPart 创建一个真实的文档。(插入图像,创建表/行)。

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

检查上面的 URL,有一些有用的示例在 JavaScript 中执行此操作。

于 2017-12-15T21:17:53.697 回答