|
@@ -0,0 +1,313 @@
|
|
|
+package com.anjiplus.template.gaea.business.modules.reportexcel.util;
|
|
|
+
|
|
|
+
|
|
|
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
|
|
+import org.apache.poi.ss.usermodel.VerticalAlignment;
|
|
|
+
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 来自:https://github.com/mengshukeji/LuckysheetServer
|
|
|
+ *
|
|
|
+ * @author cr
|
|
|
+ */
|
|
|
+public class ConstantUtil {
|
|
|
+ /**
|
|
|
+ * 导出。字体转换
|
|
|
+ */
|
|
|
+ public static Map<Integer, String> ff_IntegerToName = new HashMap<Integer, String>();
|
|
|
+ /**
|
|
|
+ * 导入。字体转换
|
|
|
+ */
|
|
|
+ public static Map<String, Integer> ff_NameToInteger = new HashMap<String, Integer>();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导入 36种数字格式。注意官方文档的编号不是连续的,22后面直接是37,所以数组中间补14个空值
|
|
|
+ */
|
|
|
+ public static String[] number_type = null;
|
|
|
+ /**
|
|
|
+ * 导入 36种格式的定义字符串
|
|
|
+ */
|
|
|
+ public static String[] number_format = null;
|
|
|
+ /**
|
|
|
+ * 数据类型
|
|
|
+ */
|
|
|
+ public static Map<String, Integer> number_format_map = new HashMap<String, Integer>();
|
|
|
+
|
|
|
+ static {
|
|
|
+ //格式
|
|
|
+ nf();
|
|
|
+ //字体
|
|
|
+ ff();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void nf() {
|
|
|
+ number_type = new String[]{
|
|
|
+ "General", "Decimal", "Decimal", "Decimal", "Decimal", "Currency", "Currency", "Currency", "Currency",
|
|
|
+ "Percentage", "Percentage", "Scientific", "Fraction", "Fraction", "Date", "Date", "Date", "Date",
|
|
|
+ "Time", "Time", "Time", "Time", "Time",
|
|
|
+ "", "", "", "", "", "", "", "", "", "", "", "", "", "",
|
|
|
+ "Accounting", "Accounting", "Accounting", "Accounting", "Accounting",
|
|
|
+ "Currency", "Accounting", "Currency", "Time", "Time", "Time", "Scientific", "Text"
|
|
|
+ };
|
|
|
+
|
|
|
+ number_format = new String[]{
|
|
|
+ "General", "0", "0.00", "#,##0", "#,##0.00", "$#,##0;($#,##0)", "$#,##0;[Red]($#,##0)", "$#,##0.00;($#,##0.00)", "$#,##0.00;[Red]($#,##0.00)",
|
|
|
+ "0%", "0.00%", "0.00E+00", "# ?/?", "# ??/??", "m/d/yyyy", "d-mmm-yy", "d-mmm", "mmm-yy",
|
|
|
+ "h:mm AM/PM", "h:mm:ss AM/PM", "h:mm", "h:mm:ss", "m/d/yyyy h:mm",
|
|
|
+ "", "", "", "", "", "", "", "", "", "", "", "", "", "",
|
|
|
+ "#,##0;(#,##0)", "#,##0;[Red](#,##0)", "#,##0.00;(#,##0.00)", "#,##0.00;[Red](#,##0.00)", "_ * #,##0_ ;_ * (#,##0)_ ;_ * \"-\"_ ;_ @_",
|
|
|
+ "_ $* #,##0_ ;_ $* (#,##0)_ ;_ $* \"-\"_ ;_ @_", "_ * #,##0.00_ ;_ * (#,##0.00)_ ;_ * \"-\"??_ ;_ @_", "_ $* #,##0.00_ ;_ $* (#,##0.00)_ ;_ $* \"-\"??_ ;_ @_", "mm:ss", "[h]:mm:ss", "mm:ss.0", "##0.0E+00", "@"
|
|
|
+ };
|
|
|
+ for (int x = 0; x < number_format.length; x++) {
|
|
|
+ if (number_format[x].length() > 0) {
|
|
|
+ number_format_map.put(number_format[x].toLowerCase(), x);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void ff() {
|
|
|
+ //0 微软雅黑、1 宋体(Song)、2 黑体(ST Heiti)、3 楷体(ST Kaiti)、 4仿宋(ST FangSong)、 5 新宋体(ST Song)、
|
|
|
+ // 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
|
|
|
+ ff_IntegerToName.put(0, "微软雅黑");
|
|
|
+ ff_IntegerToName.put(1, "宋体");
|
|
|
+ ff_IntegerToName.put(2, "黑体");
|
|
|
+ ff_IntegerToName.put(3, "楷体");
|
|
|
+ ff_IntegerToName.put(4, "仿宋");
|
|
|
+ ff_IntegerToName.put(5, "新宋体");
|
|
|
+ ff_IntegerToName.put(6, "华文新魏");
|
|
|
+ ff_IntegerToName.put(7, "华文行楷");
|
|
|
+ ff_IntegerToName.put(8, "华文隶书");
|
|
|
+ ff_IntegerToName.put(9, "Arial");
|
|
|
+ ff_IntegerToName.put(10, "Times New Roman");
|
|
|
+ ff_IntegerToName.put(11, "Tahoma");
|
|
|
+ ff_IntegerToName.put(12, "Verdana");
|
|
|
+
|
|
|
+ //0 微软雅黑、1 宋体(Song)、2 黑体(ST Heiti)、3 楷体(ST Kaiti)、 4仿宋(ST FangSong)、 5 新宋体(ST Song)、
|
|
|
+ // 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
|
|
|
+ ff_NameToInteger.put("微软雅黑", 0);
|
|
|
+ ff_NameToInteger.put("宋体", 1);
|
|
|
+ ff_NameToInteger.put("Song", 1);
|
|
|
+ ff_NameToInteger.put("黑体", 2);
|
|
|
+ ff_NameToInteger.put("ST Heiti", 2);
|
|
|
+ ff_NameToInteger.put("楷体", 3);
|
|
|
+ ff_NameToInteger.put("ST Kaiti", 3);
|
|
|
+ ff_NameToInteger.put("仿宋", 4);
|
|
|
+ ff_NameToInteger.put("ST FangSong", 4);
|
|
|
+ ff_NameToInteger.put("新宋体", 5);
|
|
|
+ ff_NameToInteger.put("ST Song", 5);
|
|
|
+ ff_NameToInteger.put("华文新魏", 6);
|
|
|
+ ff_NameToInteger.put("华文行楷", 7);
|
|
|
+ ff_NameToInteger.put("华文隶书", 8);
|
|
|
+ ff_NameToInteger.put("Arial", 9);
|
|
|
+ ff_NameToInteger.put("Times New Roman", 10);
|
|
|
+ ff_NameToInteger.put("Tahoma", 11);
|
|
|
+ ff_NameToInteger.put("Verdana", 12);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void borderType() {
|
|
|
+ //"border-left" | "border-right" | "border-top" | "border-bottom" | "border-all"
|
|
|
+ // | "border-outside" | "border-inside" | "border-horizontal" | "border-vertical" | "border-none"
|
|
|
+ ff_IntegerToName.put(0, "微软雅黑");
|
|
|
+ ff_IntegerToName.put(1, "宋体");
|
|
|
+ ff_IntegerToName.put(2, "黑体");
|
|
|
+ ff_IntegerToName.put(3, "楷体");
|
|
|
+ ff_IntegerToName.put(4, "仿宋");
|
|
|
+ ff_IntegerToName.put(5, "新宋体");
|
|
|
+ ff_IntegerToName.put(6, "华文新魏");
|
|
|
+ ff_IntegerToName.put(7, "华文行楷");
|
|
|
+ ff_IntegerToName.put(8, "华文隶书");
|
|
|
+ ff_IntegerToName.put(9, "Arial");
|
|
|
+ ff_IntegerToName.put(10, "Times New Roman");
|
|
|
+ ff_IntegerToName.put(11, "Tahoma");
|
|
|
+ ff_IntegerToName.put(12, "Verdana");
|
|
|
+
|
|
|
+ //0 微软雅黑、1 宋体(Song)、2 黑体(ST Heiti)、3 楷体(ST Kaiti)、 4仿宋(ST FangSong)、 5 新宋体(ST Song)、
|
|
|
+ // 6 华文新魏、 7华文行楷、 8 华文隶书、 9 Arial、 10 Times New Roman 、11 Tahoma 、12 Verdana
|
|
|
+ ff_NameToInteger.put("微软雅黑", 0);
|
|
|
+ ff_NameToInteger.put("宋体", 1);
|
|
|
+ ff_NameToInteger.put("Song", 1);
|
|
|
+ ff_NameToInteger.put("黑体", 2);
|
|
|
+ ff_NameToInteger.put("ST Heiti", 2);
|
|
|
+ ff_NameToInteger.put("楷体", 3);
|
|
|
+ ff_NameToInteger.put("ST Kaiti", 3);
|
|
|
+ ff_NameToInteger.put("仿宋", 4);
|
|
|
+ ff_NameToInteger.put("ST FangSong", 4);
|
|
|
+ ff_NameToInteger.put("新宋体", 5);
|
|
|
+ ff_NameToInteger.put("ST Song", 5);
|
|
|
+ ff_NameToInteger.put("华文新魏", 6);
|
|
|
+ ff_NameToInteger.put("华文行楷", 7);
|
|
|
+ ff_NameToInteger.put("华文隶书", 8);
|
|
|
+ ff_NameToInteger.put("Arial", 9);
|
|
|
+ ff_NameToInteger.put("Times New Roman", 10);
|
|
|
+ ff_NameToInteger.put("Tahoma", 11);
|
|
|
+ ff_NameToInteger.put("Verdana", 12);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按自定义格式
|
|
|
+ *
|
|
|
+ * @param fa
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Integer getNumberFormatMap(String fa) {
|
|
|
+ if (number_format_map.containsKey(fa.toLowerCase())) {
|
|
|
+ return number_format_map.get(fa.toLowerCase());
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取poi表格垂直对齐 0 中间、1 上、2下
|
|
|
+ *
|
|
|
+ * @param i
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static VerticalAlignment getVerticalType(int i) {
|
|
|
+ if (0 == i) {
|
|
|
+ return VerticalAlignment.CENTER;
|
|
|
+ } else if (1 == i) {
|
|
|
+ return VerticalAlignment.TOP;
|
|
|
+ } else if (2 == i) {
|
|
|
+ return VerticalAlignment.BOTTOM;
|
|
|
+ }
|
|
|
+ //默认居中
|
|
|
+ return VerticalAlignment.CENTER;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取poi表格水平对齐 0 居中、1 左、2右
|
|
|
+ *
|
|
|
+ * @param i
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static HorizontalAlignment getHorizontaltype(int i) {
|
|
|
+ if (2 == i) {
|
|
|
+ return HorizontalAlignment.RIGHT;
|
|
|
+ } else if (1 == i) {
|
|
|
+ return HorizontalAlignment.LEFT;
|
|
|
+ } else if (0 == i) {
|
|
|
+ return HorizontalAlignment.CENTER;
|
|
|
+ }
|
|
|
+ //默认右
|
|
|
+ return HorizontalAlignment.RIGHT;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 文字旋转
|
|
|
+ * 文字旋转角度(0=0,1=45,2=-45,3=竖排文字,4=90,5=-90)
|
|
|
+ *
|
|
|
+ * @param i
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static short getRotation(int i) {
|
|
|
+ short t = 0;
|
|
|
+ switch (i) {
|
|
|
+ case 1:
|
|
|
+ t = 45;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ t = -45;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ t = 255;
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ t = 90;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ t = -90;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ t = 0;
|
|
|
+ }
|
|
|
+ return t;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private static SimpleDateFormat df_DateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ public static Date stringToDateTime(String date) {
|
|
|
+ if (date == null || date.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return df_DateTime.parse(date);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static SimpleDateFormat df_Date = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+
|
|
|
+ public static Date stringToDate(String date) {
|
|
|
+ if (date == null || date.length() == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return df_Date.parse(date);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Date toDate(String numberString) {
|
|
|
+ try {
|
|
|
+ Double _d = Double.parseDouble(numberString);
|
|
|
+ String _s = toDate(_d, "yyyy-MM-dd HH:mm:ss");
|
|
|
+ if (numberString.indexOf(".") > -1) {
|
|
|
+ return stringToDate(_s);
|
|
|
+ } else {
|
|
|
+ return stringToDateTime(_s);
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception ex) {
|
|
|
+ System.out.println(ex.toString() + " " + numberString);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static final int SECONDS_PER_MINUTE = 60;
|
|
|
+ private static final int MINUTES_PER_HOUR = 60;
|
|
|
+ private static final int HOURS_PER_DAY = 24;
|
|
|
+ private static final int SECONDS_PER_DAY = (HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE);
|
|
|
+ /**
|
|
|
+ * 一天的毫秒数
|
|
|
+ **/
|
|
|
+ private static final long DAY_MILLISECONDS = SECONDS_PER_DAY * 1000L;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换方法
|
|
|
+ *
|
|
|
+ * @parma numberString 要转换的浮点数
|
|
|
+ * @parma format 要获得的格式 例如"hh:mm:ss"
|
|
|
+ **/
|
|
|
+ public static String toDate(double numberString, String format) {
|
|
|
+ SimpleDateFormat sdFormat = new SimpleDateFormat(format);
|
|
|
+ int wholeDays = (int) Math.floor(numberString);
|
|
|
+ int millisecondsInday = (int) ((numberString - wholeDays) * DAY_MILLISECONDS + 0.5);
|
|
|
+ Calendar calendar = new GregorianCalendar();
|
|
|
+ setCalendar(calendar, wholeDays, millisecondsInday, false);
|
|
|
+ return sdFormat.format(calendar.getTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void setCalendar(Calendar calendar, int wholeDays,
|
|
|
+ int millisecondsInDay, boolean use1904windowing) {
|
|
|
+ int startYear = 1900;
|
|
|
+ int dayAdjust = -1; // Excel thinks 2/29/1900 is a valid date, which it isn't
|
|
|
+ if (use1904windowing) {
|
|
|
+ startYear = 1904;
|
|
|
+ dayAdjust = 1; // 1904 date windowing uses 1/2/1904 as the first day
|
|
|
+ } else if (wholeDays < 61) {
|
|
|
+ // Date is prior to 3/1/1900, so adjust because Excel thinks 2/29/1900 exists
|
|
|
+ // If Excel date == 2/29/1900, will become 3/1/1900 in Java representation
|
|
|
+ dayAdjust = 0;
|
|
|
+ }
|
|
|
+ calendar.set(startYear, 0, wholeDays + dayAdjust, 0, 0, 0);
|
|
|
+ calendar.set(GregorianCalendar.MILLISECOND, millisecondsInDay);
|
|
|
+ }
|
|
|
+}
|