1. Фон
Apache Poi - это Java API, который создает и поддерживает различные API -интерфейсы Java, которые соответствуют стандарту Office Open Open XML (OOXML) и формату составного документа Microsoft OLE 2 (OLE2). Его можно использовать для чтения, создания и изменения файлов MS Excel с помощью Java. Более того, вы также можете использовать Java для чтения и создания файлов MS Word и MsPowerPoint. Apache Poi предоставляет Java Operation Excel Solution (для Excel97-2008).
Создайте соответствующий файл Excel на основе файла JSON в указанном формате. Требования следующие
2. Предварительный просмотр эффекта
3. Формат данных
Поскольку он должен генерировать файлы Excel, значение здесь учитывает генерирование файла Excel в формате XLSX. Считается, что многоточный заголовок данных использует | По умолчанию, и Colspan Rowspan не используется как. Если вам нужно представлять два столбца и два ряда, формат заголовка слияния первого столбца: A | B, сгенерированная таблица A | C
| А | |
| Беременный | В |
Передняя часть конструирует данные, которые будут генерироваться как файл JSON, который соответствует требованиям, представленным и фонам через сообщение. Определите формат JSON в соответствии с вышеуказанными требованиями следующим образом
{"saveName": "Generate Excel file name.xlsx","userStyles": [{"id": "1", //No duplication, where you need to set the cell style, you can directly assign style to this value "style": {"font": { //Set the basic font format "blod": true,//Does it bold "italic": true, //Where to tilt "color": "#Ff0000", // цвет шрифта "Имя": "Microsoft Elegant Black", // Имя шрифта "Высота": 20 // Размер}, "fmtstr": "", // Формат ячейки,#, ## 0,00 _);#, ## 0,00; 0 миллиметров "Выравнивать": ", // Horizontal выравнивание. Центральное дно "Bordercolor": "", // Установить цвет границы, такой как #ff0000 "bgcolor": "" // set cell color}}], "листы": [{"листовое название": "", // название листа ": [], // Compact Leath Teal Date" Titlemerge ": [], // Compact lete Teat Информация о заголовке «Данные»: [], // Информация данных «DataMerge»: [], // Информация об объединении данных «Foot Foot»: [], // Информация о конце таблицы «Toomerge»: [], // Конец таблицы слияния «IMG»: [] // Информация о картине, вам нужно преобразовать картину на базу64}]}}}}}}}}}}}}}}}}}}}}}}}}}}Краткое описание
Формат объекта JSON в массиве головы
{"name": "a | b", // Имя заголовка таблицы, многослойный заголовок использование | Чтобы разделить «Тип»: «str», // этот тип данных этого столбца, дата также является числовым типом в Excel, и отображается как формат даты «Поле»: «F_FILD1», // Альтернативные поля, вы не можете использовать «Стиль»: {// Данные этого столбца - это стиль столбца по умолчанию, это может быть объектом стиля или значением идентификатора, определяемым в пользовательских «Alge», «Центр», «Центр», «Центр, может быть объектом стиля или значения идентификатора». В ноге данных заголовка массива данные в списке могут быть отдельным значением, таким как 1, «a» или объект, когда это объект, формат
{"value": "", // конкретное значение ячейки "типа": "", // тип ячейки, стиль STR по умолчанию ": {} // Стиль ячейки может быть объектом стиля или значением идентификатора, определенного в пользователях. Если он не установлен, голова является соответствующим стилем этого столбца по умолчанию} Значения массивов Tittlemerge, DataMerge и Tootmerge-это запятые строки, что означает «стартовая строка, конечная строка, столбец старта, конечный столбец», а индекс начинается с 0. Если в заголовке есть два строки и три столбца данных, 0, 0, 0, 1 "
Значение в массиве IMG - это объект, формат
{"col": 1, // Столбец начала изображения "ряд": 0, // стартовая строка "colspan": 1, // Списка столбца, минимальное значение - 1 "Rowspan": 2, // Списка рядов минимальное значение - 1 "Данные": "" // Данные изображения Base64, такие как: 4. Реализация ключей
Файлы Excel после 07 на самом деле являются сжатым пакетом, причем каждый лист является файлом XML, стиль является файлом XML, и изображение является соответствующим файлом изображения, и он помещен в папку носителя, поэтому идея кода была
Функциональный портал заключается в следующем
@OverridePublic void buildoutputStream () вызывает FileProducerexception {// обработка входящих листов данных 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 («Данные не могут быть сгенерированы»); выбросить новый fileproducerexception ();} wb = new xssfworkbook ();// create formaterxception ();) this.jsondata.getjsonarray (this.userstyles); this.inituserstyles (пользователи); this.initdefatheadstyle (); Xssfsheet ws; JsonObject Sheet; Jsonarray sheetdata; Jsonarray sheettitle; Jsonarray sheethead; Jsonarray sheetfoot; JsonArray литы; String SheetName; int sheateIndex = 0; while (sheetIter.hasnext ()) {sheate = (jsonObject) sheetIter.next (); // Получить листовое имя sheetName = sheate.getString (this.sheet_name); ws = wb.createSheet (); if stringutils.isnotblank (sheetName) {wb.setshetshexextex, wetextex, wetextex, wetextex, wetextex, if (stringtils.isnotblank (sheetname); SheetName);} int sheetroWindex = 0; sheettitle = sheet.getjsonarray (this.sheet_title); this.setmergecells (ws, sheet.getjsonarray (this.sheet_title_merge), sheetrowindex); shetroWindex = this.createrandom (ws, sheettitle, sheetrowindex); weethead = sheet.getjsonarray (this.sheet_head); shetroWindex = 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, листовый флаг, sheetrowindex); sheetImgs = sheet.getjsonarray (this.sheet_img); this.setSheetImage (ws, листовики);} // возвращается выходной поток try {bytearrayoutputstream os = new BytearRayoutputStream (); wb.write (os); this.outstreams.add (os);} catch (ioexception e) {бросить новый FileProducerexception (e.getMessage (), e.getCause ());}}Генерировать объекты в стиле клеток, в том числе выравнивание фонового фона шрифтов
private xssfcellstyle createcellstyle (jsonobject style) {xssfcellstyle cellstyle = wb.createcellstyle (); // set font jsonobject font = style.getjsonobject (это. {cellStyle.setFont (Excelfont);} // Бортовая объединение черного клеточного style.setborderbottom (borderstyle.thin); cellStyle.setbordertop (borderstyle.thin); cellstyle.setborderleft (borderstyle.thin); cellstyle.setbordright (borderstyle.thin) ;Thin.Thin); CellStyle.Setbordright (borderstyle.Thin.Thin); cellStyle.setborderright (BordersTyle.Thin); String bordercolor = style.getstring (this.border_color); if (stringutils.isnotblank (bordercolor)) {xssfcolor xfbordercolor = new xssfcolor (new color (integer.parseint (bordercolor.substring (1));); bordsbircolor.Stor.Stor.Stor.Stor.Stor.Stor.Stor xfbordercolor); cellstyle.setbordercolor (borderside.top, xfbordercolor); cellstyle.setbordercolor (borderside.left, xfbordercolor); cellstyle.setbordercolor (borderside.right, xfbordercolor);} // фоновая цветовая строка bgclor string bgclor string bgclor string bgclor string bgclor Style.getString (this.background_color); if (stringutils.isnotblank (bgcolor)) {xssfcolor cellbgcolor = new xssfcolor (new color (integer.parseint (bgcolor.substring (1), 16))); cellStyle.setFillForegroundColor (cellbgcolor); cellStyle.setFillPattern (fillPatterntype.solid_foreground);} // Выравнивание строки halignment = style.getString (this.halinment); (StringUtils.isnotblank (halignment)) cellStyle.SetAlignment (horizontalAlignment.valueof (haleNment.touppercase ())); string valignment = style.getString (this.valignment); Если (StringUtils.isnotblank (alignment)) cellstyle.setverticalAlignment (verticalAlignment.valueof (alengment.touppercase ())); // Автоматическая строка wrap truecellstyle.setwraptext (true); // формат строки fmt = style.getString (this.fmtstring); if (stringutils.isnotblank (fmt)) cellStyle.setDataFormat (wb.createdataFormat (). getFormat (fmt)); return cellstyle;}Создайте стили шрифтов
private font createfont (jsonobject fontcfg) {if (fontcfg == null) return null; xssffont font = wb.createfont (); font.setfontname (fontcfg.getString (this.font_name)); boolean fontbole = fontcfg.getboolean (font_blod); null) font.setbold (fontboole.booleanvalue ()); fontboole = fontcfg.getboolean (this.font_italic); if (fontboole! = null) font.setitalic (fontboole.booleAnvalue (); fontbole = fontcfg.getboolean (this.fontrine); && fontboole.booleanvalue () == true) font.setunderline (fontunderline.single.getbytevalue ()); short fontheight = fontcfg.getshort (this.font_height); if (fontheight! fontcfg.getstring (this.font_color); if (colorstr! = null) {font.setcolor (new xssfcolor (новый цвет (integer.parseint (colorstr.substring (1), 16)));} return font;}Для обработки заголовков таблицы обрабатывается слишком много заголовков таблицы, и | Метод сегментации используется. Длина головы - данные столбца. Есть несколько | Во имя, и вы узнаете, сколько рядов в заголовке. Следовательно, есть несколько шагов для обработки заголовков
private int createheadcolumn (xssfsheet ws, jsonarray sheethead, int sheetrowindex) {if (weethead == null) return sheetrowindex; итератор <объект> headiterator = weethead.iterator (); jsonobject curhead = null; int colindex = 0; Object Colstyle = null; int colsize = sheethead. 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 >> (); while (headiter.hasnext ()) {curhead = (jsonObject) headiter.next (); // обрабатывать стиль по умолчанию if (curhead.containskey (this.column_style)) {colstyle = curhead.get (this.column_style); {headcellstylekeys [colindex] = this.columnstyle_prev+ colindex; this.userstyles.put (headcellstylekeys [colindex], this.createcellstyle ((jsonobject) colstyle));} else if (this.userstyles.containskey (colstyle)) {Headcellstylekeys [colindex] = (строка) colstyle;} //7/ или gleble -alcth wile a ulbste wire a ulcal wise a waulet wire wire a defflylekeys [colindex] = (строка); (curhead.containskey (this.column_width)) {ws.setdefaultcolumnwidth (pixtoexcelwdith (curhead.getintvalue (this.column_width)));} // Сохранить Стиль COLBENTEX. curhead.getString (this.column_type);} else {headtypes [colindex] = this.celltypestring;} // Обработка мульти-таблевого заголовка colname = curhead.getString (this.column_name); colnameary = colname.split ("// |"); collevel = colnamearemelge. Collevel; if (collevel> maxlevel) {maxlevel = collevel;} for (int i = 0; i <collevel; i ++) {if (headvaluelist.size () <= i) {Headvaluelist.Add (new ArrayList <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.usersyles.get (this.headStyle_key); Итератор <arraylist <string >> a = headvaluelist.iterator (); jsonarray headmerge = new jsonarray (); string prev = ""; string current = null; int lrowindex = 0; int startcol = 0; int mergecol = 0; arraylist <string> coluninfo = null; ";; ColuneInfo = a.next (); // Только в третьем столбце мы можем узнать, объединены ли первые и вторые столбцы. columnInfo.add (""); iterator <string> b = columnInfo.iterator (); xssfcell lastrowcell = null; while (b.hasnext ()) {current = b.next (); if (lrowindex> 0) {lastrowcell = ws.getRowEx (leteRowIndex + lRowIndex - 1). (prev.equalsignorecase (current) && lrowindex == 0) {ws.getRow (sheetroWindex+lrowindex) .getCell (startCol) .setCelltype (cell.cell_type_blank); mergecol ++;} else if (prev.equalsecase (currentse) StringUtils.isblank (lastrowcell.getStringCellValue ()))) {ws.getRow (sheetroWindex+lrowIndex) .getCell (startCol) .setCelltype (cell.cell_type_blank); mergecol ++;} els {Headmerge.Add (string.format ("%d,%d,%d,%d", lrowindex, lrowindex, startcol - mergecol - 1, startcol - 1)); mergecol = 0;}} startcol ++; prev = curity;} lrowindex ++;} для (int i = 0; (Headcollevel [i] <maxlevel) {// слияние столбца существует Headmerge.add (string.format ("%d,%d,%d,%d", headcollevel [i] - 1, maxlevel - 1, i, i); для (int r = headcollevel [i]; r) .createCell (i) .SetCellStyle (this.UserStyles.get (this.headstyle_key));}}} this.setmergeCells (ws, Headmerge, SheetroWindex); return sheetroWindex + maxlevel;}Добавьте изображения, ячейки используются по умолчанию, а изображение фиксируется в указанной области ячейки.
Private void AddImg (xssfSheet WS, JsonObject img, xssfcreationHelper chelper) {string imgbase64 = img.getString (this.sheet_img_data); if (stringutils.isblank (imgbase64)) return; string [] imgary = imgbase64.split (","); system.out.println (imgary [0]); byte [] imgbyte = base64.decodebase64 (imgary [1]); int imgidx = wb.addpicture (imgbyte, workboubing.picture_type_jpeg); xsssfdrawinging, rawkbound.picture_type_jpeg); ws.createdRawingPatriarch (); xssfclientanchor archor = chelper.createclientanchor (); int col = img.getIntvalue (this.sheet_img_col); int row = img.getintvalue (this.sheet_img_row); ancorcol1 (col); = drailimg.createpicture (якорь, imgidx); integer colspan = img.getinteger (this.sheet_img_colspan); if (colspan == null) colspan = 1; integer rowspan = img.getinteger (this.sheet_img_rowspan); if (rowspan == null); 1; Pict.Resize (colspan, Rowspan);} 5. Резюме
На этот раз я сгенерировал файл Excel в богатом стиле, передав объекты JSON, и я больше знаком с Office Office Office Documents POI. По сравнению с документами Excel, форматом файла не необходим для рассмотрения при генерации, например: совместимо с форматом 2003 года, и рассматривается большие файлы саксофона. По сравнению с фронтальной генерацией файлов Excel, возможность вторичной обработки сгенерированных файлов увеличивается, поэтому в функциональном входе используется метод генерации двоичных потоков. После того, как файл генерируется, вы можете продолжать отправлять электронные письма, загружать FTP и другие операции.
Ключевые примечания
Хорошо, вышеупомянутое содержимое этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.