Awalnya, kami ingin menghasilkan dokumen di sisi Android (ini membutuhkan ...). Pada akhirnya, tidak ada metode yang baik yang bisa sempurna di Android, dan pada akhirnya, kita hanya bisa pindah ke server. Jangan sia -sia, tetapi catat alasan mengapa setiap kerangka kerja tidak mendukung Android dan karakteristiknya. Masih ada banyak kerangka kerja yang terkait dengan Java, dan beberapa tidak buruk, tetapi sayangnya mereka tidak mendukung Android, atau mereka mengenakan biaya dengan biaya dan memiliki harga murah.
Setelah pengujian pribadi, banyak paket AWT yang tidak mendukung Java tidak dapat digunakan langsung di Android. Freemarker cukup bagus dan dapat menghasilkan dokumen yang kompleks dan indah, tetapi sayangnya itu tidak mendukung Android. Ini dapat berjalan di Android menggunakan POI, tetapi telah melalui banyak jebakan di sepanjang jalan karena versi, format, dll., Dan masih dibumbui dengan WFS. JWORD dan ASPOSE.Word dapat didukung dengan sempurna, dan periode masa percobaan JWORD hanya 30 hari, keduanya mengenakan biaya untuk keduanya. ITEXT tidak memiliki tes, tetapi dikatakan tidak mendukung Android.
Metode 1: Freemarker
Metode ini memerlukan secara manual membuat templat DOC (ingat untuk menggunakan placeholder untuk gambar) dan menyimpannya sebagai file XML. Menghasilkan dengan mengganti konten secara dinamis dalam tag spesifik $ {}. contoh:
Pertama, mari kita ambil rendering:
Kelas Publik Docutil {Konfigurasi Publik Konfigurasi = NULL; public docutil () {configuration = configuration baru (configuration.version_2_3_22); configure.setDefaultEncoding ("UTF-8"); } /*** Hasilkan file kata berdasarkan template doc* @param datamap data yang perlu diisi dalam template* @param unduh nama file* @param savePath save path* /public void dibuat (peta <string, objek> datamap, string downloadtype, string savePath) {try {// muat template yang dibutuhkan untuk menyaing // Atur metode dan jalur perangkat template, Freemarker mendukung beberapa metode pemuatan templat. Anda dapat memuat ulang Servlet, ClassPath, dan Database Mount. // Muat file template dan letakkan di bawah configure testDoc.setClassfortemplateading (this.getClass (), "/testDoc"); // Atur wrapper objek // configure.setObjectWrapper (new DefaultObjectWrapper ()); // Atur Exception Handler configure.setTemplateExceptionHandler (TemplateExceptionHandler.ignore_handler); // Tentukan objek template, perhatikan bahwa nama tipe template harus konsisten dengan template downloadtype = configure.gettemplate (downloadtype+". Xml"); File outfile = file baru (savePath); Penulis keluar = null; out = BufferedWriter baru (outputStreamWriter baru (FileOutputStream baru (OutFile), "UTF-8")); template.process (datamap, out); out.close (); } catch (ioException e) {e.printstacktrace (); } catch (templateException e) {e.printstacktrace (); }} public String getimageStr (string imgfile) {inputStream in = null; byte [] data = null; coba {in = new fileInputStream (imgfile); data = byte baru [in.available ()]; in. Baca (data); melampirkan(); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } Base64Encoder encoder = base64Encoder baru (); return encoder.encode (data); }} testdoc kelas publik {public static void main (string [] args) {docutil docutil = new docutil (); Peta <String, Object> datamap = HashMap baru <String, Object> (); datamap.put ("name", "joanna"); datamap.put ("examnum", "11111111111111"); datamap.put ("idcard", "22222222222222222222222222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222222222222222222222222222; DataMap.put (Carmodel "," C1 "); docutil.getimagestr ("d: //img//userimg1.png")); datamap.put ("FirstExamScores", "0 poin, gagal"); datamap.put ("firstpic2", docutil.getimagestr ("d: //img//firstic2.png"))); datamap.put ("SecondExamScores", "90 poin, pass"); datamap.put ("SecondeductItem", ""); datamap.put ("kedua", 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, "berbasis", "d: //yanqiong.doc"); }} File XML terlalu lama, jadi saya tidak akan mempostingnya ...
Akhirnya, alasan mengapa Android tidak dapat digunakan: http://stackoverflow.com/questions/25929542/use-freemarker-library-in-droid
Pertanyaan tambahan tentang tampilan daftar daftar dan istirahat yang dinamis
Persyaratannya jelas: dalam item pengurangan di atas, jika saya memiliki beberapa item pengurangan, saya ingin setiap jeda baris ditampilkan.
Menambahkan Newline langsung ke konten yang akan ditampilkan tidak berpengaruh dan tidak akan berfungsi sebagai newline.
Saat menambahkan tag FTL, seperti <#list> </cist>, beberapa masalah akan muncul, yang tidak dikenali dalam XML, mengakibatkan proyek tidak dapat dijalankan.
menyelesaikan:
Tambahkan dan tambahkan jeda baris ke posisi di mana beberapa item deduksi perlu ditampilkan:
<#list firstdeductitem sebagai firstitem>
<w: t> $ {firstItem} </w: t> <w: br/>
</#Daftar>
Ubah menjadi:
Daftar <String> strs = ArrayList baru <String> ();
Strs.add ("11111111111111111111");
Strs.add ("2222222222222222222222222);
Strs.add ("333333333333333");
datamap.put ("firstdeductitem", strs);
Ubah ke Docutil.java:
// Tentukan objek template, perhatikan bahwa nama jenis templat harus konsisten dengan downloadtype
template = configure.gettemplate (downloadtype+". ftl"); Pada saat ini, file XML akan melaporkan kesalahan, dan tentu saja, tidak mungkin untuk menyusun dan menjalankan proyek. Anda perlu mengubah file .xml ke file .ftl untuk disimpan. Kemudian kompilasi dan jalankan, rendering:
Metode 2: POI
Saya mengalami banyak masalah versi menggunakan metode ini. Ini didasarkan pada POI3.7+Word2007, dan tes dapat berjalan dengan sempurna.
Anda perlu secara manual menghasilkan templat dokumen dengan Word2007 (menggunakan generasi lain akan menyebabkan kesalahan: file tidak dapat dibuka), dan mengganti konten yang perlu diperbarui secara dinamis dengan $ {}, mirip dengan yang di atas, tetapi Anda tidak perlu menyimpannya sebagai format dokumen XML.
/** * Kustomisasi metode xwpfdocument dan override createPicture () * @author joanna.yan * */kelas publik CustomXWPFDocument memperluas xwpfdocument {public CustomXWPFDocument (inputStream in) melempar ioException {super (in); } public CustomXWPFDocument () {super (); } public CustomXWPFDocument (OpcPackage PKG) melempar IoException {super (pkg); } public void createPicture (int id, int width, int tinggi, paragraf xwpfparagraph) {final int emu = 9525; lebar *= emu; tinggi *= emu; String blipid = ((poixmldocumentPart) getAllPictures (). Get (id)). GetPackagerelationShip (). GetId (); Ctinline inline = paragraf.createrun (). GetCtr (). AddNewDrawing (). AddNewInline (); String picxml = "" + "<a: grafik xmlns: a =/" http://schemas.openxmlformats.org/drawingml/2006/main/ ">" + "<a: graphicdata uri =/"http://schemas.openxmlformats.org/drawingml/2006/picture/"> " +" <pic: pic xmlns: pic =/"http://schemas.openxmlformats.org/drawingml/2006/" <pic: cnvpr id =/"" + id + "/" name =/"dihasilkan/"/> " +" <pic: cnvpicpr/> " +" </pic: nvpicpr> " +" <pic: blipfill> " +" <a: blip r: embed =/"" + blipid + " xmlns: r =/"http://schemas.openxmlformats.org/officedocument/2006/relationships/"/> " +" <a: stretch> " +" <a: ift/" +" </a: sppr: sppr: sppr: sppr: sppr: sppr: sppr: sppr: sppr: sppr: a: a: a: a: a: a: a: a: pic: a: a: a: a: a: a: a: a. x=/"0/" y=/"0/"/>" + " <a:ext cx=/"" + width + "/" cy=/"" + height + "/"/>" + " </a:xfrm>" + " <a:prstGeom prst=/"rect/">" + " <a:avLst/>" + " </a:prstGeom>" + " </pic:spPr>" + " </pic: pic> " +" </a: graphicdata> " +" </a: graphic> "; inline.addnewgraphic (). AddNewGraphicData (); Xmltoken xmltoken = null; coba {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); Ctpositifize2d tingkat = inline.addnewextent (); Extent.setcx (lebar); Extent.setcy (tinggi); Ctnonvisualdrawingprops docpr = inline.addnewDocpr (); docpr.setid (id); docpr.setname ("gambar"+id); docpr.setdescr ("tes"); }} /** * Cocok untuk Word 2007 * POI Versi 3.7 * @Author Joanna.yan * */kelas publik WordUtil {public static CustomXWPFDocument GenerAteWord (peta <String, Object> Param, String Template) {CustomXWPFDocument doc = null; coba {opcpackage pack = poixmldocument.openpackage (template); DOC = CustomXWPFDocument (Pack) baru; if (param! = null & ¶M.size ()> 0) {// Daftar paragraf pemrosesan <xwpfaragraph> paragraflist = doc.getParagraphs (); ProcessParagraphs (ParagraphList, param, doc); // pemrosesan tabel iterator <xwpftable> it = doc.goTablesIterator (); while (it.hasnext ()) {xwpftable tabel = it.next (); Daftar <Swpftablerow> ROWS = TABLE.GetRows (); untuk (xwpftablerow row: baris) {daftar <xwpftablecell> sel = row.gettableCells (); for (xwpftableCell cell: cell) {list <xwpfaragraph> paragraphlisttable = cell.getParagraphs (); ProcessParagraphs (ParagraphListtable, param, doc); }}}}}} catch (ioException e) {e.printstacktrace (); } return doc; } / ** * Proses paragraf * @param paragraflist * @param param * @param doc * / public static void prosesparagraphs (daftar <xwpfparagraph> paragraflist, peta <string, objek> param, customxwpfdocument doc) {if (paragraflist! = Null & ¶GraphaPhape. : paragraphList) {list <xwpfrun> runs = paragraph.getRuns (); untuk (xwpfrun run: runs) {string text = run.getText (0); if (text! = null) {boolean issetText = false; untuk (entri <string, objek> entri: param.entryset ()) {string key = entry.getKey (); if (text.indexof (key)! =-1) {isSetText = true; Nilai objek = entri.getValue (); if (value instanceof string) {// teks pengganti teks = text.replace (key, value.toString ()); } else if (value instance dari peta) {// gambar penggantian teks = text.replace (key, ""); Peta pic = (peta) nilai; int width = integer.parseint (pic.get ("width"). tostring ()); int height = integer.parseint (pic.get ("height"). tostring ()); int pictype = getPicTureType (pic.get ("type"). tostring ()); byte [] bytearray = (byte []) pic.get ("content"); BytearrayInputStream byteInputStream = bytearrayInputStream baru (bytearray); coba {int ind = doc.addpicture (byteInputStream, pictype); doc.createPicture (ind, lebar, tinggi, paragraf); } catch (InvalidFormatException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }}}}}} if (isSetText) {run.setText (teks, 0); }}}}}}}} / ** * Dapatkan kode tipe gambar yang sesuai sesuai dengan jenis gambar * @param pictype * @return * / public static int getPictureType (string pictype) {int res = customxwpfdocument.picture_type_pict; if (pictype! = null) {if (pictype.equalSignorecase ("png")) {res = customxwpfdocument.picture_type_png; } else if (pictype.equalSignorecase ("DIB")) {res = customxwpfdocument.picture_type_dib; } else if (pictype.equalSignorecase ("emf")) {res = customxwpfdocument.picture_type_emf; } else if (pictype.equalsignorecase ("jpg") || pictype.equalsignorecase ("jpeg")) {res = customxwpfdocument.picture_type_jpeg; } else if (pictype.equalSignorecase ("wmf")) {res = customxwpfdocument.picture_type_wmf; }} return res; }} kelas publik testpoi {public static void main (string [] args) melempar ioException {peta <string, object> param = new HashMap <string, object> (); param.put ("$ {name}", "joanna.yan"); param.put ("$ {examnum}", "00000000000001"); param.put ("$ {idCard}", "1111111111111111111111111111111); param.put ("$ {carmodel}", "c1"); CustomXWPFDocument doc = wordutil.generateWord (param, "d: //joanna.docx"); FileOutputStream fopts = new FileOutputStream ("d: //yan.docx"); doc.write (fopts); fopts.close (); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.