跟大家分享一个巧妙的算法实现 算法javaexcel 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主,你一般用什么方法去读取excel,在我的项目中多用POI。 代码换成如下写法,估计你就能看得懂了,一开始我看这个方法的时候也不太明白,呵呵 /** * * <per> * 依据:低进制换算高进制:二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……(累加)</br> * 二进制数:0110 0100,转换为十进制为(从个位开始 右-->左):Math.pow(底数,指数)进行次幂运算</br> * 0 * 2^0 + 0 * 2^1 + 1 * 2^2 + 1 * 2^3 + 0 * 2^4 + 1 * 2^5 + 1 * 2^6 + 0 * 2^7 = 100</br> </br> * 延伸:将Excel列转换成索引:可以看做是十进制-->二十六进制 </br> * 二十六进制字母可以将每一个字母等价其ASIC码十进制的数值</br> * 示例:求AA列(65 65)的索引</br> * (65-64) * 260 + (65-64) * 261 = 27</br></br> * 说明:“二十六进制”的第一位(最小个位)就是A,ASIC码是65,所以每一个字母应相应减掉64,这样A(65)才是第一个</br> * </per> * @param strExcelColPlace Excel列字母 * @return 对应十进制整数的索引 */ public static int switchAlphabetPlace(String strExcelColPlace) { int exponent = 0; Double sum = 0.0; List<Double> itemList = new ArrayList<Double>(); strExcelColPlace = strExcelColPlace.toUpperCase(); byte[] arrByte = strExcelColPlace.getBytes(); for (int i = arrByte.length - 1; i >= 0; i--) { double itemValue = (arrByte[i] - 64) * Math.pow(26,exponent); itemList.add(itemValue); exponent++; } for (Double dv : itemList) { sum = sum + dv; } return sum.intValue() - 1; } 这个不需要用到Math.pow吧。。虽然效率不是什么问题,但不喜欢这种大材小用另外getBytes也似乎不太好吧,你不指定具体字符集,那就按默认编码,但不同机器上的默认编码不同,搞不好会弄出乱码,而且字符串本来就是char数组实现的,直接toCharArray不就好了,开销小,不需要像getBytes编码要进行很多繁琐的工作 public static int alphabetToInt(String alpha) { alpha = alpha.toUpperCase(); char[] chars = alpha.toCharArray(); int result = 0; for (int i = 0; i < chars.length; i++) { result *= 26; result += chars[i] - 64; } return result - 1; } 大家帮忙看看这个代码 File路径的问题 求助各位高手~~ 耽误你1分钟,帮忙解决个小问题(跟流相关) 初学者问一个错在static函数里的问题? 虚拟现实项目,不知如何报价?求救 高分征求:哪位高人给详细讲讲 wap push 的概念及应用? 100分请教:小弟KangTa问题:关于JTree树路径的问题!高手多帮忙! 急!组成字符串是有长度要求 4个字节(这四个字节表示数据长度)+数据, 图片处理的问题!给很多分的! 这个求质数的代码,怎么计数呢? 新手请教打球得分的java问题!
代码换成如下写法,估计你就能看得懂了,一开始我看这个方法的时候也不太明白,呵呵 /**
*
* <per>
* 依据:低进制换算高进制:二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……(累加)</br>
* 二进制数:0110 0100,转换为十进制为(从个位开始 右-->左):Math.pow(底数,指数)进行次幂运算</br>
* 0 * 2^0 + 0 * 2^1 + 1 * 2^2 + 1 * 2^3 + 0 * 2^4 + 1 * 2^5 + 1 * 2^6 + 0 * 2^7 = 100</br> </br>
* 延伸:将Excel列转换成索引:可以看做是十进制-->二十六进制 </br>
* 二十六进制字母可以将每一个字母等价其ASIC码十进制的数值</br>
* 示例:求AA列(65 65)的索引</br>
* (65-64) * 260 + (65-64) * 261 = 27</br></br>
* 说明:“二十六进制”的第一位(最小个位)就是A,ASIC码是65,所以每一个字母应相应减掉64,这样A(65)才是第一个</br>
* </per>
* @param strExcelColPlace Excel列字母
* @return 对应十进制整数的索引
*/
public static int switchAlphabetPlace(String strExcelColPlace)
{
int exponent = 0;
Double sum = 0.0;
List<Double> itemList = new ArrayList<Double>();
strExcelColPlace = strExcelColPlace.toUpperCase();
byte[] arrByte = strExcelColPlace.getBytes();
for (int i = arrByte.length - 1; i >= 0; i--) {
double itemValue = (arrByte[i] - 64) * Math.pow(26,exponent);
itemList.add(itemValue);
exponent++;
}
for (Double dv : itemList) {
sum = sum + dv;
}
return sum.intValue() - 1;
}
另外getBytes也似乎不太好吧,你不指定具体字符集,那就按默认编码,但不同机器上的默认编码不同,搞不好会弄出乱码,
而且字符串本来就是char数组实现的,直接toCharArray不就好了,开销小,不需要像getBytes编码要进行很多繁琐的工作 public static int alphabetToInt(String alpha) {
alpha = alpha.toUpperCase();
char[] chars = alpha.toCharArray();
int result = 0;
for (int i = 0; i < chars.length; i++) {
result *= 26;
result += chars[i] - 64;
}
return result - 1;
}