เดิมทีเราต้องการสร้างเอกสารทางฝั่ง Android (ต้องการ ... ) ในท้ายที่สุดไม่มีวิธีที่ดีที่สามารถสมบูรณ์แบบบน Android และในที่สุดเราสามารถย้ายไปที่เซิร์ฟเวอร์ได้เท่านั้น อย่าเสีย แต่บันทึกเหตุผลว่าทำไมแต่ละเฟรมเวิร์กไม่สนับสนุน Android และลักษณะของพวกเขา ยังมีเฟรมเวิร์กมากมายที่เกี่ยวข้องกับ Java และบางส่วนก็ไม่เลว แต่น่าเสียดายที่พวกเขาไม่สนับสนุน Android หรือพวกเขาคิดค่าธรรมเนียมและมีราคาต่ำ
หลังจากการทดสอบส่วนบุคคลแพ็คเกจ AWT จำนวนมากที่ไม่รองรับ Java ไม่สามารถใช้กับ Android ได้โดยตรง Freemarker ค่อนข้างดีและสามารถสร้างเอกสารที่ซับซ้อนและสวยงาม แต่น่าเสียดายที่มันไม่สนับสนุน Android มันสามารถทำงานบน Android โดยใช้ POI แต่มันผ่านข้อผิดพลาดมากมายไปตามทางเนื่องจากรูปแบบรูปแบบ ฯลฯ และยังคงไม่พลิกผันที่จะเปิดด้วย WFS JWORD และ ASPOSE.WORD สามารถรองรับได้อย่างสมบูรณ์แบบและระยะเวลาการทดลอง JWORD เป็นเพียง 30 วันทั้งสองค่าใช้จ่ายสำหรับทั้งคู่ ITEXT ไม่มีการทดสอบ แต่มีการกล่าวว่าไม่สนับสนุน Android
วิธีที่ 1: freemarker
วิธีนี้ต้องการการสร้างเทมเพลต DOC ด้วยตนเอง (อย่าลืมใช้ตัวยึดตำแหน่งสำหรับรูปภาพ) และบันทึกเป็นไฟล์ XML สร้างโดยการแทนที่เนื้อหาแบบไดนามิกในแท็กเฉพาะ $ {} ตัวอย่าง:
ก่อนอื่นมาลองเรนเดอร์:
Docutil คลาสสาธารณะ {การกำหนดค่าการกำหนดค่าสาธารณะ = null; Public DocUtil () {configure = การกำหนดค่าใหม่ (configuration.version_2_3_22); configure.setDefaultEncoding ("UTF-8"); } /*** สร้างไฟล์ Word ตามเทมเพลต doc* @param datamap ข้อมูลที่ต้องกรอกในเทมเพลต* @param downloadtype ชื่อไฟล์* @param บันทึกการบันทึกพา ธ* /โมฆะสาธารณะที่สร้างขึ้น // ตั้งค่าวิธีการและเส้นทางของอุปกรณ์เทมเพลต FreeMarker รองรับวิธีการโหลดเทมเพลตหลายวิธี คุณสามารถโหลด servlet, classpath และการติดตั้งฐานข้อมูล // โหลดไฟล์เทมเพลตและวางไว้ภายใต้ testDoc configure.setClassFortEmplateLoading (this.getClass (), "/testDoc"); // ตั้งค่า wrapper วัตถุ // configure.setObjectWrapper (ใหม่ defaultObjectWrapper ()); // ตั้งค่า Handler Exception Configure.SetTemplateExceptionHandler (TemplateExceptionHandler.ignore_handler); // กำหนดวัตถุเทมเพลตโปรดทราบว่าชื่อประเภทเทมเพลตควรสอดคล้องกับเทมเพลต downloadtype = configure.getTemplate (downloadtype+". xml"); ไฟล์ outfile = ไฟล์ใหม่ (บันทึก); นักเขียน out = null; out = new bufferedWriter (ใหม่ outputStreamWriter (ใหม่ fileOutputStream (outfile), "UTF-8")); template.process (datamap, out); out.close (); } catch (ioexception e) {e.printstacktrace (); } catch (templateException e) {e.printStackTrace (); }} สตริงสาธารณะ getimagestr (string imgfile) {inputStream ใน = null; ไบต์ [] data = null; ลอง {in = new fileInputStream (imgfile); data = ไบต์ใหม่ [in.available ()]; in.read (ข้อมูล); in.close (); } catch (filenotfoundException e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); } base64Encoder encoder = ใหม่ base64Encoder (); return encoder.encode (ข้อมูล); - Public Class TestDoc {โมฆะคงที่สาธารณะหลัก (String [] args) {docutil docutil = new docutil (); แผนที่ <string, Object> datamap = new hashmap <string, object> (); datamap.put ("ชื่อ", "Joanna"); datamap.put ("Examnum", "11111111111111"); datamap.put ("idcard" "222222222222222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 Datamap.put ("Carmodel", "C1"); docutil.getimagestr (d: //img//userimg1.png ")); datamap.put ("FirstExamScores", "0 คะแนน, ล้มเหลว"); datamap.put ("FirstPic2", docutil.getimagestr ("d: //img//firstpic2.png")); datamap.put ("SeconterExamScores", "90 คะแนน, ผ่าน"); datamap.put ("seconddeductitem", ""); datamap.put ("SecondPic1", docutil.getimagestr ("d: //img//secondpic1.png")); datamap.put ("SecondPic2", docutil.getimagestr ("d: //img//secondpic2.png")); datamap.put ("SecondPic3", docutil.getimagestr ("d: //img//secondpic3.png")); docutil.createdoc (datamap, "basedoc", "d: //yanqiong.doc"); - ไฟล์ XML ยาวเกินไปดังนั้นฉันจะไม่โพสต์ ...
ในที่สุดเหตุผลที่ไม่สามารถใช้ Android ได้: http://stackoverflow.com/questions/25929542/use-freemarker-library-in-android
คำถาม เพิ่มเติม เกี่ยวกับการแสดงผลแบบไดนามิกของรายการและตัวแบ่งบรรทัด
ข้อกำหนดนั้นชัดเจน: ในรายการหักข้างต้นหากฉันมีรายการหักหลายรายการฉันต้องการให้แต่ละบรรทัดหยุดแสดง
การเพิ่มใหม่โดยตรงไปยังเนื้อหาที่จะแสดงไม่มีผลและจะไม่ทำงานเป็นบรรทัดใหม่
เมื่อเพิ่มแท็ก FTL เช่น <#list> </list> ปัญหาบางอย่างจะเกิดขึ้นซึ่งไม่ได้รับการยอมรับใน XML ส่งผลให้โครงการไม่สามารถทำงานได้
แก้ปัญหา:
เพิ่มและเพิ่มการแบ่งบรรทัดในตำแหน่งที่จำเป็นต้องแสดงรายการหลายรายการ:
<#list FirstDeductItem เป็น FirstItem>
<w: t> $ {firstItem} </w: t> <w: br/>
</#รายการ>
เปลี่ยนเป็น:
รายการ <String> strs = new ArrayList <String> ();
strs.add ("111111111111111111");
strs.add ("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
strs.add ("3333333333333333");
datamap.put ("firstdeductitem", strs);
เปลี่ยนเป็น docutil.java:
// กำหนดวัตถุเทมเพลตโปรดทราบว่าชื่อประเภทเทมเพลตควรสอดคล้องกับ DownloadType
template = configure.getTemplate (downloadtype+". ftl"); ในเวลานี้ไฟล์ XML จะรายงานข้อผิดพลาดและแน่นอนว่ามันเป็นไปไม่ได้ที่จะรวบรวมและเรียกใช้โครงการ คุณต้องเปลี่ยนไฟล์. xml เป็นไฟล์. FTL เพื่อบันทึก จากนั้นรวบรวมและเรียกใช้การเรนเดอร์:
วิธีที่ 2: Poi
ฉันพบปัญหาหลายรุ่นโดยใช้วิธีนี้ สิ่งนี้ขึ้นอยู่กับ POI3.7+Word2007 และการทดสอบสามารถทำงานได้อย่างสมบูรณ์แบบ
คุณต้องสร้างเทมเพลตเอกสารด้วย Word2007 ด้วยตนเอง (การใช้รุ่นอื่น ๆ จะทำให้เกิดข้อผิดพลาด: ไฟล์ไม่สามารถเปิดได้) และแทนที่เนื้อหาที่จำเป็นต้องได้รับการอัปเดตแบบไดนามิกด้วย $ {} คล้ายกับข้างต้น แต่คุณไม่จำเป็นต้องบันทึกเป็นรูปแบบเอกสาร XML
/** * ปรับแต่ง XWPFDOCUMENT และแทนที่ CreatePicture () เมธอด * @author Joanna.yan * */คลาสสาธารณะ CustomxwpfDocument ขยาย XWPFDocument {Public CustomxwpfDocument (InputStream) โยน iOexception } Public CustomxwpfDocument () {super (); } Public CustomxwpfDocument (opcpackage pkg) พ่น IOException {super (pkg); } โมฆะสาธารณะ createPicture (int id, ความกว้าง int, ความสูง int, xwpfparagraph ย่อหน้า) {สุดท้าย int emu = 9525; ความกว้าง *= emu; ความสูง *= emu; String blipid = ((poixmldocumentpart) getAllPictures (). รับ (id)). getPackageRelationship (). getId (); ctinline inline = paragraph.createrun (). getCtr (). addNewDrawing (). addNewInline (); String picxml = "" + "<a: กราฟิก xmlns: a =/" http://schemas.openxmlformats.org/drawingml/2006/main/ ">" + "<a: GraphicData uri =/"http://schemas.openxmlformats.org/drawingml/2006/picture/"> " +" <pic: pic: pic: pic =/"http://schemas.openxmlformats.org/drawingml/2006/picture/ <pic: cnvpr id =/"" + id + "/" name =/"สร้าง/"/> " +" <pic: cnvpicpr/> " +" </pic: nvpicpr> " +" <pic: blipfill> " +" <a: blip r: embed =/"" blipid + "/" xmlns: r =/"http://schemas.openxmlformats.org/officedocument/2006/relationships/"/> " +" <a: ยืด> " +" <a: fillrect/> " +" </a x =/"0/" y =/"0/"/> " +" <a: ext cx =/"" + width + "/" cy =/"" ความสูง + "/"/> " +" </a: xfrm> " +" <a: prstgeom prst =/"rect/" + " </pic: pic> " +" </a: graphicData> " +" </a: graphic> "; inline.addnewgraphic (). addnewgraphicData (); xmltoken xmltoken = null; ลอง {xmltoken = xmltoken.factory.parse (picxml); } catch (xmlexception e) {e.printstacktrace (); } inline.set (xmltoken); inline.setDistt (0); inline.setDistb (0); inline.setDistl (0); inline.setDistr (0); CTPOSITIVESIZE2D ENTENT = inline.addNewExtent (); ขอบเขต. setCx (ความกว้าง); ขอบเขต. setscy (ความสูง); ctnonvisualDrawingProps docpr = inline.addnewDocpr (); docpr.setid (id); docpr.setName ("image"+id); docpr.setdescr ("ทดสอบ"); - /** * เหมาะสำหรับ Word 2007 * Poi เวอร์ชัน 3.7 * @author Joanna.yan * */คลาสสาธารณะ WordUtil {public customxwpfdocument generateWord (แผนที่ <String, Object> param, เทมเพลตสตริง) {customxwpfdocument doc = null; ลอง {opcpackage pack = poixmldocument.openpackage (แม่แบบ); doc = new customxwpfdocument (แพ็ค); if (param! = null & ¶m.size ()> 0) {// รายการย่อหน้าการประมวลผล <xwpfAragraph> paragraphlist = doc.getParagraphs (); ProcessParagraphs (Paragraphlist, param, doc); // การประมวลผลตารางตัววนซ้ำ <xwpftable> it = doc.getTablesIterator (); ในขณะที่ (it.hasnext ()) {xwpftable table = it.next (); รายการ <xwpftablerow> rows = table.getrows (); สำหรับ (xwpftablerow row: rows) {list <xwpftablecell> เซลล์ = row.getTableCells (); สำหรับ (xwpftablecell cell: เซลล์) {list <xwpfparagraph> paragraphlisttable = cell.getParagraphs (); ProcessParagraphs (ParagraphlistTable, param, doc); }}}}}} catch (ioexception e) {e.printstacktrace (); } ส่งคืนเอกสาร; } / ** * process paragraph * @param paragraphlist * @param param * @param doc * / โมฆะสาธารณะคงที่ processParaphs (รายการ <xwpfparagraph> ย่อหน้า, แผนที่ <สตริง, วัตถุ> param, customxwpfdocument เอกสาร) {ถ้า (paragraphlist! : ParagraphList) {รายการ <xwpfrun> runs = paragraph.getRuns (); สำหรับ (xwpfrun run: runs) {String text = run.getText (0); if (text! = null) {boolean issettext = false; สำหรับ (รายการ <สตริง, วัตถุ> รายการ: param.entrySet ()) {คีย์สตริง = entry.getKey (); if (text.indexof (key)! =-1) {issettext = true; ค่าวัตถุ = entry.getValue (); if (ค่าอินสแตนซ์ของค่าของสตริง) {// text text text = text.replace (key, value.toString ()); } อื่นถ้า (ค่าอินสแตนซ์ของแผนที่) {// ข้อความแทนที่รูปภาพ = text.replace (คีย์, ""); MAP PIC = (แผนที่) ค่า; int width = integer.parseint (pic.get ("width"). toString ()); ความสูง int = integer.parseint (pic.get ("ความสูง"). toString ()); int pictype = getPictureType (pic.get ("ประเภท"). toString ()); ไบต์ [] byteArray = (byte []) pic.get ("เนื้อหา"); ByTeArrayInputStream ByteInputStream = New ByteArrayInputStream (ByTeArray); ลอง {int ind = doc.addPicture (ByteInputStream, pictype); doc.createpicture (ตัวบ่งชี้, ความกว้าง, ความสูง, วรรค); } catch (invalidFormatexception e) {e.printStackTrace (); } catch (ioexception e) {e.printstacktrace (); }}}}}} ถ้า (issettext) {run.settext (ข้อความ, 0); }}}}}}}}} / ** * รับรหัสประเภทภาพที่สอดคล้องกันตามประเภทภาพ * @param pictype * @return * / สาธารณะคงที่ int getPictureType if (pictype! = null) {ถ้า (pictype.equalsignorecase ("png")) {res = customxwpfdocument.picture_type_png; } อื่นถ้า (pictype.equalsignorecase ("dib")) {res = customxwpfdocument.picture_type_dib; } อื่นถ้า (pictype.equalsignorecase ("emf")) {res = customxwpfdocument.picture_type_emf; } อื่นถ้า (pictype.equalsignorecase ("jpg") || pictype.equalsignorecase ("jpeg")) {res = customxwpfdocument.picture_type_jpeg; } อื่นถ้า (pictype.equalsignorecase ("wmf")) {res = customxwpfdocument.picture_type_wmf; }} return res; - Public Class TestPoi {โมฆะคงที่สาธารณะหลัก (String [] args) พ่น IOException {MAP <String, Object> param = new hashmap <String, Object> (); param.put ("$ {name}", "Joanna.yan"); param.put ("$ {Examnum}", "00000000000001"); param.put ("$ {idcard}", "111111111111111111111111111111111111); param.put ("$ {carmodel}", "c1"); customxwpfdocument doc = wordutil.generateword (param, "d: //joanna.docx"); fileOutputStream fopts = new fileOutputStream ("D: //yan.docx"); doc.write (fopts); fopts.close (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น