Ursprünglich wollten wir Dokumente auf der Android -Seite generieren (dies erfordert ...). Am Ende gibt es keine gute Methode, die für Android perfekt sein kann, und am Ende können wir nur zum Server wechseln. Verschwenden Sie es nicht, sondern erfassen Sie die Gründe, warum jedes Framework Android und ihre Eigenschaften nicht unterstützt. Es gibt immer noch viele solcher Frameworks mit Java, und einige sind nicht schlecht, aber leider unterstützen sie entweder Android nicht oder berechnen eine Gebühr und haben einen niedrigen Preis.
Nach persönlichen Tests können viele AWT -Pakete, die Java nicht unterstützen, nicht direkt auf Android verwendet werden. Freemarker ist ziemlich gut und kann komplexe und schöne Dokumente erzeugen, aber leider unterstützt es Android nicht. Es kann mit POI auf Android laufen, aber es hat viele Fallstricke aufgrund von Version, Format usw. durchlaufen, und es ist immer noch verstümmelt, um mit WFS zu öffnen. JWord und ASSOSE.Word kann perfekt unterstützt werden, und die JWord -Probezeit beträgt nur 30 Tage, beide Gebühren für beide. ITEXT hat keinen Test, aber es wird gesagt, dass es Android nicht unterstützt.
Methode 1: Freemarker
Diese Methode erfordert das manuelle Erstellen einer DOC -Vorlage (denken Sie daran, Platzhalter für das Bild zu verwenden) und als XML -Datei zu speichern. Generieren, indem der Inhalt dynamisch im spezifischen Tag $ {} ersetzt wird. Beispiel:
Nehmen wir zunächst die Renderings:
öffentliche Klasse docutil {public configuration configuration = null; public docutil () {configuration = new Configuration (configuration.version_2_3_22); configure.setDefaultCoding ("utf-8"); } /*** Wordendatei basierend auf DOC -Vorlage generieren* @param datamap Die Daten, die in der Vorlage ausgefüllt werden müssen // Setzen Sie die Methode und Pfad für Vorlagengeräte. Freemarker unterstützt mehrere Vorladungsmethoden. Sie können Servlet-, Klassenpfad- und Datenbankmontage neu laden. // laden Sie die Vorlagendatei und platzieren Sie sie in testdoc configure.setClassForforMPlateloading (this.getClass (), "/testDoc"); // Setzen Sie den Objektwrapper // configure.setObjectWrapper (new DefaultObjectWrapper ()); // Setzen Sie den Ausnahme -Handler configure.settemplateExceptionHandler (TemplateExceptionHandler.ignore_handler); // Definieren Sie das Vorlagenobjekt, beachten Sie, dass der Name des Vorlagenentyps mit der DownloadType -Vorlage = configure.getTemplate (DownloadType+". Xml") übereinstimmt. Datei outFile = neue Datei (SAREPADE); Schriftsteller out = null; out = new bufferedWriter (neuer Ausgangsstreamwriter (neuer FileOutputStream (Outfile), "UTF-8")); template.Process (Datamap, out); out.close (); } catch (ioException e) {e.printstacktrace (); } catch (templateException e) {e.printstacktrace (); }} public String getImastestern (String imgfile) {InputStream in = null; byte [] data = null; try {in = new FileInputStream (imgFile); Data = New Byte [in.Available ()]; in.read (Daten); in.close (); } catch (FilenotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } Base64EnenCoder Encoder = new Base64Encoder (); return cncoder.encode (Daten); }} public class testdoc {public static void main (String [] args) {docutil docutil = new docutil (); Karte <string, Object> datamap = new HashMap <String, Object> (); Datamap.put ("Name", "Joanna"); Datamap.put ("Prüf", "1111111111111111"); Datamap.put ("idCard", "2222222222222222222222222222222222222222222222222222222222222222222222222222222 2222222222222222222222222222222222222222222222222222222222222222222222222222; Datamap.put ("Carmodel", "C1"); docutil.getImastest ("d: //img//userimg1.png"); Datamap.put ("FirstExamscores", "0 Punkte, fehlgeschlagen"); datamap.put ("FirstPic2", docutil.getImastest ("d: //img//firstpic2.png"); Datamap.put ("SecondExamscores", "90 Punkte, Pass"); Datamap.put ("zweitgededUctItem", ""); Datamap.put ("Secondpic1", docutil.getImastest ("d: //img//secondpic1.png")); Datamap.put ("Secondpic2", docutil.getImastest ("d: //img//secondpic2.png")); Datamap.put ("Secondpic3", docutil.getImastest ("d: //img//secondpic3.png")); docutil.createdoc (Datamap, "basiert", "d: //yanqiong.doc"); }} Die XML -Datei ist zu lang, also werde ich sie nicht posten ...
Der Grund, warum Android nicht verwendet werden kann: http://stackoverflow.com/questions/25929542/use-freemarker-library-in-stroid
Zusätzliche Fragen zur dynamischen Anzeige von Listen und Zeilenpausen
Die Anforderung ist klar: Wenn ich im obigen Abzug Artikel mehrere Abzugsgegenstände habe, möchte ich, dass jeder Zeilenumbruch angezeigt wird.
Das Hinzufügen von Neuleitungen direkt zu dem zu angezeigten Inhalt hat keinen Einfluss und fungiert nicht als neue Linie.
Beim Hinzufügen von FTL -Tags wie <#List> </list> treten einige Probleme auf, die in der XML nicht erkannt werden, was dazu führt, dass das Projekt nicht ausgeführt werden kann.
lösen:
Fügen Sie Zeilenumbrüche in die Position hinzu, in der mehrere Abzugselemente angezeigt werden müssen:
<#List FirstdeductItem als FirstItem>
<w: t> $ {FirstItem} </w: t> <w: br/>
</#Liste>
Ändern Sie es in:
Liste <String> strs = new ArrayList <string> ();
STRS.ADD ("111111111111111111");
STRS.ADD ("22222222222222222222222222);
STRS.ADD ("3333333333333");
Datamap.put ("FirstDeductItem", strs);
Ändern Sie es in docutil.java:
// Definieren Sie das Vorlagenobjekt, beachten Sie, dass der Name des Vorlagenentyps mit dem DownloadType übereinstimmen sollte
template = configure.getTemplate (DownloadType+". ftl"); Zu diesem Zeitpunkt meldet die XML -Datei einen Fehler, und es ist natürlich unmöglich, das Projekt zu kompilieren und auszuführen. Sie müssen die .xml -Datei in .ftl -Datei zum Speichern ändern. Dann kompilieren und rennen, rendern:
Methode 2: Poi
Ich habe viele Versionsprobleme mit dieser Methode aufgetreten. Dies basiert auf POI3.7+WORD2007, und der Test kann perfekt laufen.
Sie müssen die Dokumentvorlage manuell mit WORD2007 generieren (mit anderen Generationen führt zu einem Fehler: Die Datei kann nicht geöffnet werden) und den Inhalt ersetzen, der dynamisch mit $ {} aktualisiert werden muss, ähnlich dem oben, aber Sie müssen es nicht als XML -Dokumentformat speichern.
/** * passen Sie XWPFDocument an und überschreiben Sie CreatePicture () -Methode * @author joanna.yan * */public Class CustomXWPFDocument erweitert XWPFDocument {public CustomXWPFDocument (InputStream in). } public CustomXWPFDocument () {Super (); } public CustomXWPFDocument (opcpackage pkg) löst IOException {Super (pkg) aus; } public void createPicture (int id, int width, int height, xwpfCragraph attraph) {endgültig int emu = 9525; Breite *= emu; Höhe *= emu; String blipid = ((poixmldocumentPart) getAllpictures (). Get (id)). GetPackagerelationship (). GetId (); Ctinline inline = Absatz.Createrun (). GetCtr (). AddNewDrawing (). String picxml = "" + "<a: grafische 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/picture/"> " <pic: cnvpr id =/"" + id + "/" name =/"generiert/"/> " +" <pic: cnvpicpr/> " +" </pic: nvpicpr> " +" <pic: blopfill> " +" <a: bLip r: eingebed =/" + blipid +"/"" xmlns:r=/"http://schemas.openxmlformats.org/officeDocument/2006/relationships/"/>" + " <a:stretch>" + " <a:fillRect/>" + " </a:stretch>" + " </pic:blipFill>" + " <pic:spPr>" + " <a:xfrm>" + " <a:off x =/"0/" y =/"0/"/> " +" <a: ext cx =/"" + width + "/" cy =/"" + Höhe + "/"/> " +" </a: xfrm> " +" <a: prstgeom prst =/"rect/"> " +" <a: sppa: </pic: pic> " +" </a: graphicData> " +" </a: grafik> "; inline.addNewgraphic (). addnewgraphicData (); Xmltoken xmlToken = null; try {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 exctent = inline.addneWextent (); Expect.SetCX (Breite); Ausdehnung.Setcy (Höhe); CtnonvisualDrawingProps docpr = inline.addNewdocpr (); docpr.setid (id); docpr.setName ("Bild"+id); docpr.setDescr ("test"); }} /** * Geeignet für Word 2007 * POI Version 3.7 * @Author joanna.yan * */public class Wordutil {public static CustomXWPFDocument GenerateWord (MAP <String, Objekt> Param, String -Vorlage) {Customxwpfdocument doc = null; try {opcpackage pack = poixmldocument.openpackage (Vorlage); doc = new CustomXWPFDocument (Pack); if (param! processCragraphs (Absatzliste, Param, doc); // Verarbeitungstabelle Iterator <xWPFTable> iT = doc.gettableSiterator (); while (it.hasnext ()) {xwpftable table = it.Next (); Liste <xwpftablerow> rows = table.getrows (); für (xwpftablerow row: Zeilen) {list <xwpftableCell> cells = row.gettableCells (); für (xwpftableCell cell: cells) {list <xWPFPrAGRAPH> paragraphListTable = cell.getSparagraphs (); processCragraphs (Absatzlisttable, Param, doc); }}}}}} catch (ioException e) {e.printstacktrace (); } return doc; } / ** * Absatzprozess * @param paragraphList * @param param * @param doc * / public static void processParagraphs (Liste <xwpfParagraPraph> Abschnittliste, MAP <String> Param, CustomXwpfdocument doc) {if (Abschnittsablistung! Absatzliste) {list <xwpfrun> runs = attraph.getruns (); für (xwpfrun run: runs) {string text = run.getText (0); if (text! = null) {boolean issettext = false; für (Eintrag <String, Objekt> Eintrag: param.EntrySet ()) {String key = Eintrag.getKey (); if (text.indexof (key)! =-1) {issettext = true; Object value = Eintrag.getValue (); if (value Instanceof String) {// Text Ersatz text = text.replace (Schlüssel, value.toString ()); } else if (value Instanceof map) {// Bildersatz Text = text.replace (Schlüssel, ""); Karte pic = (Karte) Wert; int width = integer.parseInt (pic.get ("width"). toString ()); int height = Integer.ParseInt (pic.get ("Höhe"). toString ()); int pictype = getPicturetype (pic.get ("type"). toString ()); byte [] bytearray = (byte []) pic.get ("content"); BytearrayInputStream byteinputStream = new bytearrayInputStream (Bytearray); try {int ind = doc.addpicture (byteinputStream, pictype); doc.CreatePicture (Ind, Breite, Höhe, Absatz); } catch (InvalyFormatexception e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }}}}}} if (issettext) {run.setText (text, 0); }}}}}}}} / ** * den entsprechenden Bildtypcode gemäß dem Bildtyp * @param pictype * @return * / public static int getPictUrType (String pictype) {int res = customxwpfdocument.picture_type_pict; if (pictype! } 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; }} public class testpoi {public static void main (String [] args) löst IOException {map <String, Objekt> param = new Hashmap <String, Object> () aus; param.put ("$ {name}", "joanna.yan"); param.put ("$ {prüfum}", "00000000000001"); param.put ("$ {idcard}", "1111111111111111111111111111"); param.put ("$ {carmodel}", "c1"); CustomXWPFDocument doc = WordUtil.GenerateWord (Param, "d: //joanna.docx"); FileOutputStream fopts = new FileOutputStream ("d: //yan.docx"); doc.write (fopts); fopts.close (); }}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.