1. Latar belakang
Apache PoI adalah API Java yang menciptakan dan memelihara berbagai Java API yang mematuhi Standar Office Open XML (OOXML) dan Format Dokumen Komposit OLE 2 Microsoft (OLE2). Ini dapat digunakan untuk membaca dan membuat dan memodifikasi file MS Excel menggunakan Java. Selain itu, Anda juga dapat menggunakan Java untuk membaca dan membuat file MS Word dan MspowerPoint. Apache PoI menyediakan solusi Operasi Excel Java (untuk Excel97-2008).
Hasilkan file Excel yang sesuai berdasarkan file JSON dalam format yang ditentukan. Persyaratannya adalah sebagai berikut
2. Pratinjau efeknya
3. Format Data
Karena itu untuk menghasilkan file Excel, nilai di sini mempertimbangkan menghasilkan file Excel dalam format XLSX. Header multi-meja data dianggap menggunakan | Secara default, dan Colspan Rowspan tidak digunakan sebagai. Jika Anda perlu mewakili dua kolom dan dua baris, format header gabungan kolom pertama adalah: a | b, tabel yang dihasilkan |
| A | |
| B | C |
Front-end membangun data yang akan dihasilkan sebagai file JSON yang memenuhi persyaratan dan mengirimkan dan latar belakang melalui POST. Tentukan format JSON sesuai dengan persyaratan di atas sebagai berikut
{"SaveName": "Hasilkan file excel name.xlsx", "UserStyles": [{"id": "1", // tidak ada duplikasi, di mana Anda perlu mengatur gaya sel, Anda dapat langsung menetapkan gaya ke nilai ini ": {" font ": {// atur format dasar font format" true,//font, "#FF0000", // Warna Font "Nama": "Microsoft Elegant Black", // Nama Font "Tinggi": 20 // Size}, "FMTSTR": "", // Cell Format,#, ## 0,00 _);#, ## 0.00; 0 Milimeters "Align" ",",///Horizment; Bawah "BorderColor": "", // atur warna perbatasan seperti #FF0000 "BGCOLOR": "" // Atur Warna Cell Fill}}], "Sheets": [{"Sheetname": "", // Sheet Name "Title": [], // Data Judul Lembar Compact Data Area "Titlemerge": [], / /Compact Data Lembar Compact Data "Titlemerge": [], / / /Compact Data Lembar Compact Data "Titlemerge": [], / / /Compact Data Lembar Compact Data "Titlemerge": [], / / /Compact Data Area Lembar "Titlemerge": [], / / /Compact Area Lembar Data Titlemerge ": [], {{{" Informasi "Data": [], // Informasi data "datamerge": [], // Informasi gabungan data "kaki": [], // informasi akhir tabel "footmerge": [], // Tabel akhir informasi gabungan "img": [] // informasi gambar, Anda perlu mengonversi gambar menjadi base64}]}Deskripsi singkat
Format objek JSON di array kepala adalah
{"Nama": "A | B", // Nama header meja, penggunaan header multi-meja | Untuk membagi "type": "str", // Kolom ini tipe data str str stri, tanggal juga tipe numerik di excel, dan ditampilkan sebagai format tanggal "bidang": "f_field1", // alternatif bidang, Anda tidak dapat menggunakan "gaya": {// data kolom ini adalah gaya kolom default, itu bisa menjadi objek gaya, atau nilai id yang ditentukan dalam US US. " Di kaki data judul array, data dalam daftar dapat berupa nilai terpisah seperti 1, "a", atau objek, saat itu adalah objek, formatnya adalah
{"Value": "", // Nilai spesifik dari "tipe" sel ":" ", // Jenis sel," gaya "str default": {} // Gaya sel dapat menjadi objek gaya, atau nilai ID yang ditentukan dalam UserStyles. Jika tidak diatur, kepala adalah gaya yang sesuai dari kolom ini secara default} The values of titleMerge, dataMerge, and footMerge arrays are comma-separated strings, which means "start row, end row, start column, end column", and the index starts from 0. If there are two rows and three columns of data in the title, now you need to merge the corresponding values of one row and two columns of data to be "0, 0, 0, 1"
Nilai dalam array IMG adalah objek, format
{"col": 1, // gambar mulai kolom "baris": 0, // Baris awal "colspan": 1, // rentang kolom, nilai minimum adalah 1 "ROWSPAN": 2, // Span baris, nilai minimum adalah 1 "data": "" // base64 Data gambar seperti: "Data: gambar/png; basis64 basis64. 4. Implementasi utama
File Excel setelah 07 sebenarnya adalah paket terkompresi, dengan masing -masing lembar menjadi file XML, gaya menjadi file XML, gambar menjadi file gambar yang sesuai, dan ditempatkan di folder media, jadi ide kodenya adalah
Portal fungsi adalah sebagai berikut
@Overridepublic void buildOutputStream () melempar fileproduceRexception {// proses yang masuk JSON Data sheets = this.jsondata.getjsonArray (this.sheets); iterator <peject> sheetiter = sheets.iterator (); if (sheets.isempty ()) {this.responseData.setErrcode(1001);this.responseData.setSuccess(false);this.responseData.setErrmsg("No data can be generated");throw new FileProducerException();}wb = new XSSFWorkbook();// Create global format JSONArray userStyles = this.jsondata.getjsonArray (this.userstyles); this.inituserstyles (UserStyles); this.initDefaulTheadStyle (); Xssfsheet ws; Lembar jsonObject; Jsonarray sheetData; Jsonarray Sheettitle; Jsonarray Sheethead; Jsonarray Sheetfoot; Jsonarray Sheetimgs; String sheetName;int sheetIndex = 0;while (sheetIter.hasNext()) {sheet = (JSONObject) sheetIter.next();// Get the sheet name sheetName = sheet.getString(this.SHEET_NAME);ws = wb.createSheet();if (StringUtils.isNotBlank(sheetName)) {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.crereatedata (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);} // mengembalikan aliran output coba {bytearrayoutputStream os = bytearrayoutputStream (); wb.write (os); this.outstreams.add (os);} catch (ioException e) {lempar fileproduceRexception baru (e.getMessage (), e.getCause ());}}Menghasilkan objek gaya sel, termasuk perataan latar belakang perbatasan font
private XSSFCellStyle createCellStyle(JSONObject style) { XSSFCellStyle cellStyle = wb.createCellStyle();// Set font JSONObject font = style.getJSONObject(this.STYLE_FONT);Font excelFont = this.createFont(font);if (excelFont != null) {cellstyle.setfont (excelfont);} // perbatasan unifikasi black cellstyle.setborderbottom (borderstyle.thin); cellstyle.setbordertop (borderstyle.thin); cellstyle.setborderle (borderstyle.thin); cellstyle.setborderle (borderstyle.thin); cellstyle.setborderle (borderstyle.thin); cellstyle. cellstyle.setborderright (borderstyle.thin); String bordercolor = style.getString (this.border_color); if (stringutils.isnotblank (bordercolor)) {xssfcolor xfbordercolor = new xssfcolor (warna baru (integer.parseint (bordercolor.substring (1), 16)); xfbordercolor); cellstyle.setbordercolor (borderside.top, xfbordercolor); cellstyle.setbordercolor (borderside.left, xfbordercolor); cellstyle.setdordolor (borderside.right, xfbordercolor); latar belakang (borderside.right, xfbordercolor); latar belakang/ latar belakang (borderside.right, xfbordercolor); BorderSide (Borderside.right, xfbordercolor); style.getString (this.background_color); if (stringutils.isnotblank (bgcolor)) {xssfcolor cellbgcolor = new xssfcolor (warna baru (integer.parseint (bgcolor.substring (1), 16))); CellStyle.SetFillforeGroundColor (CellBgColor); Cellstyle.setFillPattern (fillpatternType.solid_foreground);} // string pelurusan halignment = style.getString (this.halignment); (Stringutils.isnotblank (halignment)) cellstyle.setalignment (horizontalalignment.valueof (halignment.touppercase ())); string valignment = style.getString (this.valignment); (Stringutils.isnotblank (valignment)) cellstyle.setVerticalAntignment (verticalalignment.valueof (valignment.topercase ())); // bungkus garis otomatis truecellstyle.setWraptext (true); // format string fmt = style.getString (this.fmtstring); if (stringutils.isnotblank (fmt)) cellstyle.setDataformat (wb.createedataformat (). getFormat (fmt)); return cellstyle;}Buat gaya font
private font createFont (jsonObject fontcfg) {if (fontcfg == null) return null; xssffont font = wb.createFont (); font.setfontname (fontcfg.getstring (this.font_name)); boolean fontboole = fontcfg. null) font.setBold (fontboole.booleanValue ()); fontboole = fontcfg.getBoolean (this.font_italic); if (fontboole! = null) font.setitalic (fontboole.booloanvalue ()); fontititical; (fontboole! = null && fontboole.booleanValue () == true) font.setunderline (fontunderline.single.getbytevalue ()); fontheight = fontcfg.getShort (this.font_height); if (iftheight! = null) font. fontcfg.getString (this.font_color); if (colorstr! = null) {font.setColor (XSSFColor baru (warna baru (integer.parseint (colorstr.substring (1), 16))));} return font;}Untuk memproses header meja, terlalu banyak header meja diproses, dan | Metode segmentasi digunakan. Panjang kepala adalah data kolom. Ada beberapa | Dalam namanya, dan Anda akan tahu berapa banyak baris yang ada di header. Oleh karena itu, ada beberapa langkah untuk pemrosesan header
private int createheadcolumn (xssfsheet ws, jsonarray sheethead, int sheetrowIndex) {if (sheethead == null) return sheetrowindex; iterator <pesope> headiterator = sheethead.iterator (); jsonObject curhead = null; int colindex = 0; objek colstyle = null; null; String[colSize];headCellStyleKeys = new String[colSize];int[] headColLevel = new int[colSize];String colName = null;String[] colNameAry = null;int maxLevel = 0;int colLevel = 0;XSSFCell headCell = null;ArrayList<ArrayList<String>> headValueList = new ArrayList <ArrayList <String> (); while (headiter.hasnext ()) {curhead = (jsonObject) headiter.next (); // menangani gaya default if (curhead.containskey (this.column_style)) {colstyle = curhead. {headcellstylekeys [colindex] = this.columnstyle_prev+ colindex; this.userstyles.put (headcellstylekeys [colindex], this.createCellstyle ((jsonObject) colstyle));} else if (this.userstyles.containskey (colstyle)) {headcellstyleKeys [colindex] = (string) colstyle; (curHead.containsKey(this.COLUMN_WIDTH)) {ws.setDefaultColumnWidth(pixToExcelWdith(curHead.getIntValue(this.COLUMN_WIDTH)));}// Save column style if (curHead.containsKey(this.COLUMN_TYPE)) {headTypes[colIndex] = Curhead.getString (this.column_type);} else {headtypes [colindex] = this.cellTypestring;} // menangani header multi-meja colname = Curhead.getString (this.column_name); colnameary = colname.split ("///|"); collevel = colnameary = colname.split ("///|"); collevel = colnameary = colname.split ("//|"); collevel = collevel = colnameary. (Collevel> MaxLevel) {MaxLevel = Collevel;} for (int i = 0; i <Collevel; i ++) {if (headvaluelist.size () <= i) {headvaluelist.add (colindex <string> ());} headvaluelist.get (i). ws.getrow (SheetrowIndex + i); if (row == null) {row = ws.createrow (SheetrowIndex+i);} headcell = row.createCell (colindex); headcell.setcellValue (colnameary [i]); headcell.setcellstyle (this.userstyles.get (this.headle_kell.setcellstyle (this.userstyles.get (this.headle_key); Iterator <arraylist <string>> a = headvaluelist.iterator (); jsonarray headmerge = new jsonarray (); string prev = ""; string arus = null; int lrowIndex = 0; int startcol = 0; int mergecol = 0; arraylist <string> columninfo = null; while; haLECOL =) (aStipnext (string <string> columninfo = null; while; null; haxol (a) {nullist (a nulx) (a null (a nulx; = ""; columninfo = a.next (); // Hanya di kolom ketiga kita dapat mengetahui apakah kolom pertama dan kedua digabungkan. columnInfo.add (""); iterator <string> b = columnInfo.iterator (); xssfcell lastrowcell = null; while (b.hasnext ()) {current = b.next (); if (lrowindex> 0) {lastrowcell = ws.getrow (sheetrowindex / lrowlex + lastrowcell = w.getrow (sheetrowindex + lrowlex + lastrowcell = w.getrow (sheetrowindex (prev.equalSignorecase (saat ini) && lrowIndex == 0) {w.getrow (SheetrowIndex+lRowIndex) .getCell (startCol) .setCellType (cell.cell_type_blank); mergecol ++;} else if (prev.equSivoRecase (Current) & mergecol ++;} else if (prev.equSInSIncheCase (Current)); mergecol ++; Stringutils.isblank (lastrowcell.getStringCellValue ())) {w.getrow (SheetrowIndex+lRowIndex) .getCell (startcol) .setCellType (cell.cell_type_blank); mergecol ++;} else {if (mergecol> 0 & startccol>) 0) {headmerge.add (string.format ("%d,%d,%d,%d", lrowindex, lrowindex, startcol - mergecol - 1, startcol - 1)); mergecol = 0;}} startcol ++; prev = saat ini;} lrowindex ++;} untuk (int i = 0; prev = saat ini;} lrowindex ++;} untuk (int i = 0; <maxlevel) {// Kolom gabungan ada headmerge.add (string.format ("%d,%d,%d,%d", headcollevel [i] - 1, maxlevel - 1, i, i, i)); untuk (int r = [i]; r <maxlevel; r ++) {ws.gerrow r) .createCell (i) .setCellstyle (this.userstyles.get (this.headstyle_key));}}} this.setmergecells (ws, headmerge, sheetrowindex); return sheetrowindex + maxlevel;}Tambahkan gambar, titik -titik sel digunakan secara default, dan gambar ditetapkan dalam area sel yang ditentukan.
private void addImg (xssfsheet ws, jsonobject img, xssfcreationhelper chelper) {string imgbase64 = img.getString (this.sheet_img_data); if (stringutils.isblank (imgbase64)) kembali; string [] imgary = = stringutils.isblank (imgbase64)) kembali; string [] imgary = = 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 anchor = chelper.createClientanchor (); int col = img.getIntValue (this.sheet_img_col); int row = img.getIntValue (this.sheet_img_row); jangkar.setcol1 (col) (this.sheet_img_row); jangkar.setcol1 (col) (this.sheet_img_row); jangkar.setcol1 (col) (this.sheet_img_row); jangkar.setcol1 (col); roweets.sheet); roweMg_row); jangkar.setcol1 (col) (this.sheet); jangkar. drawimg.createPicture (jangkar, imgidx); integer colspan = img.getInteger (this.sheet_img_colspan); if (colspan == null) colspan = 1; integer rowspan = img.getInteger (this.sheet_img_rowspan); ifeSpan = non -neMger (this.sheet_img_rowspan); bimpa = non -non (this. 1; pict.resize (colspan, rowspan);} 5. Ringkasan
Kali ini, saya membuat file Excel bergaya kaya dengan menyerahkan objek JSON, dan saya lebih akrab dengan dokumen Operasi Kantor POI. Dibandingkan dengan dokumen parsing Excel, format file tidak perlu dipertimbangkan ketika menghasilkan, seperti: kompatibel dengan format 2003, dan penguraian file saksofon besar dipertimbangkan. Dibandingkan dengan generasi front-end JS file Excel, kemungkinan pemrosesan sekunder dari file yang dihasilkan meningkat, jadi di pintu masuk fungsional, metode menghasilkan aliran biner diadopsi. Setelah file dihasilkan, Anda dapat terus mengirim email, mengunggah FTP dan operasi lainnya.
Catatan utama
Oke, di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.