|
@@ -0,0 +1,888 @@
|
|
|
|
+package com.anjiplus.template.gaea.business.modules.reportexcel.util;
|
|
|
|
+
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFCell;
|
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFColor;
|
|
|
|
+
|
|
|
|
+import java.util.*;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 来自:https://github.com/mengshukeji/LuckysheetServer
|
|
|
|
+ * sheet操作
|
|
|
|
+ *
|
|
|
|
+ * @author Administrator
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+public class XlsSheetUtil {
|
|
|
|
+ /**
|
|
|
|
+ * 导出sheet
|
|
|
|
+ *
|
|
|
|
+ * @param wb
|
|
|
|
+ * @param sheetNum
|
|
|
|
+ * @param dbObject
|
|
|
|
+ */
|
|
|
|
+ public static void exportSheet(Workbook wb, int sheetNum, JSONObject dbObject) {
|
|
|
|
+ Sheet sheet = wb.createSheet();
|
|
|
|
+
|
|
|
|
+ //设置sheet位置,名称
|
|
|
|
+ if (dbObject.containsKey("name") && dbObject.get("name") != null) {
|
|
|
|
+ wb.setSheetName(sheetNum, dbObject.get("name").toString());
|
|
|
|
+ } else {
|
|
|
|
+ wb.setSheetName(sheetNum, "sheet" + sheetNum);
|
|
|
|
+ }
|
|
|
|
+ //是否隐藏
|
|
|
|
+ if (dbObject.containsKey("hide") && dbObject.get("hide").toString().equals("1")) {
|
|
|
|
+ wb.setSheetHidden(sheetNum, true);
|
|
|
|
+ }
|
|
|
|
+ //是否当前选中页
|
|
|
|
+ if (dbObject.containsKey("status") && dbObject.get("status").toString().equals("1")) {
|
|
|
|
+ sheet.setSelected(true);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //循环数据
|
|
|
|
+ if (dbObject.containsKey("celldata") && dbObject.get("celldata") != null) {
|
|
|
|
+ //取到所有单元格集合
|
|
|
|
+ List<JSONObject> cells_json = (List<JSONObject>) dbObject.get("celldata");
|
|
|
|
+ Map<Integer, List<JSONObject>> cellMap = cellGroup(cells_json);
|
|
|
|
+ //循环每一行
|
|
|
|
+ for (Integer r : cellMap.keySet()) {
|
|
|
|
+ Row row = sheet.createRow(r);
|
|
|
|
+ //循环每一列
|
|
|
|
+ for (JSONObject col : cellMap.get(r)) {
|
|
|
|
+ createCell(wb, sheet, row, col);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (dbObject.containsKey("config") && dbObject.getJSONObject("config").containsKey("borderInfo")) {
|
|
|
|
+ JSONArray borderInfo = dbObject.getJSONObject("config").getJSONArray("borderInfo");
|
|
|
|
+ setCellBoard(wb, borderInfo, sheet);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ setColumAndRow(dbObject, sheet);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 每一个单元格
|
|
|
|
+ *
|
|
|
|
+ * @param row
|
|
|
|
+ * @param dbObject
|
|
|
|
+ */
|
|
|
|
+ private static void createCell(Workbook wb, Sheet sheet, Row row, JSONObject dbObject) {
|
|
|
|
+ if (dbObject.containsKey("c")) {
|
|
|
|
+ Integer c = getStrToInt(dbObject.get("c"));
|
|
|
|
+ if (c != null) {
|
|
|
|
+ Cell cell = row.createCell(c);
|
|
|
|
+ //取单元格中的v_json
|
|
|
|
+ if (dbObject.containsKey("v")) {
|
|
|
|
+ //获取v对象
|
|
|
|
+ Object obj = dbObject.get("v");
|
|
|
|
+ if (obj == null) {
|
|
|
|
+ //没有内容
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ //如果v对象直接是字符串
|
|
|
|
+ if (obj instanceof String) {
|
|
|
|
+ if (((String) obj).length() > 0) {
|
|
|
|
+ cell.setCellValue(obj.toString());
|
|
|
|
+ }
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //转换v为对象(v是一个对象)
|
|
|
|
+ JSONObject v_json = (JSONObject) obj;
|
|
|
|
+ //样式
|
|
|
|
+ CellStyle style = wb.createCellStyle();
|
|
|
|
+ cell.setCellStyle(style);
|
|
|
|
+
|
|
|
|
+ //bs 边框样式 //bc 边框颜色
|
|
|
|
+ setBorderStyle(style, v_json, "bs", "bc");
|
|
|
|
+ //bs_t 上边框样式 bc_t 上边框颜色
|
|
|
|
+ setBorderStyle(style, v_json, "bs_t", "bc_t");
|
|
|
|
+ //bs_b 下边框样式 bc_b 下边框颜色
|
|
|
|
+ setBorderStyle(style, v_json, "bs_b", "bc_b");
|
|
|
|
+ //bs_l 左边框样式 bc_l 左边框颜色
|
|
|
|
+ setBorderStyle(style, v_json, "bs_l", "bc_l");
|
|
|
|
+ //bs_r 右边框样式 bc_r 右边框颜色
|
|
|
|
+ setBorderStyle(style, v_json, "bs_r", "bc_r");
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //合并单元格
|
|
|
|
+ //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
|
|
|
|
+ //CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11);
|
|
|
|
+
|
|
|
|
+ //mc 合并单元格
|
|
|
|
+ if (v_json.containsKey("mc")) {
|
|
|
|
+ //是合并的单元格
|
|
|
|
+ JSONObject mc = v_json.getJSONObject("mc");
|
|
|
|
+ if (mc.containsKey("rs") && mc.containsKey("cs")) {
|
|
|
|
+ //合并的第一个单元格
|
|
|
|
+ if (mc.containsKey("r") && mc.containsKey("c")) {
|
|
|
|
+ Integer _rs = getIntByDBObject(mc, "rs") - 1;
|
|
|
|
+ Integer _cs = getIntByDBObject(mc, "cs") - 1;
|
|
|
|
+ Integer _r = getIntByDBObject(mc, "r");
|
|
|
|
+ Integer _c = getIntByDBObject(mc, "c");
|
|
|
|
+
|
|
|
|
+ CellRangeAddress region = new CellRangeAddress(_r.shortValue(), (_r.shortValue() + _rs.shortValue()), _c.shortValue(), (_c.shortValue() + _cs.shortValue()));
|
|
|
|
+ sheet.addMergedRegion(region);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //不是合并的第一个单元格
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //取v值 (在数据类型中处理)
|
|
|
|
+ //ct 单元格值格式 (fa,t)
|
|
|
|
+ setFormatByCt(wb, cell, style, v_json);
|
|
|
|
+
|
|
|
|
+ //font设置
|
|
|
|
+ setCellStyleFont(wb, style, v_json);
|
|
|
|
+
|
|
|
|
+ //bg 背景颜色
|
|
|
|
+ if (v_json.containsKey("bg")) {
|
|
|
|
+ String _v = getByDBObject(v_json, "bg");
|
|
|
|
+ Short _color = ColorUtil.getColorByStr(_v);
|
|
|
|
+ if (_color != null) {
|
|
|
|
+ style.setFillForegroundColor(_color);
|
|
|
|
+ style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //vt 垂直对齐 垂直对齐方式(0=居中,1=上,2=下)
|
|
|
|
+ if (v_json.containsKey("vt")) {
|
|
|
|
+ Integer _v = getIntByDBObject(v_json, "vt");
|
|
|
|
+ if (_v != null && _v >= 0 && _v <= 2) {
|
|
|
|
+ style.setVerticalAlignment(ConstantUtil.getVerticalType(_v));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //默认设置居中
|
|
|
|
+ style.setVerticalAlignment(ConstantUtil.getVerticalType(0));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //ht 水平对齐 水平对齐方式(0=居中,1=左对齐,2=右对齐)
|
|
|
|
+ if (v_json.containsKey("ht")) {
|
|
|
|
+ Integer _v = getIntByDBObject(v_json, "ht");
|
|
|
|
+ if (_v != null && _v >= 0 && _v <= 2) {
|
|
|
|
+ style.setAlignment(ConstantUtil.getHorizontaltype(_v));
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ //默认设置左对齐
|
|
|
|
+ style.setAlignment(ConstantUtil.getHorizontaltype(1));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //tr 文字旋转 文字旋转角度(0=0,1=45,2=-45,3=竖排文字,4=90,5=-90)
|
|
|
|
+ if (v_json.containsKey("tr")) {
|
|
|
|
+ Integer _v = getIntByDBObject(v_json, "tr");
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ style.setRotation(ConstantUtil.getRotation(_v));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //tb 文本换行 0 截断、1溢出、2 自动换行
|
|
|
|
+ // 2:setTextWrapped 0和1:IsTextWrapped = true
|
|
|
|
+ if (v_json.containsKey("tb")) {
|
|
|
|
+ Integer _v = getIntByDBObject(v_json, "tb");
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ if (_v >= 0 && _v <= 1) {
|
|
|
|
+ style.setWrapText(false);
|
|
|
|
+ } else {
|
|
|
|
+ style.setWrapText(true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //f 公式
|
|
|
|
+ if (v_json.containsKey("f")) {
|
|
|
|
+ String _v = getByDBObject(v_json, "f");
|
|
|
|
+ if (_v.length() > 0) {
|
|
|
|
+ try {
|
|
|
|
+ if (_v.startsWith("=")) {
|
|
|
|
+ cell.setCellFormula(_v.substring(1));
|
|
|
|
+ } else {
|
|
|
|
+ cell.setCellFormula(_v);
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ log.error("公式 {};Error:{}", _v, ex.toString());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置边框
|
|
|
|
+ *
|
|
|
|
+ * @param borderInfo
|
|
|
|
+ * @param sheet
|
|
|
|
+ */
|
|
|
|
+ private static void setCellBoard(Workbook wb, JSONArray borderInfo, Sheet sheet) {
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //一定要通过 cell.getCellStyle() 不然的话之前设置的样式会丢失
|
|
|
|
+ //设置边框
|
|
|
|
+ for (int i = 0; i < borderInfo.size(); i++) {
|
|
|
|
+ JSONObject borderInfoObject = (JSONObject) borderInfo.get(i);
|
|
|
|
+ if (borderInfoObject.get("rangeType").equals("cell")) {//单个单元格
|
|
|
|
+ JSONObject borderValueObject = borderInfoObject.getJSONObject("value");
|
|
|
|
+
|
|
|
|
+ JSONObject l = borderValueObject.getJSONObject("l");
|
|
|
|
+ JSONObject r = borderValueObject.getJSONObject("r");
|
|
|
|
+ JSONObject t = borderValueObject.getJSONObject("t");
|
|
|
|
+ JSONObject b = borderValueObject.getJSONObject("b");
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ int row_ = borderValueObject.getInteger("row_index");
|
|
|
|
+ int col_ = borderValueObject.getInteger("col_index");
|
|
|
|
+
|
|
|
|
+ Row row = sheet.getRow(row_);
|
|
|
|
+ if (null == row) {
|
|
|
|
+ row = sheet.createRow(row_);
|
|
|
|
+ }
|
|
|
|
+ Cell cell = row.getCell(col_);
|
|
|
|
+ CellStyle style;
|
|
|
|
+ if (null == cell) {
|
|
|
|
+ style = wb.createCellStyle();
|
|
|
|
+ cell = row.createCell(col_);
|
|
|
|
+ cell.setCellStyle(style);
|
|
|
|
+ } else {
|
|
|
|
+ style = cell.getCellStyle();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if (l != null) {
|
|
|
|
+ style.setBorderLeft(BorderStyle.valueOf(l.getShort("style"))); //左边框
|
|
|
|
+ Short color = ColorUtil.getColorByStr(l.getString("color"));
|
|
|
|
+ if (null != color) {
|
|
|
|
+ style.setLeftBorderColor(color);//左边框颜色
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if (r != null) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(r.getShort("style"))); //右边框
|
|
|
|
+ Short color = ColorUtil.getColorByStr(r.getString("color"));
|
|
|
|
+ if (null != color) {
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if (t != null) {
|
|
|
|
+ style.setBorderTop(BorderStyle.valueOf(t.getShort("style"))); //顶部边框
|
|
|
|
+ Short _vcolor = ColorUtil.getColorByStr(t.getString("color"));
|
|
|
|
+ if (null != _vcolor) {
|
|
|
|
+ style.setTopBorderColor(_vcolor);//顶部边框颜色
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ if (b != null) {
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(b.getShort("style"))); //底部边框
|
|
|
|
+ Short _vcolor = ColorUtil.getColorByStr(b.getString("color"));
|
|
|
|
+ if (_vcolor != null) {
|
|
|
|
+ //底部边框颜色
|
|
|
|
+ style.setBottomBorderColor(_vcolor);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else if (borderInfoObject.get("rangeType").equals("range")) {
|
|
|
|
+ //选区
|
|
|
|
+ Short style_ = borderInfoObject.getShort("style");
|
|
|
|
+ String borderType = borderInfoObject.getString("borderType");
|
|
|
|
+ Short color = ColorUtil.getColorByStr(borderInfoObject.getString("color"));
|
|
|
|
+ JSONObject rangObject = (JSONObject) ((JSONArray) (borderInfoObject.get("range"))).get(0);
|
|
|
|
+
|
|
|
|
+ JSONArray rowList = rangObject.getJSONArray("row");
|
|
|
|
+ JSONArray columnList = rangObject.getJSONArray("column");
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ for (int row_ = rowList.getInteger(0); row_ < rowList.getInteger(rowList.size() - 1) + 1; row_++) {
|
|
|
|
+ for (int col_ = columnList.getInteger(0); col_ < columnList.getInteger(columnList.size() - 1) + 1; col_++) {
|
|
|
|
+ Row row = sheet.getRow(row_);
|
|
|
|
+ if (null == row) {
|
|
|
|
+ row = sheet.createRow(row_);
|
|
|
|
+ }
|
|
|
|
+ Cell cell = row.getCell(col_);
|
|
|
|
+ CellStyle style;
|
|
|
|
+ if (null == cell) {
|
|
|
|
+ style = wb.createCellStyle();
|
|
|
|
+ cell = row.createCell(col_);
|
|
|
|
+ cell.setCellStyle(style);
|
|
|
|
+ } else {
|
|
|
|
+ style = cell.getCellStyle();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //"border-left" | "border-right" | "border-top" | "border-bottom" | "border-all" | "border-horizontal" | "border-vertical"
|
|
|
|
+ // "border-outside" | "border-inside" | | "border-none"
|
|
|
|
+ if ("border-left".equals(borderType) || "border-all".equals(borderType)) {
|
|
|
|
+ style.setBorderLeft(BorderStyle.valueOf(style_)); //左边框
|
|
|
|
+ style.setLeftBorderColor(color);//左边框颜色
|
|
|
|
+ }
|
|
|
|
+ if ("border-right".equals(borderType) || "border-all".equals(borderType)) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(style_)); //右边框
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ("border-top".equals(borderType) || "border-all".equals(borderType)) {
|
|
|
|
+ style.setBorderTop(BorderStyle.valueOf(style_)); //顶部边框
|
|
|
|
+ style.setTopBorderColor(color);//顶部边框颜色
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ("border-bottom".equals(borderType) || "border-all".equals(borderType)) {
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(style_)); //底部边框
|
|
|
|
+ style.setBottomBorderColor(color);//底部边框颜色 }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ("border-outside".equals(borderType)) {
|
|
|
|
+ //外圈边框
|
|
|
|
+ if (row_ == rowList.getInteger(0) ) {
|
|
|
|
+ style.setBorderTop(BorderStyle.valueOf(style_)); //顶部边框
|
|
|
|
+ style.setTopBorderColor(color);//顶部边框颜色
|
|
|
|
+ }
|
|
|
|
+ if (col_ == columnList.getInteger(0)) {
|
|
|
|
+ style.setBorderLeft(BorderStyle.valueOf(style_)); //左边框
|
|
|
|
+ style.setLeftBorderColor(color);//左边框颜色
|
|
|
|
+ }
|
|
|
|
+ if (row_ == rowList.getInteger(rowList.size() - 1)) {
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(style_)); //底部边框
|
|
|
|
+ style.setBottomBorderColor(color);//底部边框颜色 }
|
|
|
|
+ }
|
|
|
|
+ if (col_ == columnList.getInteger(columnList.size() - 1)) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(style_)); //右边框
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ("border-inside".equals(borderType)) {
|
|
|
|
+ //所有内边框
|
|
|
|
+ if (row_ >= rowList.getInteger(0) && row_ < rowList.getInteger(rowList.size() - 1)) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(style_)); //右边框
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(style_)); //底部边框
|
|
|
|
+ style.setBottomBorderColor(color);//底部边框颜色 }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (col_ >= columnList.getInteger(0) && col_ < columnList.getInteger(columnList.size() - 1)) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(style_)); //右边框
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(style_)); //底部边框
|
|
|
|
+ style.setBottomBorderColor(color);//底部边框颜色 }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ("border-horizontal".equals(borderType)) {
|
|
|
|
+ //内部横线
|
|
|
|
+ if (row_ >= rowList.getInteger(0) && row_ < rowList.getInteger(rowList.size() - 1)) {
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(style_)); //底部边框
|
|
|
|
+ style.setBottomBorderColor(color);//底部边框颜色 }
|
|
|
|
+ }
|
|
|
|
+ if (col_ >= columnList.getInteger(0) && col_ < columnList.getInteger(columnList.size() - 1)) {
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(style_)); //底部边框
|
|
|
|
+ style.setBottomBorderColor(color);//底部边框颜色 }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ("border-vertical".equals(borderType)) {
|
|
|
|
+ //内部竖线
|
|
|
|
+ if (row_ >= rowList.getInteger(0) && row_ < rowList.getInteger(rowList.size() - 1)) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(style_)); //右边框
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ }
|
|
|
|
+ if (col_ >= columnList.getInteger(0) && col_ < columnList.getInteger(columnList.size() - 1)) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(style_)); //右边框
|
|
|
|
+ style.setRightBorderColor(color);//右边框颜色
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置单元格,宽、高
|
|
|
|
+ *
|
|
|
|
+ * @param dbObject
|
|
|
|
+ * @param sheet
|
|
|
|
+ */
|
|
|
|
+ private static void setColumAndRow(JSONObject dbObject, Sheet sheet) {
|
|
|
|
+ if (dbObject.containsKey("config")) {
|
|
|
|
+ JSONObject config = dbObject.getJSONObject("config");
|
|
|
|
+
|
|
|
|
+ if (config.containsKey("columnlen")) {
|
|
|
|
+ JSONObject columnlen = config.getJSONObject("columnlen");
|
|
|
|
+ if (columnlen != null) {
|
|
|
|
+ for (String k : columnlen.keySet()) {
|
|
|
|
+ Integer _i = getStrToInt(k);
|
|
|
|
+ Integer _v = getStrToInt(columnlen.get(k).toString());
|
|
|
|
+ if (_i != null && _v != null) {
|
|
|
|
+// sheet.setColumnWidth(_i, MSExcelUtil.heightUnits2Pixel(_v.shortValue()));
|
|
|
|
+ // TODO 乘以32,有待商榷
|
|
|
|
+ sheet.setColumnWidth(_i, _v * 32);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (config.containsKey("rowlen")) {
|
|
|
|
+ JSONObject rowlen = config.getJSONObject("rowlen");
|
|
|
|
+ if (rowlen != null) {
|
|
|
|
+ for (String k : rowlen.keySet()) {
|
|
|
|
+ Integer _i = getStrToInt(k);
|
|
|
|
+ Integer _v = getStrToInt(rowlen.get(k).toString());
|
|
|
|
+ if (_i != null && _v != null) {
|
|
|
|
+ Row row = sheet.getRow(_i);
|
|
|
|
+ if (row != null) {
|
|
|
|
+// row.setHeightInPoints(MSExcelUtil.pixel2WidthUnits(_v.shortValue()));
|
|
|
|
+ row.setHeightInPoints(_v.shortValue());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 单元格字体相关样式
|
|
|
|
+ *
|
|
|
|
+ * @param wb
|
|
|
|
+ * @param style
|
|
|
|
+ * @param dbObject
|
|
|
|
+ */
|
|
|
|
+ private static void setCellStyleFont(Workbook wb, CellStyle style, JSONObject dbObject) {
|
|
|
|
+ Font font = wb.createFont();
|
|
|
|
+ style.setFont(font);
|
|
|
|
+
|
|
|
|
+ //ff 字体
|
|
|
|
+ if (dbObject.containsKey("ff")) {
|
|
|
|
+ if (dbObject.get("ff") instanceof Integer) {
|
|
|
|
+ Integer _v = getIntByDBObject(dbObject, "ff");
|
|
|
|
+ if (_v != null && ConstantUtil.ff_IntegerToName.containsKey(_v)) {
|
|
|
|
+ font.setFontName(ConstantUtil.ff_IntegerToName.get(_v));
|
|
|
|
+ }
|
|
|
|
+ } else if (dbObject.get("ff") instanceof String) {
|
|
|
|
+ font.setFontName(getByDBObject(dbObject, "ff"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //fc 字体颜色
|
|
|
|
+ if (dbObject.containsKey("fc")) {
|
|
|
|
+ String _v = getByDBObject(dbObject, "fc");
|
|
|
|
+ Short _color = ColorUtil.getColorByStr(_v);
|
|
|
|
+ if (_color != null) {
|
|
|
|
+ font.setColor(_color);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //bl 粗体
|
|
|
|
+ if (dbObject.containsKey("bl")) {
|
|
|
|
+ Integer _v = getIntByDBObject(dbObject, "bl");
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ if (_v.equals(1)) {
|
|
|
|
+ //是否粗体显示
|
|
|
|
+ font.setBold(true);
|
|
|
|
+ } else {
|
|
|
|
+ font.setBold(false);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //it 斜体
|
|
|
|
+ if (dbObject.containsKey("it")) {
|
|
|
|
+ Integer _v = getIntByDBObject(dbObject, "it");
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ if (_v.equals(1)) {
|
|
|
|
+ font.setItalic(true);
|
|
|
|
+ } else {
|
|
|
|
+ font.setItalic(false);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //fs 字体大小
|
|
|
|
+ if (dbObject.containsKey("fs")) {
|
|
|
|
+ Integer _v = getStrToInt(getObjectByDBObject(dbObject, "fs"));
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ font.setFontHeightInPoints(_v.shortValue());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //cl 删除线 (导入没有) 0 常规 、 1 删除线
|
|
|
|
+ if (dbObject.containsKey("cl")) {
|
|
|
|
+ Integer _v = getIntByDBObject(dbObject, "cl");
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ if (_v.equals(1)) {
|
|
|
|
+ font.setStrikeout(true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //ul 下划线
|
|
|
|
+ if (dbObject.containsKey("ul")) {
|
|
|
|
+ Integer _v = getIntByDBObject(dbObject, "ul");
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ if (_v.equals(1)) {
|
|
|
|
+ font.setUnderline(Font.U_SINGLE);
|
|
|
|
+ } else {
|
|
|
|
+ font.setUnderline(Font.U_NONE);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置cell边框颜色样式
|
|
|
|
+ *
|
|
|
|
+ * @param style 样式
|
|
|
|
+ * @param dbObject json对象
|
|
|
|
+ * @param bs 样式
|
|
|
|
+ * @param bc 样式
|
|
|
|
+ */
|
|
|
|
+ private static void setBorderStyle(CellStyle style, JSONObject dbObject, String bs, String bc) {
|
|
|
|
+ //bs 边框样式
|
|
|
|
+ if (dbObject.containsKey(bs)) {
|
|
|
|
+ Integer _v = getStrToInt(getByDBObject(dbObject, bs));
|
|
|
|
+ if (_v != null) {
|
|
|
|
+ //边框没有,不作改变
|
|
|
|
+ if (bs.equals("bs") || bs.equals("bs_t")) {
|
|
|
|
+ style.setBorderTop(BorderStyle.valueOf(_v.shortValue()));
|
|
|
|
+ }
|
|
|
|
+ if (bs.equals("bs") || bs.equals("bs_b")) {
|
|
|
|
+ style.setBorderBottom(BorderStyle.valueOf(_v.shortValue()));
|
|
|
|
+ }
|
|
|
|
+ if (bs.equals("bs") || bs.equals("bs_l")) {
|
|
|
|
+ style.setBorderLeft(BorderStyle.valueOf(_v.shortValue()));
|
|
|
|
+ }
|
|
|
|
+ if (bs.equals("bs") || bs.equals("bs_r")) {
|
|
|
|
+ style.setBorderRight(BorderStyle.valueOf(_v.shortValue()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //bc 边框颜色
|
|
|
|
+ String _vcolor = getByDBObject(dbObject, bc);
|
|
|
|
+ if (_vcolor != null) {
|
|
|
|
+ Short _color = ColorUtil.getColorByStr(_vcolor);
|
|
|
|
+ if (_color != null) {
|
|
|
|
+ if (bc.equals("bc") || bc.equals("bc_t")) {
|
|
|
|
+ style.setTopBorderColor(_color);
|
|
|
|
+ }
|
|
|
|
+ if (bc.equals("bc") || bc.equals("bc_b")) {
|
|
|
|
+ style.setBottomBorderColor(_color);
|
|
|
|
+ }
|
|
|
|
+ if (bc.equals("bc") || bc.equals("bc_l")) {
|
|
|
|
+ style.setLeftBorderColor(_color);
|
|
|
|
+ }
|
|
|
|
+ if (bc.equals("bc") || bc.equals("bc_r")) {
|
|
|
|
+ style.setRightBorderColor(_color);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置单元格格式 ct 单元格值格式 (fa,t)
|
|
|
|
+ *
|
|
|
|
+ * @param cell
|
|
|
|
+ * @param style
|
|
|
|
+ * @param dbObject
|
|
|
|
+ */
|
|
|
|
+ private static void setFormatByCt(Workbook wb, Cell cell, CellStyle style, JSONObject dbObject) {
|
|
|
|
+
|
|
|
|
+ if (!dbObject.containsKey("v") && dbObject.containsKey("ct")) {
|
|
|
|
+ /* 处理以下数据结构
|
|
|
|
+ {
|
|
|
|
+ "celldata": [{
|
|
|
|
+ "c": 0,
|
|
|
|
+ "r": 8,
|
|
|
|
+ "v": {
|
|
|
|
+ "ct": {
|
|
|
|
+ "s": [{
|
|
|
|
+ "v": "sdsdgdf\r\ndfgdfg\r\ndsfgdfgdf\r\ndsfgdfg"
|
|
|
|
+ }],
|
|
|
|
+ "t": "inlineStr",
|
|
|
|
+ "fa": "General"
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }]
|
|
|
|
+ }
|
|
|
|
+ */
|
|
|
|
+ JSONObject ct = dbObject.getJSONObject("ct");
|
|
|
|
+ if (ct.containsKey("s")) {
|
|
|
|
+ Object s = ct.get("s");
|
|
|
|
+ if (s instanceof List && ((List) s).size() > 0) {
|
|
|
|
+ JSONObject _s1 = (JSONObject) ((List) s).get(0);
|
|
|
|
+ if (_s1.containsKey("v") && _s1.get("v") instanceof String) {
|
|
|
|
+ dbObject.put("v", _s1.get("v"));
|
|
|
|
+ style.setWrapText(true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //String v = ""; //初始化
|
|
|
|
+ if (dbObject.containsKey("v")) {
|
|
|
|
+ //v = v_json.get("v").toString();
|
|
|
|
+ //取到v后,存到poi单元格对象
|
|
|
|
+ //设置该单元格值
|
|
|
|
+ //cell.setValue(v);
|
|
|
|
+
|
|
|
|
+ //String v=getByDBObject(v_json,"v");
|
|
|
|
+ //cell.setValue(v);
|
|
|
|
+ Object obj = getObjectByDBObject(dbObject, "v");
|
|
|
|
+ if (obj instanceof Number) {
|
|
|
|
+ cell.setCellValue(Double.valueOf(obj.toString()));
|
|
|
|
+ } else if (obj instanceof Double) {
|
|
|
|
+ cell.setCellValue((Double) obj);
|
|
|
|
+ } else if (obj instanceof Date) {
|
|
|
|
+ cell.setCellValue((Date) obj);
|
|
|
|
+ } else if (obj instanceof Calendar) {
|
|
|
|
+ cell.setCellValue((Calendar) obj);
|
|
|
|
+ } else if (obj instanceof RichTextString) {
|
|
|
|
+ cell.setCellValue((RichTextString) obj);
|
|
|
|
+ } else if (obj instanceof String) {
|
|
|
|
+ cell.setCellValue((String) obj);
|
|
|
|
+ } else {
|
|
|
|
+ cell.setCellValue(obj.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (dbObject.containsKey("ct")) {
|
|
|
|
+ JSONObject ct = dbObject.getJSONObject("ct");
|
|
|
|
+ if (ct.containsKey("fa") && ct.containsKey("t")) {
|
|
|
|
+ //t 0=bool,1=datetime,2=error,3=null,4=numeric,5=string,6=unknown
|
|
|
|
+ String fa = getByDBObject(ct, "fa"); //单元格格式format定义串
|
|
|
|
+ String t = getByDBObject(ct, "t"); //单元格格式type类型
|
|
|
|
+
|
|
|
|
+ Integer _i = ConstantUtil.getNumberFormatMap(fa);
|
|
|
|
+ switch (t) {
|
|
|
|
+ case "s": {
|
|
|
|
+ //字符串
|
|
|
|
+ if (_i >= 0) {
|
|
|
|
+ style.setDataFormat(_i.shortValue());
|
|
|
|
+ } else {
|
|
|
|
+ style.setDataFormat((short) 0);
|
|
|
|
+ }
|
|
|
|
+ cell.setCellType(CellType.STRING);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "d": {
|
|
|
|
+ //日期
|
|
|
|
+ Date _d = null;
|
|
|
|
+ String v = getByDBObject(dbObject, "m");
|
|
|
|
+ if (v.length() == 0) {
|
|
|
|
+ v = getByDBObject(dbObject, "v");
|
|
|
|
+ }
|
|
|
|
+ if (v.length() > 0) {
|
|
|
|
+ if (v.indexOf("-") > -1) {
|
|
|
|
+ if (v.indexOf(":") > -1) {
|
|
|
|
+ _d = ConstantUtil.stringToDateTime(v);
|
|
|
|
+ } else {
|
|
|
|
+ _d = ConstantUtil.stringToDate(v);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ _d = ConstantUtil.toDate(v);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (_d != null) {
|
|
|
|
+ //能转换为日期
|
|
|
|
+ cell.setCellValue(_d);
|
|
|
|
+ DataFormat format = wb.createDataFormat();
|
|
|
|
+ style.setDataFormat(format.getFormat(fa));
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+ //不能转换为日期
|
|
|
|
+ if (_i >= 0) {
|
|
|
|
+ style.setDataFormat(_i.shortValue());
|
|
|
|
+ } else {
|
|
|
|
+ style.setDataFormat((short) 0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "b": {
|
|
|
|
+ //逻辑
|
|
|
|
+ cell.setCellType(CellType.BOOLEAN);
|
|
|
|
+ if (_i >= 0) {
|
|
|
|
+ style.setDataFormat(_i.shortValue());
|
|
|
|
+ } else {
|
|
|
|
+ DataFormat format = wb.createDataFormat();
|
|
|
|
+ style.setDataFormat(format.getFormat(fa));
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "n": {
|
|
|
|
+ //数值
|
|
|
|
+// cell.setCellType(CellType.NUMERIC);
|
|
|
|
+ //数字转字符串
|
|
|
|
+ cell.setCellType(CellType.STRING);
|
|
|
|
+ if (_i >= 0) {
|
|
|
|
+ style.setDataFormat(_i.shortValue());
|
|
|
|
+ } else {
|
|
|
|
+ DataFormat format = wb.createDataFormat();
|
|
|
|
+ style.setDataFormat(format.getFormat(fa));
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "u":
|
|
|
|
+ case "g": {
|
|
|
|
+ //general 自动类型
|
|
|
|
+ //cell.setCellType(CellType._NONE);
|
|
|
|
+ if (_i >= 0) {
|
|
|
|
+ style.setDataFormat(_i.shortValue());
|
|
|
|
+ } else {
|
|
|
|
+ DataFormat format = wb.createDataFormat();
|
|
|
|
+ style.setDataFormat(format.getFormat(fa));
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ case "e": {
|
|
|
|
+ //错误
|
|
|
|
+ cell.setCellType(CellType.ERROR);
|
|
|
|
+ if (_i >= 0) {
|
|
|
|
+ style.setDataFormat(_i.shortValue());
|
|
|
|
+ } else {
|
|
|
|
+ DataFormat format = wb.createDataFormat();
|
|
|
|
+ style.setDataFormat(format.getFormat(fa));
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 内容按行分组
|
|
|
|
+ *
|
|
|
|
+ * @param cells
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static Map<Integer, List<JSONObject>> cellGroup(List<JSONObject> cells) {
|
|
|
|
+ Map<Integer, List<JSONObject>> cellMap = new HashMap<>(100);
|
|
|
|
+ for (JSONObject dbObject : cells) {
|
|
|
|
+ //行号
|
|
|
|
+ if (dbObject.containsKey("r")) {
|
|
|
|
+ Integer r = getStrToInt(dbObject.get("r"));
|
|
|
|
+ if (r != null) {
|
|
|
|
+ if (cellMap.containsKey(r)) {
|
|
|
|
+ cellMap.get(r).add(dbObject);
|
|
|
|
+ } else {
|
|
|
|
+ List<JSONObject> list = new ArrayList<>(10);
|
|
|
|
+ list.add(dbObject);
|
|
|
|
+ cellMap.put(r, list);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return cellMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取一个k的值
|
|
|
|
+ *
|
|
|
|
+ * @param b
|
|
|
|
+ * @param k
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static String getByDBObject(JSONObject b, String k) {
|
|
|
|
+ if (b.containsKey(k)) {
|
|
|
|
+ if (b.get(k) != null && b.get(k) instanceof String) {
|
|
|
|
+ return b.getString(k);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取一个k的值
|
|
|
|
+ *
|
|
|
|
+ * @param b
|
|
|
|
+ * @param k
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static Object getObjectByDBObject(JSONObject b, String k) {
|
|
|
|
+ if (b.containsKey(k)) {
|
|
|
|
+ if (b.get(k) != null) {
|
|
|
|
+ return b.get(k);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 没有/无法转换 返回null
|
|
|
|
+ *
|
|
|
|
+ * @param b
|
|
|
|
+ * @param k
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static Integer getIntByDBObject(JSONObject b, String k) {
|
|
|
|
+ if (b.containsKey(k)) {
|
|
|
|
+ if (b.get(k) != null) {
|
|
|
|
+ try {
|
|
|
|
+ String _s = b.getString(k).replace("px", "");
|
|
|
|
+ Double _d = Double.parseDouble(_s);
|
|
|
|
+ return _d.intValue();
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ log.error(ex.getMessage());
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 转int
|
|
|
|
+ *
|
|
|
|
+ * @param str
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private static Integer getStrToInt(Object str) {
|
|
|
|
+ try {
|
|
|
|
+ if (str != null) {
|
|
|
|
+ return Integer.parseInt(str.toString());
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ log.error("String:{};Error:{}", str, ex.getMessage());
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static Short getStrToShort(Object str) {
|
|
|
|
+ try {
|
|
|
|
+ if (str != null) {
|
|
|
|
+ return Short.parseShort(str.toString());
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ log.error("String:{};Error:{}", str, ex.getMessage());
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|