1. Hintergrund
Apache POI ist eine Java -API, die verschiedene Java -APIs erstellt und verwaltet, die dem Office Open XML (OOXML) -Standard und dem Ole 2 Composite -Dokumentformat (OLE2) von Microsoft entsprechen. Es kann verwendet werden, um MS Excel -Dateien mit Java zu lesen und zu erstellen und zu ändern. Darüber hinaus können Sie Java auch verwenden, um MS -Word- und MspowerPoint -Dateien zu lesen und zu erstellen. Apache POI bietet Java Operation Excel-Lösung (für Excel97-2008).
Generieren Sie die entsprechende Excel -Datei basierend auf der JSON -Datei im angegebenen Format. Die Anforderungen sind wie folgt
2. Vorschau des Effekts
3. Datenformat
Da es sich bei der Generierung von Excel -Dateien handelt, berücksichtigt der Wert hier eine Excel -Datei im XLSX -Format. Der Daten-Multi-Tisch-Header wird als verwendet | Standardmäßig wird Colspan Rowspan nicht als verwendet. Wenn Sie zwei Spalten und zwei Zeilen darstellen müssen, lautet das erste Spalte -Fusion -Header -Format: A | B, A | C Erzeugte Tabelle ist
| A | |
| B | C |
Das Front-End konstruiert die Daten, die als JSON-Datei generiert werden sollen, die die Anforderungen und Hintergrundinformationen über Post erfüllt. Definieren Sie das JSON -Format gemäß den oben genannten Anforderungen wie folgt
{"Savename": "generieren excel dateiname.xlsx", "userSyles": [{"id": "1", // keine Duplikation, wo Sie den Zelltil festlegen müssen, können Sie diesem Wert diesen Wert direkt "stilen": {"Schriftart": {// Setzen Sie die grundlegende Schriftformat "blod": trud ": trud": trud ": wahr, ///ite" it ital ". "#Ff0000", // Schriftart "Name" Name ":" Microsoft Elegant Black ", // Schriftname" Höhe ": 20 // Größe}," fmtstr ":" ", // Zellenformat,#, ## 0,00 _);### 0,00; Mitte unten "BorderColor": "", // Randfarbe wie #ff0000 "bgcolor": "" // Zellfüllfarbe setzen Headerinformationen "Daten": [], // Dateninformationen "Datamerge": [], // Daten merge Informationen "Fuß": [], // Tabelle Endinformationen "Footmerge": [], // Tabelle End -Merge -Informationen "IMG": [] // Bildinformationen, Sie müssen das Bild in Base64}]}]Kurze Beschreibung
Das JSON -Objektformat im Kopfarray ist
{"Name": "A | B", // Tabelle Header-Name, Multi-Tisch-Header Use | Um "Typ" zu teilen: "Str", // dieser Spalte Datentyp Strum, ist auch ein numerischer Typ in Excel und wird als Datumsformat "Feld" angezeigt: "F_Field1", // Alternative Felder können Sie "Stil" nicht verwenden: {// diese Spaltendaten ist der Standardspaltenstil, es kann ein Stilobjekt oder das Idwert definiert in Benutzern definiert in den Benutzern "ANGELEN". Im Array -Title Data Foot können die Daten in der Liste ein separater Wert wie 1, "a" oder ein Objekt sein, wenn es sich um ein Objekt handelt, das Format ist das Format
{"Wert": "", // Der spezifische Wert der Zelle "Typ": "", // Der Zelltyp, der Standard -Str "-Stil": {} // Der Zelltil kann ein Style -Objekt oder der in UserStyles definierte ID -Wert sein. Wenn es nicht eingestellt ist, ist der Kopf standardmäßig der entsprechende Stil dieser Spalte} Die Werte von Titlemerge-, Datamerge- und Footmerge-Arrays sind von Kommas getrennte Zeichenfolgen, was bedeutet "Start Zeile, Endzeile, Startspalte, Endspalte", und der Index startet ab 0. Wenn es zwei Zeilen und drei Datenspalten im Titel gibt, müssen Sie die entsprechenden Werte einer Zeile und zwei Spalten von Daten von Daten, 0, 0, 0, 0, 0, 0, 1, verschmelzen.
Der Wert im IMG -Array ist ein Objekt, Format
{"col": 1, // Die Bildstartspalte "Zeile": 0, // Die Startzeile "colspan": 1, // Die Spaltespannung ist 1 "Rowspan": 2, // Die Zeilenspanne, der Minimalwert ist 1 "Daten": "// Base64 -Bilddaten wie:" Daten: Bild/png; 4. Schlüsselimplementierung
Die Excel -Dateien nach 07 sind tatsächlich ein komprimiertes Paket, wobei jedes Blatt eine XML -Datei ist. Der Stil ist eine XML
Das Funktionsportal ist wie folgt
@Overridepublic void BuildoutputStream () löst FileProCerException {// eingehende JSON -Datenblätter prozess. {this.responsedata.seterrcode (1001); this.responedata.setsuSccess (false); this.responedata.seterrmsg ("Keine Daten können generiert werden"). this.jsondata.getJsonArray (this.USERSYLES); this.inituSerSyles (UserStyles); this.initdefaultheadStyle (); XSSFSheet WS; JsonObject Sheet; JsonArray Sheetdata; JsonArray Shheettitle; JsonArray Sheethead; JsonArray Sheetfoot; JsonArray Sheetimgs; String SheetName; int SheetIndex = 0; while (Sheetiter.hasNext ()) {Sheet = (jsonObject) Sheetiter Sheettname);} int SheetrowIndex = 0; Shettitle = Sheet.getJsonArray (this.sheet_title); this.setMergeCells (WS, Sheet.getJsonArray (this.sheet_title_merge), SheetrowIndex); SheetrowIndex = this.createrandom (WS, Shettitle, SheetrowIndex); Sheethead = Sheet.getJsonArray (this.sheet_head); Sheetrowindex = this.creatheadColumn (WS, Sheethead, SheetrowIndex); this.setMergeCells (WS, Sheet.getJsonArray (this.sheet_data_merge), 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);} // Ausgabestream zurückgeben {bytearrayoutputStream os = new bytearrayoutputStream (); WB.Write (OS); this.outStreams.add (os);} catch (ioException e) {werfen neuer FileProcerexception (e.getMessage (), e.getCause ());}}Generieren Sie Zellstilobjekte, einschließlich der Ausrichtung der Schrift im Hintergrund der Schriftgrenze
private xssfcellstyle createCellstyle (jsonObject style) {xssfcellstyle cellstyle = wb.createcellstyle (); // font JsonObject font = style.getJsonObject (this.style_font); font excelfont = this.create defont (fefont); {cellStyle.setFont (excelfont);} // Border Unification Black CellStyle.SetBorderBottom (BORDERSYLE.HIN); CellStyle.SetBordertop (Bordersyle.Thin); CellStyle.SetBorderLeft (BORDERSYLE. CellStyle.SetBorderRight (BORDERSYLE.HIN); String borderColor = style.getString (this.border_color); if (Stringutils.isnotblank (BorderColor)) {xssfcolor xfborderColor = new xssfcolor (new color (inneg. xfborderColor); CellStyle.SetBorderColor (Borderside.top, XfBorderColor); CellStyle.SetBorderColor (BORDERSIDE.LEFT, XFBORDCOLOR); CellStyle.setBorderColor (Borderside, XfBorderColor); style.getString (this.background_color); if (Stringutils.isnotblank (bgcolor)) {xssfcolor cellbgcolor = new XSSFColor (neue Farbe (Integer.ParseInt (Bgcolor.substring), 1), 16))); CellStyle.SetFillforegroundColor (cellBgColor); CellStyle.SetFillPattern (fillPatternNtype.solid_forground);} // Alignment -String -Halignment = Style.getString (this.Halignment); wenn (Stringutils.isnotblank (Halignment)) CellStyle.Setalignment (Horizontalalignment.ValueOf (Halignment.ToUpperCase ()); String Valignment = style.getString (this.Valignment); (Stringutils.isnotblank (Valignment)) cellStyle.SetverticalAnignment (VerticalAnignment.ValueOf (Valignment.ToUppercase ()); // Automatische Linienwickel -TrueCellstyle.setWraptext (true); // Format String fmt = style.getString (this.fmtstring); if (Stringutils.isnotblank (fmt)) cellstyle.setDataFormat (WB.CreatedataFormat (). GetFormat (fmt)); return cellStyle;}Erstellen Sie Schriftstile
private Font createFont(JSONObject fontCfg) {if (fontCfg == null)return null;XSSFFont font = wb.createFont();font.setFontName(fontCfg.getString(this.FONT_NAME));Boolean fontBoole = fontCfg.getBoolean(FONT_BLOD);if (fontBoole != null) font.setbold (fontboole (fontboole! = null && fontboole fontcfg.getString (this.font_color); if (colorStr! = null) {font.setColor (neuer XSSFColor (neuer FarbeUm Tischkopfzeile zu verarbeiten, werden zu viele Tischkopfzeile verarbeitet und die | Die Segmentierungsmethode wird verwendet. Die Kopflänge sind Spaltendaten. Es gibt mehrere | Im Namen, und Sie werden wissen, wie viele Zeilen im Kopf sind. Daher gibt es mehrere Schritte für die Header -Verarbeitung
Private int createheadColumn (XSSFSheet WS, JsonArray Sheethead, int SheetrowIndex) {if (Sheethead == null) return Sheetrowindex; Iterator <Objekt> Headiterator = Sheethead.iterator (); jsonObject = null; Int ColIndex = 0; String [colsize]; HeadcellStylekeys = new String [colsize]; int [] Headcollevel = new int [colsize]; String colname = null; String [] colnameary = null; int maxLevel = 0; int Collevel = 0; xssfcell ladcell = null = arraylist <arrayList <arrayList <arrayList <arraylist <arrayList <archlist <Straylist <Strays <Stupvels >> >> headvaluelist = newnel; ArrayList <arrayList <string >> (); while (headiter.hasnext ()) {curhead = (jsonObject) headiter {HeadcellStylekeys [colIndex] = this.columnStyle_prev+ colindex; this.userSyles.put (Kopfcellstylekeys [colindex], this.createcellstyle ((jsonObject) colstyle));} else if (this.uSerSyles.Containskey (Colstyle)) {Headcellstylekeys [Colindex] = (String) Colstyle;}}}} // Default -Kolumne, wenn es um die Delyte -Kolumnen geht, wenn es sich um die Delikt -Kolumne handelt,}}}}}}} // Default -Kolumne, wenn es sich (Curhead.ContainsKey (this.column_width)) {Ws.setDefaultColumnWidth (pixtoexcelwdith (curhead.getIntValue) (this.column_width));} // Spaltenstil, wenn (curhead.containskey curhead.getString (this.column_type);} else {headtypes [colIndex] = this.celltypestring;} // Multi-Tisch-Header colname = curhead.getString (this this.column_name); colnameary Collevel; if (Collevel> maxlevel) {maxlevel = collevel;} für (int i = 0; i <collevel; i ++) {if (headvaluelist.size () <= i) {headvaluelist.add (new ArrayList <string> ();} Headvaluist.Get (i). Ws.getrow (SheetrowIndex + i); if (row == null) {row = ws.createrow (Sheetrowindex+i);} ladcell = row.createcell (colindex); headcell.setcellValue (colnameary [i]); hadelcell.setcellstyle (this.uSerSyles.get (thisheadstyle_ty); Iterator <ArrayList <String >> a = headvaluelist.iterator (); ""; ColumnInfo = A.Next (); // Nur in der dritten Spalte können wir wissen, ob die ersten und zweiten Spalten zusammengeführt werden. columnInfo.add("");Iterator<String> b = columnInfo.iterator();XSSFCell lastRowCell = null;while (b.hasNext()) {current = b.next();if (lRowIndex > 0) {lastRowCell = ws.getRow(sheetRowIndex + lRowIndex - 1).getCell(startCol);}if (prev.equalSignoreCase (aktuell) && lrowIndex == 0) {Ws.getrow (SheetrowIndex+lrowIndex) .getCell (startCol) .setCellType (cell.cell_type_blank); Stringutils.isblank (lastrowcell.getStringCellValue ())) {Ws.getrow (Sheetrowindex+lrowIndex) .getCell (startCol) .setCellType (cell.cell_type_blank); oder (Headcollevel [i] <MaxLevel) {// Säule merge existiert Headmerge.add (String.Format ("%d,%d,%d", Headcollevel [i] - 1, MaxLevel - 1, I, I); für (in r = ladcollevel [i]; r) .CreateCell (i) .setCellStyle (this.uSerSyles.get (this.headstyle_key));}}} this.setMergeCells (WS, Headmerge, Sheetrowindex); Rückkehr Sheetrowindex + MaxLevel;}Fügen Sie Bilder hinzu, die Zellpunkte werden standardmäßig verwendet und das Bild wird im angegebenen Zellbereich fixiert.
private void addImg (xssfsheet ws, jsonObject img, xssfcreathelper chelper) {string imgbase64 = img.getString (this.sheet_img_data); if (Stringutils.isblank (IMGBase64)) return; String [] imgary = imgbase64.split (","); 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 (row); xssfpicture pict = drateImg.createPicture (Anchor, imgidx); Integer colspan = img.getIntinger (this.Sheet); 1; Integer rowspan = img.getInteger (this.sheet_img_rowspan); if (rowspan == null) rowspan = 1; pict.Resize (colspan, rowspan);}; 5. Zusammenfassung
Dieses Mal habe ich eine Excel-Datei im Rich-Stil generiert, indem ich JSON-Objekte weitergab, und ich kenne mich besser mit Poi-Operation Office-Dokumenten vertraut. Im Vergleich zu Parsen Excel -Dokumenten ist das Dateiformat bei der Generierung nicht in Betracht zu ziehen, wie z. Im Vergleich zur Erzeugung von Excel-Dateien von JS Front-End wird die Möglichkeit einer sekundären Verarbeitung der generierten Dateien erhöht. Im funktionalen Eingang wird daher die Methode zur Erzeugung von Binärströmen übernommen. Nachdem die Datei generiert wurde, können Sie weiterhin E -Mails senden, FTP und andere Vorgänge hochladen.
Schlüsselnotizen
Okay, das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.