BudgetExcelUtil.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package cn.com.lzt.budget.data.util;
  2. import org.apache.commons.lang.StringUtils;
  3. import org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayGetAtMetaMethod;
  4. import org.springframework.data.util.Pair;
  5. import java.util.ArrayList;
  6. import java.util.Collections;
  7. import java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. public class BudgetExcelUtil {
  11. //如输入A12获得是第12行的。
  12. public static int row(String cellName) {
  13. Pattern p = Pattern.compile("\\d+");
  14. Matcher m = p.matcher(cellName);
  15. Integer row = null;
  16. while (m.find()){
  17. row = Integer.valueOf(m.group());
  18. row--;
  19. }
  20. if(row==null){
  21. System.out.println(cellName);
  22. }
  23. return row;
  24. }
  25. //通过单元格名获得列号。如输入AB12,对应的列号为28列
  26. public static int column(String cellName) {
  27. int column=0;
  28. char[] c=cellName.toUpperCase().toCharArray();
  29. int index=0;
  30. while(index<c.length)
  31. {
  32. if(c[index]<'A'||c[index]>'Z')
  33. break;
  34. column=column*26+(c[index]-'A'+1);
  35. index++;
  36. }
  37. return column-1;
  38. }
  39. //通过给定一个行号,列号,得到一个单元格名称如给定12行,28列;得到的是AB12
  40. public static String cellName(int row,int col){
  41. row++;col++;
  42. ArrayList<Character> list=new ArrayList();
  43. while(col>0)
  44. {
  45. list.add((char) ((col-1)%26+'A'));
  46. col=(col-1)/26;
  47. }
  48. StringBuffer buffer=new StringBuffer();
  49. for(int i=list.size()-1;i>=0;i--)
  50. buffer.append(list.get(i));
  51. buffer.append(""+row);
  52. return buffer.toString();
  53. }
  54. /**
  55. * 比如,通过A1:B3返回的是A1,B1,A2,B2,A3,B3
  56. * @return
  57. */
  58. public static List<String> cellNames(String cellStr)
  59. {
  60. if(cellStr==null)
  61. return null;
  62. cellStr = StringUtils.remove(cellStr,"$" );
  63. String[] splits=cellStr.split(":");
  64. if(splits.length>=3) {
  65. // throw new IllegalArgumentException("输入格式有误! 多个:"+cellStr);
  66. return Collections.emptyList();
  67. }else if (splits.length==2) {
  68. int startrow = row(splits[0]);
  69. int startcolumn = column(splits[0]);
  70. int endrow = row(splits[1]);
  71. int endcolumn = column(splits[1]);
  72. if (startrow > endrow || startcolumn > endcolumn)
  73. throw new IllegalArgumentException("输入格式有误! 请保证左上->右下");
  74. ArrayList<String> list = new ArrayList<>();
  75. for (int i = startrow; i <= endrow; i++)//保证先行后列
  76. for (int j = startcolumn; j <= endcolumn; j++) {
  77. list.add(cellName(i,j));
  78. }
  79. return list;
  80. }else {// ,分割的多列 或单列
  81. ArrayList<String> list = new ArrayList<>();
  82. splits = cellStr.split(",");
  83. for(int i=0;i<splits.length;i++){
  84. Integer row = row(splits[i]);
  85. Integer col = column(splits[i]);
  86. list.add(cellName(row,col));
  87. }
  88. return list;
  89. }
  90. }
  91. public static void main(String[] args) {
  92. }
  93. }