การสร้างเอกสารใช้งานได้ในครั้งแรกเท่านั้น

ฉันใช้ 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);                   
                 };

มีความคิดอะไรบ้างที่ฉันทำผิด?


person Karl    schedule 28.05.2014    source แหล่งที่มา
comment
คุณช่วยกรุณาให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นจริงได้ไหม ซีอาร์ซีผิดอะไร? คุณกำลังปิดแอปหรือเพียงแค่ย้ายแอปไปที่พื้นหลังหรือไม่? ฯลฯ ฯลฯ ฯลฯ... มันยากมากที่จะช่วยแก้ปัญหาที่เราไม่เห็น   -  person Cerbrus    schedule 28.05.2014


คำตอบ (2)


ขอบคุณสำหรับการโพสต์เกี่ยวกับข้อผิดพลาด มีปัญหาบางอย่างกับ jszip.js ที่ฉันพบเมื่อพัฒนา Open XML SDK สำหรับ JavaScript

ที่ลิงค์ต่อไปนี้ มีตัวอย่างแอปจาวาสคริปต์ที่สาธิตการสร้างเอกสาร

เปิด XML SDK สำหรับการสาธิต JavaScript

ในแอปนั้น คุณสามารถบันทึก DOCX ได้หลายไฟล์ ทีละไฟล์ โดยที่ไฟล์เหล่านั้นจะไม่เสียหาย

เพื่อที่จะแก้ไขปัญหานี้ ฉันจะต้องสามารถผลิตซ้ำในท้องถิ่นได้ บางทีคุณอาจใช้เว็บแอปเล็กๆ น้อยๆ ที่ใช้งานได้และแทนที่ชิ้นส่วนด้วยชิ้นส่วนของคุณจนกว่าจะสร้างไฟล์ที่ไม่ถูกต้อง

ไชโยเอริค

ป.ล. ฉันกำลังเดินทางและมีการเข้าถึงอินเทอร์เน็ตเป็นระยะ หากคุณสามารถดำเนินการต่อในกระทู้บน OpenXmlDeveloper.orgแล้วจะช่วยให้ผมตอบได้เร็วยิ่งขึ้นครับ :-)

person Eric White    schedule 29.05.2014

สิ่งที่ทำให้มันใช้ได้ผลสำหรับฉันคือการเปลี่ยนวิธีการเพิ่มรูปภาพ (บางส่วน) ลงในเอกสาร ฉันใช้ประเภท "ไบนารี" ในการเพิ่มรูปภาพลงในเอกสาร ฉันเปลี่ยนสิ่งนี้เป็น "base64"
ดังนั้นฉันจึงเปลี่ยนแหล่งที่มาจาก:

mydoc.addPart( "/word/"+reltarget, openXml.contentTypes.png, "binary", fotodata );  // add Image Part to doc

to:

mydoc.addPart( "/word/"+reltarget, openXml.contentTypes.png, "base64", window.btoa(fotodata) );                 // add Image Part to doc
person Karl    schedule 06.06.2014