我在HTML5移动应用中使用openxml在移动设备上生成word文档。 一般来说,openxml工作得很好而且直截了当,但我正在努力解决一个尴尬的问题。 文档生成仅在我启动应用程序后第一次生效。这次我可以打开并查看文档。重启应用意味着: - 从开发机器重新部署 - 从任务窗格中删除应用程序(推开;我认为该应用程序已删除了吗?)
我第二次收到消息时文档已损坏,我无法查看该文件
更新: 当我在没有设置断点的情况下运行连接到远程调试器的应用程序时,我无法重现此行为。这样做我总能得到一份工作文件。
我对文档进行任何更改是否有所作为。只需打开并保存即可重现此错误。
经过一番研究后,我发现工作文件和损坏文件的docx.zip文件结构是一样的。它们也具有相同的文件长度。但是在腐败的docx中有一些文件我发现一些文件的CRC错误/无效。在尝试从zip中获取损坏的文件时,请参见此处的示例。其他文件正在按预期工作。
此文件的属性为 - > (工作版中的CRC为:44D3906C)
处理doc-template的代码:
/*
* Process the template
*/
function processTemplate(doc64, callback)
{
"use strict";
console.log("PROCESS TEMPLATE");
var XAttribute = Ltxml.XAttribute;
var XCData = Ltxml.XCData;
var XComment = Ltxml.XComment;
var XContainer = Ltxml.XContainer;
var XDeclaration = Ltxml.XDeclaration;
var XDocument = Ltxml.XDocument;
var XElement = Ltxml.XElement;
var XName = Ltxml.XName;
var XNamespace = Ltxml.XNamespace;
var XNode = Ltxml.XNode;
var XObject = Ltxml.XObject;
var XProcessingInstruction = Ltxml.XProcessingInstruction;
var XText = Ltxml.XText;
var XEntity = Ltxml.XEntity;
var cast = Ltxml.cast;
var castInt = Ltxml.castInt;
var W = openXml.W;
var NN = openXml.NoNamespace;
var wNs = openXml.wNs;
var doc = new openXml.OpenXmlPackage(doc64);
// add a paragraph to the beginning of the document.
var body = doc.mainDocumentPart().getXDocument().root.element(W.body);
var tpl_row = ((doc.mainDocumentPart().getXDocument().descendants(W.tbl)).elementAt(1).descendants(W.tr)).elementAt(2);
var newrow = new XElement(tpl_row);
doc.mainDocumentPart().getXDocument().descendants(W.tbl).elementAt(1).add(newrow);
// callback(doc);
var mod_file = null;
var newfile;
var path;
if (doc != null && doc != undefined ) {
mod_file = doc.saveToBlob();
// Start writing document
path = "Templates";
newfile = "Templates/Bau.docx";
console.log("WRITE TEMPLATE DOCUMENT");
fs.root.getFile("Templates/" + "MyGenerated.docx", {create: true, exclusive: false},
function(fileEntry)
{
fileEntry.createWriter(
function(fileWriter)
{
fileWriter.onwriteend = function(e) {
console.log("TEMPLATE DOCUMENT WRITTEN:"+e.target.length);
};
fileWriter.onerror = function(e) {
console.log("ERROR writing DOCUMENT:" + e.code + ";" + e.message);
};
var blobreader = new FileReader();
blobreader.onloadend = function()
{
fileWriter.write(blobreader.result); // reader.result contains the contents of blob as a typed array
};
blobreader.readAsArrayBuffer(mod_file);
},
null);
}, null);
};
任何想法我做错了什么?
答案 0 :(得分:0)
感谢您发布有关错误的信息。我在开发JavaScript的Open XML SDK时遇到了jszip.js的一些问题。
在以下链接中,有一个示例javascript应用程序,用于演示生成文档。
Open XML SDK for JavaScript Demo
在该应用程序中,您可以一个接一个地保存多个DOCX,并且它们没有损坏。
为了解决这个问题,我需要能够在本地重新制作。也许您可以使用那个小工作的Web应用程序并用零件替换零件,直到它生成无效文件?
干杯,埃里克
P.S。我正在旅行并且间歇性地访问互联网。如果你可以继续thread on OpenXmlDeveloper.org,那么它将帮助我更快地回答。 : - )
答案 1 :(得分:0)
使它对我有用的是改变向文档添加图像(部分)的方式。我使用的是"二进制"用于将图像添加到文档。我将其更改为" base64"
所以我改变了来源:
mydoc.addPart( "/word/"+reltarget, openXml.contentTypes.png, "binary", fotodata ); // add Image Part to doc
为:
mydoc.addPart( "/word/"+reltarget, openXml.contentTypes.png, "base64", window.btoa(fotodata) ); // add Image Part to doc