1. الخلفية
Apache POI هي واجهة برمجة تطبيقات Java التي تقوم بإنشاء وتحافظ على مختلف واجهات برمجة تطبيقات Java التي تتوافق مع Office Open Open XML (OOXML) وتنسيق مستند Microsoft OLE 2 (OLE2). يمكن استخدامه لقراءة وإنشاء وتعديل ملفات MS Excel باستخدام Java. علاوة على ذلك ، يمكنك أيضًا استخدام Java لقراءة وإنشاء ملفات MS Word و MspowerPoint. يوفر Apache POI حل Java Excel Solution (لـ Excel97-2008).
قم بإنشاء ملف Excel المقابل بناءً على ملف JSON بالتنسيق المحدد. المتطلبات كما يلي
2. معاينة التأثير
3. تنسيق البيانات
نظرًا لأنها هي إنشاء ملفات Excel ، فإن القيمة هنا تتطلع إلى إنشاء ملف Excel بتنسيق XLSX. يعتبر رأس البيانات متعدد الطاولة لاستخدام | بشكل افتراضي ، ولا يستخدم Colspan Rowspan. إذا كنت بحاجة إلى تمثيل عمودين وصفين ، فإن تنسيق رأس دمج العمود الأول هو: a | b ، a | c table is
| أ | |
| ب | ج |
تقوم الواجهة الأمامية ببناء البيانات المراد إنشاؤها كملف JSON الذي يلبي المتطلبات ويخضع وخلفية من خلال post. حدد تنسيق JSON وفقًا للمتطلبات المذكورة أعلاه على النحو التالي
{"savename": "إنشاء اسم ملف excel "#ff0000" ، // font color "name": "Microsoft elegant Black" ، // font name "height": 20 // size} ، أسفل المركز "BorderColor": "" ، // تعيين لون الحدود مثل #ff0000 "bgcolor": "" // set cell fill color}}] ، "sheets": [{"sheetname": "" "، // sheet name": [] معلومات الرأس "بيانات": [] ، // معلومات البيانات "datamerge": [] ، // معلومات دمج البيانات "قدم": [] ، // معلومات نهاية الجدول "footmerge": [] ، // end end information معلومات "img": [] // معلومات الصورة ، تحتاج إلى تحويل الصورة إلى base64}]}}}وصف موجز
تنسيق كائن JSON في صفيف الرأس هو
{"الاسم": "A | B" ، // اسم رأس الجدول ، استخدام رأس متعدد الطاولة | لتقسيم "النوع": "str" ، // نوع بيانات العمود هذا str num ، يعد التاريخ أيضًا نوعًا رقميًا في Excel ، ويتم عرضه كتنسيق تاريخ "الحقل": "f_field1" ، // الحقول البديلة ، لا يمكنك استخدام "النمط": {// بيانات العمود هذه هي نمط العمود الافتراضي ، أو يمكن أن تكون كائنًا للأسلوب ، أو قيمة الهوية المحددة في orbertyles. في قدم بيانات عنوان الصفيف ، يمكن أن تكون البيانات الموجودة في القائمة قيمة منفصلة مثل 1 أو "A" أو كائن ، عندما يكون كائنًا ، يكون التنسيق
{"value": "" ، // القيمة المحددة للنوع "النوع": "" ، // نوع الخلية ، أو النمط الافتراضي Str ": {} // يمكن أن يكون نمط الخلية كائنًا نمطًا ، أو قيمة المعرف المحددة في usertyles. إذا لم يتم تعيينه ، فإن الرأس هو النمط المقابل لهذا العمود افتراضيًا} تعد قيم Titlemerge و Datamerge و Footmerge سلاسل مفصولة بفاصلة ، مما يعني "START ROW ، RED ROW ، AND AND COMMONAL ، AND COLUME" ، ويبدأ الفهرس من 0.
القيمة في صفيف IMG هي كائن ، تنسيق
{"col": 1 ، // The Picture START COLUME "ROW": 0 ، // The START ROW "Colspan": 1 ، // تمتد العمود ، والقيمة الدنيا هي 1 "Rowspan": 2 ، // ROW SPANS ، الحد الأدنى للقيمة هي 1 "بيانات": "// base64 بيانات الصورة مثل:" data/png ؛ base64 ، 4. التنفيذ الرئيسي
ملفات Excel بعد 07 هي في الواقع حزمة مضغوطة ، مع كون كل ورقة ملف XML ، والأناقة كونها ملف XML ، وهي الصورة هي ملف الصورة المقابل ، ويتم وضعه في مجلد الوسائط ، وبالتالي فإن فكرة الكود هي
بوابة الوظيفة هي كما يلي
Overridepublic void buildoutoutputStream () يلقي fileProducerexception {// Process Sheets JSON json = this.jsondata.getjsonarray (this.sheets) ؛ iterator <Object> sheetiter = sheets.iterator () ؛ if (sheets.isempty ()) {this.responsedata.seterrcode (1001) ؛ this.responsedata.setsuccess (false) ؛ this.responsedata.seterrmsg ("لا يمكن إنشاء بيانات") this.jsondata.getjsonarray (this.userstyles) ؛ this.inituserstyles (userStyles) ؛ this.initDefaultheAdstyle () ؛ XSSFSheet WS ؛ ورقة jsonobject ؛ jsonarray sheetdata ؛ Jsonarray Sheettitle ؛ Jsonarray Sheethead ؛ jsonarray sheetfoot ؛ jsonarray sheetimgs ؛ string sheetname ؛ int sheetIndex = 0 ؛ بينما (sheetiter.hasnext ()) {sheet = (jsonoBject) sheetiter.next () ؛ // احصل على sheetname sheetname = sheet.getString (this.sheet_name) ؛ ws = wb.createshet () sheetname) ؛} int sheetrowIndex = 0 ؛ sheettitle = sheet.getjsonarray (this.sheet_title) ؛ this.setmergecells (WS ، sheet.getjsonarray (this.sheet_title_merge) ، sheetrowIndex) ؛ sheetrowIndex = this.createrandom (WS ، Sheettitle ، sheetrowIndex) ؛ sheethead = sheet.getjsonarray (this.sheet_head) ؛ SeTrowIndex = this.createheadcolumn (WS ، Sheethead ، sheetrowIndex) ؛ this.setmergeCells (WS ، sheet.getjsonarray (this.sheet_data_merge) ، sheetrowIndex) ؛ sheetdata = sheet.getjsonarray (this.sheet_data) ؛ sheetrowindex = this.createdata (WS ، sheetdata ، sheetrowindex) ؛ sheetfoot = sheet.getjsonarray (this.sheet_foot) ؛ this.setmergecells (WS ، sheet.getjsonarray (this.sheet_foot_merge) ، sheetrowIndex) ؛ sheetrowIndex = this.createrandom (WS ، sheetfoot ، sheetrowindex) ؛ sheetimgs = sheet.getjsonarray (this.sheet_img) ؛ this.setSheetImages (WS ، sheetimgs) ؛} // دفق إخراج الإرجاع حاول {bytearrayoutputStream OS = جديد bytearrayoutputstream () ؛ wb.write (OS) ؛ this.outstreams.add (os) ؛} catch (ioException e) {رمي fileProducerexception (e.getMessage () ، e.getCause ()) ؛}}توليد كائنات نمط الخلية ، بما في ذلك محاذاة خلفية الحدود الخطية
خاص XSSfCellStyle CreateCellStyle (jsonobject style) {xssfcellstyle cellstyle = wb.createcellstyle () ؛ // set font jsonobject font = style.getjsonobject (this.style_font) ؛ {cellstyle.setfont (Excelfont) ؛} // التوحيد الأسود cellstyle.setBorderBottom (BordersTyle.thin) ؛ cellstyle.setbordertop (BordersTyle.thin) ؛ cellstyle.setbordleft (Borderstyle.thin) ؛ cellstyle.setBorderRight (BordersTyle.thin) ؛ String BorderColor = style.getString (this.border_color) ؛ if (stringUtils.isNotBlank (borderColor)) {xssfcolor xfbordercolor = new xssfcolor xfbordercolor) ؛ cellstyle.setBorderColor (borderside.top ، xfbordercolor) ؛ cellstyle.setBorderColor (borderside.left ، style.getString (this.background_color) ؛ if (stringUtils.isNotBlank (bgColor)) {xssfcolor cellbgcolor = new xssfcolor (لون جديد (integer.parseint (bgcolor.substring (1) ، 16))) (stringUtils.isnotblank (halignment)) cellstyle.setalignment (horizontalalignment.valueof (halignment.touppercase ())) ؛ string valignment = style.getString (this.valignment) ؛ if (stringUtils.isnotblank (valignment)) cellstyle.setverticalIngenment (verticalalignment.valueof (valignment.touppercase ())) ؛ // format string fmt = style.getString (this.fmtstring) ؛ if (stringUtils.isnotblank (FMT)) cellStyle.setDataformat (wb.createdataformat (). getFormat (fmt)) ؛إنشاء أنماط الخط
الخط الخاص createfont (jsonobject fontcfg) {if (fontcfg == null) return null ؛ xssffont font = wb.createfont () ؛ font.setfontname (fontcfg.getString (this.font_name)) ؛ null) font.setBold (fontboole.booleanvalue ()) ؛ fontboole = fontcfg.getBoolean (this.font_italic) ؛ if (fontboole! = null) font.setitalic (fontboole.booleanvalue () ؛ (fontboole! = null && fontboole.booleanvalue () == true) font.setunderline (fontunderline.single.getbytevalue ()) ؛ fontheight قصيرة = fontcfg.getshort (this.font_height) ؛ if (fontheight! = null) fontcfg.getString (this.font_color) ؛ if (colorstr! = null) {font.setColor (new xssfcolor (new color (integer.parseint (colorstr.substring (1) ، 16)))) ؛}لمعالجة رؤوس الجدول ، تتم معالجة الكثير من رؤوس الجدول ، و | يتم استخدام طريقة التجزئة. طول الرأس هو بيانات العمود. هناك عدة | بالاسم ، وستعرف عدد الصفوف الموجودة في الرأس. لذلك ، هناك عدة خطوات لمعالجة الرأس
int int int intheadcolumn (xssfsheet ws ، jsonarray sheethead ، int sheetrowIndex) {if (sheethead == null) return sheetrowIndex ؛ iterator <Object> headiterator = sheethead.iterator () ؛ jsonobject curhead = null ؛ int colindex = 0 ؛ objectyle = null ؛ String [colsize] ؛ headcellstylekeys = new string [colsize] ؛ int [] headCollevel = new int [colsize] ؛ string colname = null ؛ string [] colnameary = null ؛ int maxlevel = 0 ؛ int collevel = 0 ؛ ArrayList <ArrayList <string >> () ؛ بينما (headiter.hasnext ()) {curhead = (jsonobject) headiter.next () ؛ {headcellstylekeys [colindex] = this.columnstyle_prev+ colindex ؛ this.userstyles.put (headcellstylekeys [colindex] ، this.createCellStyle ((jsonobject) colstyle)) ؛} آخر (this.userstyles.containskey (colstyle)) {headcellstylekeys [colindex] = (curhead.containskey (this.column_width)) {ws.setDefaultColumnWidth (pixtoexcelwdith (curhead.getintvalue (this.column_width))) curhead.getString (this.column_type) ؛} آخر {headtypes [colindex] = this.celltypestring ؛} // التعامل مع رأس multi-table colname = curhead.getString (this.column_name) ؛ colnameary = colname.split ("// | collevel ؛ if (collevel> maxlevel) {maxlevel = collevel ؛} لـ (int i = 0 ؛ i <collevel ؛ ws.getRow (seTrowIndex + i) ؛ if (row == null) {row = ws.createRow (sheetrowIndex+i) ؛} headcell = row.createcell (colindex) ؛ headcell.setCellValue (colnameary [i]) ؛ headcell.setCellStyle (this.userstyles.get (this.headstyle_key)) ؛ iterator <arraylist <string >> a = headvaluelist.iterator () ؛ jsonarray headmerge = new jsonarray () ؛ string prev = "" "" ؛ ColumnInfo = A.Next () ؛ // فقط في العمود الثالث ، يمكننا معرفة ما إذا كان يتم دمج العمود الأول والثاني. columnInfo.add ("") ؛ iterator <string> b = columninfo.iterator () ؛ xssfcell lastrowcell = null ؛ بينما (b.hasnext ()) {current = (prev.equalsignoreCase (current) && lrowIndex == 0) {ws.getRow (seetrowIndex+lrowindex) .getCell (startCol) .setCelltype (cell.cell_type_blank) ؛ mergecol ++ ؛ StringUtils.isblank (lastrowCell.getStringCellValue ()))) {ws.getRow (sheetrowIndex+lrowIndex) .getCell (startCol) .setCellType (cell.cell_type_blank) ؛ mergecol ++ ؛ {headmerge.add (string.format ("٪ d ، ٪ d ، ٪ d ، ٪ d" ، lrowindex ، lrowindex ، startCol - mergecol - 1 ، startCol - 1)) ؛ mergecol = 0 ؛}} startCol ++ ؛ (HeadCollevel [i] <maxLevel) {// columer merge موجود headmerge.add (string.format ("٪ d ، ٪ d ، ٪ d ، ٪ d" ، headcollevel [i] - 1 ، maxlevel - 1 ، i ، i)) ؛ r). createcell (i) .setCellStyle (this.userstyles.get (this.headstyle_key)) ؛}}} this.setmergecells (WS ، headmerge ، sheetrowindex) ؛ إرجاع sheetrowindex + maxlevel ؛}أضف الصور ، وتستخدم نقاط الخلايا افتراضيًا ، ويتم إصلاح الصورة داخل منطقة الخلية المحددة.
private void addimg (xssfsheet ws ، jsonobject img ، xssfcreationHelper chelper) {string imgbase64 = img.getString (this.sheet_img_data) ؛ if (stringutils.isblank (imgbase64)) imgbase64.split ("،") ؛ system.out.println (imgary [0]) ؛ byte [] imgbyte = base64.decodebase64 (imgary [1]) ؛ int imgidx = wb.addpicture (imgbyte ، workbook.picture_type_jpeg) ؛ ws.createdRawingPatriarch () ؛ xssfclientanchor مرساة = chelper.createClientanchor () ؛ int col = img.getIntvalue (this.sheet_img_col) ؛ int raw = img.getintvalue (this.sheet_row) ؛ anchorcol1 (col) ؛ = drawimg.createpicture (مرساة ، imgidx) ؛ integer colspan = img.getInteger (this.sheet_img_colspan) ؛ if (colspan == null) colspan = 1 ؛ integer rowspan = img.getinteger (this.sheet_img_rowspan) ؛ 1 ؛ Pict.Resize (Colspan ، Rowspan) ؛} 5. ملخص
هذه المرة ، أنشأت ملف Excel على الطراز الغني عن طريق تمرير كائنات JSON ، وأنا أكثر دراية بمستندات Office Office POI. بالمقارنة مع مستندات التحليل ، فإن تنسيق الملف ليس ضروريًا للنظر عند توليده ، مثل: متوافق مع تنسيق 2003 ، ويتم النظر في تحليل ساكس كبير. بالمقارنة مع الجيل الأمامي JS من ملفات Excel ، تتم زيادة إمكانية المعالجة الثانوية للملفات التي تم إنشاؤها ، لذلك في المدخل الوظيفي ، يتم اعتماد طريقة توليد التدفقات الثنائية. بعد إنشاء الملف ، يمكنك متابعة إرسال رسائل البريد الإلكتروني وتحميل FTP والعمليات الأخرى.
ملاحظات رئيسية
حسنًا ، ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.