2013-04-09 1296 views
13

我想用docx.jsGithub repo)生成一个Word文档,但我似乎无法让它工作。使用Docx.js在JavaScript中生成Word文档?

我复制的原始代码到谷歌浏览器控制台修改行247后修复“‘textAlign设置’未定义错误”

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> 

到记事本++和与 'DOCX' 的扩展它保存为一个文件,但是当我在MS Word中打开它,但它说'不能打开,因为内容有问题'。

我是否缺少一些属性或XML标签?

+0

您是否尝试过使用M4rio的Github回购?它有一个使用示例:https://github.com/MrRio/DOCX.js – edi9999 2013-06-05 09:30:27

+0

运行示例代码后,我得到这个错误 - “TypeError:对象函数绑定(var_args){返回func.apply(thisObject,args .concat(切片(参数))); }没有方法'ajax'' – Peter 2013-06-05 10:00:27

+0

你加载jQuery?依赖关系如下:' \t \t <脚本类型=“ 文本/ JavaScript的” SRC = “./库/ jszip/jszip.js”> – edi9999 2013-06-05 10:08:04

回答

4

此代码不能在工作的jsfiddle因为AjaxCalls的本地文件(一切是在blank文件夹),或者你应该进入的ByteArray格式的所有文件,并使用jsFiddle回声API:http://doc.jsfiddle.net/use/echo.html

+1

谢谢。我决定使用一个名为https://docx.codeplex.com/的库来完成这个服务器端。用JavaScript来做它会很酷,但是很好。 :-) – Peter 2013-06-05 13:43:50

+2

如果您想要一个仅用于javascript的解决方案从docx模板生成docx,请查看我创建的库:https://github.com/edi9999/docxgenjs – edi9999 2013-06-05 14:02:16

+0

哇。这真的很酷。你可以使用base64图像或画布元素吗?你有演示页面或hello_word.docx例子吗? – Peter 2013-06-05 14:08:32

0

你正在做的代码正确的事情,但你的文件不是一个有效的docx文件。如果你看看docx.js中的docx()函数,你会发现一个docx文件实际上是一个包含几个xml文件的zip文件。

+0

谢谢。如何将这些zip/xml文件转换为有效的docx格式? – Peter 2013-06-04 12:01:53

+1

我想你可以将一个完整的html文件传递给'docx()'函数的文件参数。它会返回结果。 – 2013-06-04 18:47:11

1

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

和你一样,我不得不改变线路此修复textAlign错误:

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

此外,它没有处理HTML注释。所以,我不得不添加检查上述以下行的“#text”节点在for循环:

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

要创建的docx是棘手,因为有这个东西作为尚未完全没有文档。但仔细查看代码,我发现它期望HTML处于File对象中。出于我的目的,我想用我渲染的HTML,而不是用户必须选择上传的一些HTML文件。所以我不得不欺骗它,让自己的对象具有相同的属性,并将其传递给它。为了将它保存到客户端,我使用了FileSaver.js,它需要一个blob。 I 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或某些服务器端解决方案。

0

我使用Open XML SDK为JavaScript。

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

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

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

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

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

检查上面的URL,这里有一些有用的JavaScript样例。