ฉันใช้ openxml ในแอปมือถือ HTML5 เพื่อสร้างเอกสารคำบนอุปกรณ์มือถือ โดยทั่วไป openxml ทำงานได้ดีและตรงไปตรงมา แต่ฉันกำลังดิ้นรนกับปัญหาที่น่ารำคาญ การสร้างเอกสารใช้งานได้ในครั้งแรกหลังจากที่ฉันเริ่มแอปเท่านั้น คราวนี้ฉันสามารถเปิดและดูเอกสารได้ รีสตาร์ทแอปหมายถึง: - ปรับใช้อีกครั้งจากเครื่องพัฒนา - การลบแอพออกจากบานหน้าต่างงาน (ผลักออกไป; ฉันถือว่าแอพถูกลบไปแล้วเหรอ?)
ครั้งที่สองที่ฉันได้รับข้อความว่าเอกสารเสียหายและฉันไม่สามารถดูไฟล์ได้
อัปเดต: ฉันไม่สามารถสร้างพฤติกรรมนี้ซ้ำได้เมื่อฉันเรียกใช้แอปที่เชื่อมต่อกับดีบักเกอร์ระยะไกลโดยไม่ต้องตั้งค่าเบรกพอยต์ การทำเช่นนี้ฉันจะได้รับเอกสารการทำงานเสมอ
ฉันไม่ได้สร้างความแตกต่างไม่ว่าฉันจะเปลี่ยนแปลงเอกสารหรือไม่ก็ตาม เพียงเปิดและบันทึกข้อผิดพลาดนี้ซ้ำ
หลังจากทำการค้นคว้ามา ฉันพบว่าโครงสร้างของไฟล์ docx.zip ของการทำงานและไฟล์ที่เสียหายนั้นเหมือนกัน อีกทั้งยังมีความยาวไฟล์เท่ากัน แต่ใน docx ที่เสียหายมีไฟล์บางไฟล์ ฉันพบว่าไฟล์บางไฟล์มี CRC ผิด/ไม่ถูกต้อง ดูตัวอย่างที่นี่เมื่อพยายามดึงไฟล์ที่เสียหายออกจาก zip ไฟล์อื่นๆ ทำงานตามที่คาดไว้
คุณสมบัติของไฟล์นี้คือ-> (CRC ในเวอร์ชันใช้งานได้คือ: 44D3906C)
รหัสสำหรับการประมวลผลเทมเพลต doc:
/*
* 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);
};
มีความคิดอะไรบ้างที่ฉันทำผิด?