1. พื้นหลัง
Apache Poi เป็น Java API ที่สร้างและรักษา Java APIs ต่าง ๆ ที่สอดคล้องกับมาตรฐาน Office Open XML (OOXML) และรูปแบบเอกสารคอมโพสิต OLE 2 ของ Microsoft (OLE2) สามารถใช้ในการอ่านและสร้างและแก้ไขไฟล์ MS Excel โดยใช้ Java นอกจากนี้คุณยังสามารถใช้ Java เพื่ออ่านและสร้างไฟล์ MS Word และ MspowerPoint Apache Poi ให้บริการโซลูชันการทำงานของ Java (สำหรับ Excel97-2008)
สร้างไฟล์ Excel ที่เกี่ยวข้องตามไฟล์ JSON ในรูปแบบที่ระบุ ข้อกำหนดมีดังนี้
2. ดูตัวอย่างของเอฟเฟกต์
3. รูปแบบข้อมูล
เนื่องจากเป็นการสร้างไฟล์ Excel ค่าที่นี่จะพิจารณาการสร้างไฟล์ Excel ในรูปแบบ XLSX ส่วนหัวแบบหลายตารางข้อมูลถือว่าใช้ | โดยค่าเริ่มต้นและ Colspan rowspan ไม่ได้ใช้เป็น หากคุณต้องการแสดงสองคอลัมน์และสองแถวรูปแบบส่วนหัวของคอลัมน์แรกคือ: a | b, a | c ตารางที่สร้างขึ้นคือ
| อัน | |
| ข | C |
ส่วนหน้าสร้างข้อมูลที่จะสร้างเป็นไฟล์ JSON ที่ตรงตามข้อกำหนดและการส่งและพื้นหลังผ่านการโพสต์ กำหนดรูปแบบ JSON ตามข้อกำหนดข้างต้นดังนี้
{"savename": "สร้างชื่อไฟล์ excel name.xlsx", "userstyles": [{"id": "1", // ไม่มีการทำซ้ำที่คุณต้องตั้งค่าสไตล์เซลล์คุณสามารถกำหนดสไตล์ให้กับค่านี้ได้โดยตรง "#ff0000", // ฟอนต์สี "ชื่อ": "Microsoft Elegant Black", // ชื่อตัวอักษร "ความสูง": 20 // size}, "fmtstr": "", // รูปแบบเซลล์,#, ## 0.00 _);#, ## 0.00; ด้านล่าง "BorderColor": "", // ตั้งค่าสีชายแดนเช่น #ff0000 "bgcolor": "" // ตั้งค่าเซลล์เติมสี}}}], "แผ่น": [{"sheetname": "", // ชื่อชื่อ ": [] // ข้อมูลส่วนหัวของตาราง "data": [], // ข้อมูลข้อมูล "dataMerge": [], // ข้อมูลผสานข้อมูล "เท้า": [], // ข้อมูลปลายตารางข้อมูล "footmerge": [], // table End ข้อมูลผสาน "IMG": [] // ข้อมูลรูปภาพคำอธิบายสั้น ๆ
รูปแบบวัตถุ JSON ในอาร์เรย์หัวคือ
{"ชื่อ": "a | b", // ชื่อส่วนหัวของตาราง, ส่วนหัวแบบหลายตารางการใช้ | ในการแยก "type": "str", // คอลัมน์ประเภทข้อมูลประเภท str, วันที่ยังเป็นประเภทตัวเลขใน excel และแสดงเป็นรูปแบบวันที่ "ฟิลด์": "f_field1", // ฟิลด์ทางเลือกคุณไม่สามารถใช้ "สไตล์": {// ข้อมูลคอลัมน์นี้เป็นคอลัมน์เริ่มต้น ในเท้าข้อมูลชื่ออาร์เรย์ข้อมูลในรายการอาจเป็นค่าแยกต่างหากเช่น 1, "a" หรือวัตถุเมื่อมันเป็นวัตถุรูปแบบคือ
{"value": "", // ค่าเฉพาะของเซลล์ "type": "", // ประเภทของเซลล์, Stre Strit "สไตล์": {} // รูปแบบเซลล์สามารถเป็นวัตถุสไตล์หรือค่า ID ที่กำหนดไว้ในผู้ใช้ หากไม่ได้ตั้งค่าหัวจะเป็นรูปแบบที่สอดคล้องกันของคอลัมน์นี้โดยค่าเริ่มต้น} ค่าของ TitleMerge, DataMerge และอาร์เรย์ Footmerge เป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคซึ่งหมายถึง "แถวเริ่มแถวจบคอลัมน์เริ่มต้นคอลัมน์สิ้นสุด" และดัชนีเริ่มต้นจาก 0 ถ้ามีสองแถวและสามคอลัมน์ของข้อมูลในชื่อ "ตอนนี้คุณต้องผสานค่าที่สอดคล้องกันของหนึ่งแถวและสองคอลัมน์
ค่าในอาร์เรย์ IMG เป็นวัตถุรูปแบบ
{"col": 1, // คอลัมน์เริ่มต้นรูปภาพ "แถว": 0, // แถวเริ่ม "Colspan": 1, // ช่วงคอลัมน์ช่วงค่าต่ำสุดคือ 1 "Rowspan": 2, // ช่วงแถวค่าต่ำสุดคือ 1 "ข้อมูล": "// base64 ข้อมูลเช่น:" ข้อมูล: ภาพ/png; 4. การใช้งานที่สำคัญ
ไฟล์ excel หลังจาก 07 เป็นแพ็คเกจบีบอัดจริง ๆ โดยแต่ละแผ่นเป็นไฟล์ XML สไตล์เป็นไฟล์ XML รูปภาพเป็นไฟล์รูปภาพที่สอดคล้องกันและวางไว้ในโฟลเดอร์สื่อดังนั้นแนวคิดรหัสคือ
พอร์ทัลฟังก์ชันมีดังนี้
@OverridePublic เป็นโมฆะ buildOutputStream () พ่น fileproducerexception {// กระบวนการแผ่นข้อมูล JSON ที่เข้ามา = this.jSondata.getJsonArray (this.sheets); iterator <Ojrop> Sheetiter = Sheets.iterator (); ถ้า (sheets.isempy ())) {this.responsedata.seterrcode (1001); this.responsedata.setsuccess (เท็จ); this.responsedata.seterrmsg ("ไม่สามารถสร้างข้อมูลได้"); this.jsondata.getjsonarray (this.userstyles); this.inituserstyles (ผู้ใช้); 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 (); // รับแผ่นชื่อแผ่นงาน = sheet.getString {wb.setSheetName (sheetIndex, 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); SheetrowIndex = this.createheadColumn (WS, Sheethead, SheetrowIndex); this.setMergecells (ws, sheet.getjsonarray (this.sheet_data_merge), sheetrowindex); sheetdata = sheet.getjsonarray (this.sheet_data); sheetrowindex = this.createdata 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);} // return output stream ลอง {bytearrayoutputstream OS = new ByteArrayputStream (); wb.write (OS); this.outstreams.add (OS);} catch (ioexception e) {โยน fileproducerexception ใหม่ (e.getMessage (), e.getCause ());}}สร้างวัตถุสไตล์เซลล์รวมถึงการจัดตำแหน่งพื้นหลังของตัวอักษร
ส่วนตัว XSSFCELLSTYLE CREATECELLSTYLE (สไตล์ JSONOBJECT) {XSSFCELLSTYLE CELLSTYLE = WB.CREATECELLSTYLE (); // ตั้งค่าตัวอักษร JSONOBJECT FONT = Style.GetJSONObject (this.style_font); {cellStyle.SetFont (excelfont);} // การรวมเส้นขอบ black cellstyle.setBorderBottom (borderstyle.thin); cellstyle.setBorderTop (Borderstyle.thin); CellStyle.SetBorderleft (Borderstyle.thin) CellStyle.SetBorderright (Borderstyle.thin); String BorderColor = style.getString (this.border_color); ถ้า (stringutils.isnotblank (bordercolor)) {xssfcolor xfborderColor = ใหม่ XSSFCOLOR (สีใหม่ XfBorderColor); CellStyle.SetBorderColor (borderside.top, XfBorderColor); CellStyle.SetBorderColor (Borderside.left, XFBORDERCOLOR); CellStyle.SetBorderColor style.getString (this.background_color); ถ้า (stringutils.isnotblank (bgcolor)) {xssfcolor cellbgcolor = ใหม่ XSSFCOLOR (สีใหม่ (integer.parseint (bgcolor.substring (1) 16))); CellStyle.SetFillforegroundColor (CellBgColor); CellStyle.SetFillPattern (FillPatterntype.solid_foreground);} // การจัดตำแหน่งสตริง halignment = style.getString (stringutils.isnotblank (halignment)) cellstyle.setAlignment (horizontalalignment.valueof (halignment.touppercase ())); String Valignment = style.getString (this.valignment); (stringutils.isnotblank (การ Valignment)) CellStyle.setverticalalignment (Verticalalignment.valueof (Valignment.touppercase ())); // line line wrap truecellstyle.setWrapText (จริง); // รูปแบบสตริง fmt = style.getString (this.fmtstring); if (stringutils.isnotblank (fmt)) cellstyle.setDataFormat (wb.createdataFormat (). getFormat (fmt)); return cellstyle;}สร้างรูปแบบตัวอักษร
ตัวอักษรส่วนตัว CreateFont (JSONOBJECT FONTCFG) {ถ้า (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); ถ้า (FontBoole! = null) font.setitalic (fontboole.booleanvalue (fontboole! = null && fontboole.booleanvalue () == true) font.setunderline (fontunderline.single.getBytevalue ()); fontheight สั้น = fontcfg.getShort fontcfg.getString (this.font_color); if (colorstr! = null) {font.setColor (ใหม่ XSSFCOLOR (สีใหม่ (integer.parseInt (colorstr.substring (1), 16))));ในการประมวลผลส่วนหัวของตารางจะมีการประมวลผลส่วนหัวของตารางมากเกินไปและ | ใช้วิธีการแบ่งส่วน ความยาวส่วนหัวคือข้อมูลคอลัมน์ มีหลาย ในชื่อและคุณจะรู้ว่ามีกี่แถวในส่วนหัว ดังนั้นจึงมีหลายขั้นตอนสำหรับการประมวลผลส่วนหัว
private int createheadColumn (XSSFSheet WS, JsonArray Sheethead, int sheetrowIndex) {ถ้า (sheethead == null) กลับ sheetrowindex; iterator <OjropT> headiterator = Sheethead.iterator (); String [colsize]; headcellstylekeys = สตริงใหม่ [colsize]; int [] headcollevel = new int [colsize]; string colname = null; string [] colnameary = null; int maxlevel = 0; int collevel = 0; arraylist <arraylist <สตริง >> (); ในขณะที่ (headiter.hasnext ()) {curhead = (jsonobject) headiter.next (); // จัดการสไตล์เริ่มต้นถ้า (curhead.containskey (this.column_style)) {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);} else {headtypes [colindex] = this.celltypestring;} // จัดการส่วนหัวหลายโต๊ะ colname = curhead.getString (this.column_name); colnameary = colname.split ("// |"); (คอลเลกฟ์> maxlevel) {maxlevel = collevel;} สำหรับ (int i = 0; i <collevel; i ++) {ถ้า (headvaluelist.size () <= i) {headvaluelist.add (arraylist <String> ()); ws.getrow (sheetrowindex + i); if (row == null) {row = ws.createrow (sheetrowindex+i);} headcell = row.createCell (colindex); headcell.setCellValue (colnameary [i]); headcell.setcellstyle Iterator <arraylist <String>> a = headvaluelist.iterator (); jsonarray headmerge = new JsonArray (); String prev = "" String current = null; int lrowindex = 0; int startCol = 0; int mergecol = 0; 0; prev = ""; columnInfo = a.next (); // เฉพาะในคอลัมน์ที่สามเราสามารถรู้ได้ว่าคอลัมน์แรกและที่สองถูกรวมเข้าด้วยกันหรือไม่ columninfo.add (""); iterator <string> b = columninfo.iterator (); xssfcell lastrowcell = null; ในขณะที่ (b.hasnext ()) {current = b.next () ถ้า (lrowindex> 0) {lastrowcell = ws.getRow (prev.equalsignorecase (ปัจจุบัน) && lrowindex == 0) {ws.getrow (sheetrowindex+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) {// คอลัมน์ผสานมี headmerge.add (string.format ("%d,%d,%d,%d", headcollevel [i] - 1, maxlevel - 1, i, i)); สำหรับ (int r = headcollevel r) .createCell (i) .setCellStyle (this.userStyles.get (this.headstyle_key));}}} this.setMergecells (ws, headmerge, sheetrowindex); return sheetrowindex + maxlevel;}}}}}เพิ่มรูปภาพจุดเซลล์จะถูกใช้โดยค่าเริ่มต้นและรูปภาพได้รับการแก้ไขภายในพื้นที่เซลล์ที่ระบุ
โมฆะส่วนตัว addimg (XSSFSheet WS, JSONObject IMG, XSSFCreationHelper Chelper) {String imgbase64 = img.getString (this.Sheet_IMG_DATA); ถ้า (stringutils.isblank (imgbase64)) imgbase64.split (","); system.out.println (imgary [0]); byte [] imgbyte = base64.decodeBase64 (imgary [1]); int imgidx = wb.addPicture (Imgbyte, เวิร์กบุ๊ก ws.createdrawingpatriarch (); xssfclientanchor anchor = chelper.createClientanchor (); int col = img.getIntValue (this.sheet_img_col); int row = img.getIntValue (this.sheet_img_row); anchor.setcol1 (col); anchor.setrow1 (แถว); xssfpicture pict = drawimg.createpicture (anchor, imgidx); integer colspan = img.getinteger 1; Integer Rowspan = img.getInteger (this.Sheet_IMG_ROWSPAN); ถ้า (ROWSPAN == NULL) ROWSPAN = 1; PICT.RESIZE (COLSPAN, ROWSPAN);} 5. สรุป
ครั้งนี้ฉันสร้างไฟล์ Excel สไตล์ที่หลากหลายโดยผ่านวัตถุ JSON และฉันคุ้นเคยกับเอกสารสำนักงาน POI Operation มากขึ้น เมื่อเปรียบเทียบกับเอกสารการแยกวิเคราะห์ Excel รูปแบบไฟล์ไม่จำเป็นต้องพิจารณาเมื่อสร้างเช่น: เข้ากันได้กับรูปแบบปี 2003 และการแยกวิเคราะห์ SAX ไฟล์ขนาดใหญ่ได้รับการพิจารณา เมื่อเทียบกับการสร้างไฟล์ Excel Front-end JS ความเป็นไปได้ของการประมวลผลรองของไฟล์ที่สร้างขึ้นจะเพิ่มขึ้นดังนั้นในทางเข้าที่ใช้งานได้วิธีการสร้างสตรีมไบนารีจะถูกนำมาใช้ หลังจากสร้างไฟล์แล้วคุณสามารถส่งอีเมลอัปโหลด FTP และการดำเนินการอื่น ๆ ต่อไป
หมายเหตุสำคัญ
โอเคข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com