KDTable 表达式应用工具类

  近期在EAS开发过程中,由于表格内有很多需要联动处理的逻辑,比如,价格单元格变化后,需要联动计算金额,明细修改后需要联动处理合计值等,通常的处理是添加表格编辑事件,处理以上业务逻辑,经过研究发现KDTable是支持类似excel公式的,以下是开发过程中提供的工具方法,用于设置一些常用的公式,如:sum、加法、减法、IF等。
由于公式中使用的单元格索引,类似excel中的列头表示方式如:A1=sum(B1:B5),如何根据单元格索引获取对应的列头,着实耗费了一些时间。

  1 /**
  2       * 给单元格添加sum表达式
  3       * @param cell
  4       * @param from
  5       * @param to
  6       */
  7      public static void setCellSumExpr(ICell cell, int from, int to) {
  8          cell.setExpressions(getSumExpr(from, to));
  9      }
 10      
 11      /**
 12       * 给单元格添加IF表达式
 13       * @param cell
 14       * @param condExpr
 15       * @param expr1
 16       * @param expr2
 17       */
 18      public static void setCellIFExpr(ICell cell,String condExpr,String expr1,String expr2){
 19          cell.setExpressions(getIFExpr(condExpr, expr1, expr2));
 20      }
 21      
 22      /**
 23       * 给单元格添加Add表达式
 24       * @param cell
 25       * @param a
 26       * @param b
 27       */
 28      public static void setCellAddExpr(ICell cell,int a,int b){
 29          cell.setExpressions(getAddExpr(a, b));
 30      }
 31      
 32      /**
 33       * 给单元格添加Add表达式,允许不连续区域求和
 34       * @param cell
 35       * @param range
 36       */
 37      public static void setCellAddRangeExpr(ICell cell,int[] range){
 38          cell.setExpressions(getAddRangeExpr(range));
 39      }
 40      
 41      /**
 42       * 给单元格添加Substract表达式
 43       * @param cell
 44       * @param a
 45       * @param b
 46       */
 47      public static void setCellSubExpr(ICell cell,int a,int b){
 48          cell.setExpressions(getSubExpr(a, b));
 49      }
 50  
 51      // return =sum(from:to);
 52      public static String getSumExpr(int from, int to) {
 53          StringBuffer buff = new StringBuffer();
 54          buff.append("=SUM(").append(getExcelColumnLabel(from));
 55          buff.append(":").append(getExcelColumnLabel(to));
 56          buff.append(")");
 57          return buff.toString().intern();
 58      }
 59  
 60      // return =a+b
 61      public static String getAddExpr(int a, int b) {
 62          StringBuffer buff = new StringBuffer();
 63          buff.append("=").append(getExcelColumnLabel(a));
 64          buff.append("+").append(getExcelColumnLabel(b));
 65          return buff.toString().intern();
 66      }
 67  
 68      // return =range[0]+range[1]+...+range[n]
 69      public static String getAddRangeExpr(int[] range) {
 70          StringBuffer buff = new StringBuffer();
 71          buff.append("=");
 72  
 73          boolean flag = false;
 74          for (int i = 0, n = range.length; i < n; i++) {
 75              if (flag) {
 76                  buff.append("+");
 77              }
 78              buff.append(getExcelColumnLabel(range[i]));
 79              flag = true;
 80          }
 81          return buff.toString().intern();
 82      }
 83  
 84      // return =a-b
 85      public static String getSubExpr(int a, int b) {
 86          StringBuffer buff = new StringBuffer();
 87          buff.append("=").append(getExcelColumnLabel(a));
 88          buff.append("-").append(getExcelColumnLabel(b));
 89          return buff.toString().intern();
 90      }
 91  
 92      // retur =IF(condExpr,expr1,expr2);
 93      public static String getIFExpr(String condExpr, String expr1, String expr2) {
 94          StringBuffer buff = new StringBuffer();
 95          buff.append("=IF(").append(condExpr).append(",");
 96          buff.append(expr1).append(",").append(expr2);
 97          buff.append(")");
 98          return buff.toString();
 99      }
100  
101      /** 根据列的的位置获取列标,如A、AA、AB...采用类似进制转换的算法 */
102      public static String getExcelColumnLabel(int colCount) {
103          String rs = "";
104          do {
105              colCount--;
106              rs = ((char) (colCount % 26 + (int) 'A')) + rs;
107              colCount = (int) ((colCount - colCount % 26) / 26);
108          } while (colCount > 0);
109          return rs;
110      }
111  
112      /** 根据列标获取列的索引,采用类似进制转换的算法 */
113      public static int getExcelColumnIndex(String colName) {
114          if (colName == null || colName.equals("")) {
115              return -1;
116          }
117          colName = colName.toUpperCase();
118  
119          int count = -1;
120          char[] cs = colName.toCharArray();
121          for (int i = 0; i < cs.length; i++) {
122              count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
123          }
124          return count;
125      }
原文地址:https://www.cnblogs.com/masb/p/2853814.html