في الأصل ، أردنا إنشاء مستندات على جانب Android (هذا يتطلب ...). في النهاية ، لا توجد طريقة جيدة يمكن أن تكون مثالية على Android ، وفي النهاية ، لا يمكننا الانتقال إلا إلى الخادم. لا تضيعها ، ولكن سجل الأسباب التي تجعل كل إطار لا يدعم Android وخصائصها. لا يزال هناك العديد من هذه الأطر المتعلقة بـ Java ، وبعضها ليس سيئًا ، لكن للأسف ، لا يدعمون Android ، أو يتقاضون رسومًا مقابل رسوم منخفضة.
بعد الاختبار الشخصي ، لا يمكن استخدام العديد من حزم AWT التي لا تدعم Java مباشرة على Android. يعد FreeMarker جيدًا جدًا ويمكنه إنشاء مستندات معقدة وجميلة ، ولكن للأسف لا يدعم Android. يمكن أن يعمل على Android باستخدام POI ، لكنه مر بالعديد من المزالق على طول الطريق بسبب الإصدار والتنسيق وما إلى ذلك ، ولا يزال مشوهًا مع WFS. يمكن دعم jword و aspose.word بشكل مثالي ، وتبلغ فترة الاختبار Jword 30 يومًا فقط ، وكلاهما رسوم لكليهما. لا يوجد اختبار ، ولكن يقال إنه لا يدعم Android.
الطريقة 1: علامة تجزئة
تتطلب هذه الطريقة إنشاء قالب مستند يدويًا (تذكر استخدام العناصر النائبة للصورة) وحفظه كملف XML. إنشاء عن طريق استبدال المحتوى ديناميكيًا في العلامة المحددة $ {}. مثال:
أولاً ، دعنا نأخذ الاداءات:
الفئة العامة docutil {تكوين التكوين العام = null ؛ Docutil () {configuration = التكوين الجديد (configuration.version_2_3_22) ؛ config.setDefaultEncoding ("UTF-8") ؛ } /*** إنشاء ملف Word استنادًا إلى قالب المستند* param datamap البيانات التي يجب ملؤها في القالب* param downloadtype name* param savepath save path* /public void createdoC (map <string ، object> datamap ، stringtytype ، string savepath) // قم بتعيين طريقة جهاز القالب والمسار ، يدعم Freemarker طرق تحميل القالب المتعددة. يمكنك إعادة تحميل Servlet و ClassPath و Database Mount. // قم بتحميل ملف القالب ووضعه ضمن testDoc config.setClassFortEmplateLoading (this.getClass () ، "/testDoc") ؛ // قم بتعيين WONBOR WRAPPER // config.setObjectWrapper (defaultObjectWrapper ()) ؛ // قم بتعيين معالج الاستثناء config.settemplateExceptionHandler (templateExceptionHandler.ignore_handler) ؛ // تحديد كائن القالب ، لاحظ أن اسم نوع القالب يجب أن يكون متسقًا مع قالب تنزيل = configr.getTemplate (تنزيل+". xml") ؛ ملف outfile = ملف جديد (SavePath) ؛ الكاتب خارج = فارغ ؛ Out = جديد BufferedWriter (New OutputStreamWriter (FileOutputStream جديد (OutFile) ، "UTF-8")) ؛ template.process (datamap ، out) ؛ out.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } catch (templateException e) {E.PrintStackTrace () ؛ }} السلسلة العامة getImageSt (سلسلة imgfile) {inputStream in = null ؛ بايت [] البيانات = فارغة ؛ حاول {في = جديد fileInputStream (imgfile) ؛ Data = new byte [in.availiverse ()] ؛ in.read (البيانات) ؛ in.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } BASE64ENCODER ENCODER = NEW BASE64ENCODER () ؛ إرجاع Encoder.encode (البيانات) ؛ }} الفئة العامة testDoc {public static void main (string [] args) {docutil docutil = new docutil () ؛ خريطة <string ، object> datamap = new hashmap <string ، Object> () ؛ datamap.put ("name" ، "Joanna") ؛ Datamap.put ("examnum" ، "1111111111111") ؛ datamap.put ("idcard" ، "22222222222222222222222222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222222222222222222222222222 ؛ 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 ("SecondExamscores" ، "90 نقطة ، تمرير") ؛ datamap.put ("SecondDeductItem" ، "") ؛ datamap.put ("secondpic1" ، docutil.getImagester ("d: //img//secondpic1.png") ؛ datamap.put ("secondpic2" ، docutil.getImagester ("d: //img//secondpic2.png")) ؛ datamap.put ("secondpic3" ، docutil.getImagester ("d: //img//secondpic3.png")) ؛ docutil.createdoc (datamap ، "riptoc" ، "d: //yanqiong.doc") ؛ }} ملف XML طويل جدًا ، لذلك لن أنشره ...
أخيرًا ، السبب في عدم استخدام Android: http://stackoverflow.com/questions/25929542/use-freemarker-library-
أسئلة إضافية حول العرض الديناميكي للقوائم وفواصل الأسطر
المتطلب واضح: في عنصر الخصم أعلاه ، إذا كان لدي العديد من عناصر الخصم ، فأريد عرض كل سطر.
إن إضافة الخطوط الجديدة مباشرة إلى المحتوى المراد عرضه ليس له أي تأثير ولن يعمل كخط جديد.
عند إضافة علامات FTL ، مثل <#list> </list> ، ستنشأ بعض المشكلات ، والتي لم يتم التعرف عليها في XML ، مما يؤدي إلى عدم قدرة المشروع على التشغيل.
يحل:
أضف وإضافة فواصل سطر إلى الموضع حيث يجب عرض عناصر خصم متعددة:
<#list firstductitem as firstItem>
<w: t> $ {firstItem} </w: t> <w: br/>
</#list>
تغييره إلى:
قائمة <Tring> strs = new ArrayList <Tring> () ؛
Strs.add ("11111111111111111") ؛
Strs.add ("222222222222222222222222) ؛
strs.add ("3333333333333") ؛
datamap.put ("FirstDeductItem" ، Strs) ؛
قم بتغييره إلى docutil.java:
// حدد كائن القالب ، لاحظ أن اسم نوع القالب يجب أن يكون متسقًا مع نوع التنزيل
template = config.getTemplate (downloadType+". ftl") ؛ في هذا الوقت ، سيقوم ملف XML بالإبلاغ عن خطأ ، وبالطبع ، من المستحيل تجميع المشروع وتشغيله. تحتاج إلى تغيير ملف .xml إلى ملف .ftl لحفظه. ثم تجميع وتشغيل ، الاداءات:
الطريقة 2: POI
واجهت العديد من مشاكل الإصدار باستخدام هذه الطريقة. يعتمد هذا على POI3.7+Word2007 ، ويمكن أن يعمل الاختبار تمامًا.
تحتاج إلى إنشاء قالب المستند يدويًا باستخدام Word2007 (باستخدام الأجيال الأخرى سيؤدي إلى خطأ: لا يمكن فتح الملف) ، واستبدال المحتوى الذي يجب تحديثه ديناميكيًا بـ $ {} ، على غرار ما سبق ، لكن لا تحتاج إلى حفظه كتنسيق مستند XML.
/** * تخصيص xwpfdocument وتجاوز طريقة createpicture () * Author Joanna.yan * */class custom customxwpfdocument يمتد xwpfdocument {public customxwpfdocument (inputStream in) ioException {in) ؛ } public customxwpfdocument () {super () ؛ } public customxwpfdocument (opCpackage PKG) يلقي ioException {super (pkg) ؛ } public void createPicture (int id ، عرض int ، ارتفاع int ، فقرة xwpfparagraph) {final int emu = 9525 ؛ العرض *= EMU ؛ الارتفاع *= EMU ؛ String blipid = ((poixmldocumentpart) getAllPictures (). get (id)). getPackagerelationship (). getId () ؛ ctinline inline = paragraph.createrun (). getCtr (). addNewDrawing (). addNewInline () ؛ String PICXML = "" + "<A: Graphic Xmlns: a =/" http://schemas.openxmlformats.org/drawingml/2006/main/ " uri =/"http://schemas.openxmlformats.org/drawingml/2006/picture/"> " +" <pic: pic xmlns: pic =/"http://schemas.openxmlformats.org/drawingml/2006/picture/" <pic: cnvpr id =/"" + id + "/" name =/"endered/"/> " +" <pic: cnvpicpr/> " +" </pic: nvpicpr> " +" <pic: blipfill> + "<a: blip r: inmed =/" " + blipid +"/" xmlns: r =/"http://schemas.openxmlformats.org/officedocument/2006/relationships/"/> " +" <a: stretch> " +" <a: fillrect/> " +" </a: stretch> x =/"0/" y =/"0/"/"/>" + "<a: ext cx =/" " + width +"/"cy =/" " + height +"/"/"/> " +" </a: xfrm> </c. 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) ؛ ctpositivesizeize2d extent = inline.addnewextent () ؛ extent.setcx (العرض) ؛ extent.setcy (الارتفاع) ؛ ctnonvisualdrawingprops docpr = inline.addnewDocpr () ؛ docpr.setid (id) ؛ Docpr.setName ("Image"+id) ؛ docpr.setdescr ("اختبار") ؛ }} /** * مناسبة لكلمة 2007 * POI الإصدار 3.7 * Author Joanna.yan * */public Class WordUtil {public static customxwpfdocument generate (map <string ، object> param ، string template) {customxwpfdocument doc = null ؛ حاول {opcpackage pack = poixmldocument.openpackage (قالب) ؛ DOC = جديد customxwpfdocument (pack) ؛ if (param! = null & ¶m.size ()> 0) {// معالجة قائمة الفقرة <xwpfparagraph> paragraphlist = doc.getParaphs () ؛ ProcessParraphs (Paragraphlist ، param ، doc) ؛ // معالجة جدول ITerator <Swpftable> it = doc.getTablesIrator () ؛ بينما (it.hasnext ()) {xwpftable table = it.next () ؛ قائمة <xwpftablerow> صفوف = table.getRows () ؛ لـ (XWPFTABLEROW ROW: ROWS) {list <xwpftableCell> cells = row.getTableCells () ؛ لـ (xwpftableCell Cell: Cells) {list <xwpfparagraph> paragraphlisttable = cell.getParaphs () ؛ ProcessParraphs (paragraphlisttable ، param ، doc) ؛ }}}}}} catch (ioException e) {E.PrintStackTrace () ؛ } مستند الإرجاع ؛ } / ** * Process Paragraph * param paragraphlist * param param * param doc * / public static void processParraphs (list <xwpfparagraph> paragraphlist ، map <string ، object> param ، customxwpfdocument doc) {if (paragraphlist! paragraphlist) {list <xwpfrun> تشغيل = paragraph.getRuns () ؛ لـ (XWPFRUN RUN: Runs) {String text = run.getText (0) ؛ if (text! = null) {boolean issettext = false ؛ لـ (إدخال <string ، Object> intpl: param.entryset ()) {string key = interpl.getKey () ؛ if (text.indexof (key)! =-1) {issettext = true ؛ قيمة الكائن = interptvalue () ؛ if (value etternof string) {// text replacement text = text.replace (key ، value.toString ()) ؛ } آخر إذا (value eastyof map) {// picture replacement text = text.replace (key ، "") ؛ خريطة الموافقة المسبقة عن علم = (خريطة) قيمة ؛ int width = integer.parseint (pic.get ("width"). toString ()) ؛ ارتفاع int = integer.parseint (pic.get ("الارتفاع"). toString ()) ؛ int pictype = getPictUreType (pic.get ("type"). toString ()) ؛ byte [] bytearray = (byte []) pic.get ("content") ؛ bytearrayinputstream byteinputStream = جديد bytearrayinputStream (bytearray) ؛ حاول {int ind = doc.addpicture (byteinputStream ، pictype) ؛ Doc. CreatePicture (IND ، العرض ، الارتفاع ، الفقرة) ؛ } catch (invalidformatexception e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}}}} if (issettext) {run.settext (text ، 0) ؛ }}}}} ستر if (pictype! = null) {if (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 ؛ }} الفئة العامة testpoi {public static void main (string [] args) يلقي ioException {map <string ، object> param = new hashmap <string ، object> () ؛ param.put ("$ {name}" ، "joanna.yan") ؛ param.put ("$ {examnum}" ، "00000000000001") ؛ param.put ("$ {idcard}" ، "111111111111111111111111111") ؛ 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 أكثر.