用JS做了一个POI表头合并语句的生成器
最近的项目里面要用到POI,不得不说,这比我之前用到的PHPExcel的效率高太多了,本来是件很轻松的事情了。结果碰到的问题就是这个项目的部署限制非常多,不允许在项目目录下放置Excel模板文件,也不允许在数据库中使用BLOB字段存放模板。这样就导致需要手动的将现有的Excel文件的标头用POI语句写出来。
本来这个事情也不算是个很困难的问题,但是碰到一些特别复杂的多行标头,麻烦就来了……因为行特别多,合并单元格需要数来数去的很麻烦,这就让我萌生了想要自动化完成的想法。
还好,Excel自07版之后就是以XML文件为基础的,不再是以二进制文件为基础的了,这样就不需要借助一些第三方工具来读取二进制的配置,只需要把相关的XLSX模板转化为XML文件,然后对XML文件进行操作就好了。
演示在这里
具体的使用方式如下:
本来这个事情也不算是个很困难的问题,但是碰到一些特别复杂的多行标头,麻烦就来了……因为行特别多,合并单元格需要数来数去的很麻烦,这就让我萌生了想要自动化完成的想法。
还好,Excel自07版之后就是以XML文件为基础的,不再是以二进制文件为基础的了,这样就不需要借助一些第三方工具来读取二进制的配置,只需要把相关的XLSX模板转化为XML文件,然后对XML文件进行操作就好了。
演示在这里
具体的使用方式如下:
- 首先先把模板文件另存为Excel 07以上的格式,即XLSX格式。
- 将文件的后缀名改为RAR,例如原有的为01.xlsx,变更后即为01.rar。
- 用WinRAR或者其他压缩工具解包。得到一个文件夹。提取其中的xl/worksheets/sheet1.xml文件。(如果有多个标签页,应该是挨个编号的)
- 把内容拷贝到下面的文本框中,点生成语句,就会自动生成POI语句了。
源代码如下:
$().ready(function(){
$("#submit").click(function(){
if($("#input").val() == ""){
alert("请输入内容!");
return false;
}
//开始从XML文件中把列抓出来
var str = $("#input").val();
str = str.replace(/^[\s\S]+/,"");
str = str.replace(/<\/mergeCells>[\s\S]+$/,"");
str = str.replace(//,"");
var mergeCells = str.split(",");
//取出所有的合并行
var printline = "";
for(var cells in mergeCells){
if(mergeCells[cells].search(/:/) != "-1"){
//切出起始格和结束格
var linen = mergeCells[cells].split(":");
//切出起始行和结束行,取出字母作为竖轴
var colStart = linen[0].replace(/[0-9]+/,"");
var rowStart = linen[0].replace(/[A-Z]+/,"") - 1;
var colEnd = linen[1].replace(/[0-9]+/,"");
var rowEnd = linen[1].replace(/[A-Z]+/,"") - 1;
/**/
printline += "sheet.addMergedRegion(new Region("+rowStart+", (short) "+AAtoNum(colStart)+", "+rowEnd+", (short) "+AAtoNum(colEnd)+"));\n";
}
}
$("#result").val(printline);
$("#result").show();
});
});
//多行的字符转数字
function AAtoNum(str){
var length = str.length;
var num = 0;
//这段在IE下有兼容性问题
/*for(var chars in str){
num += AtoNum(str[chars])*(Math.pow(26,length-chars-1));
}*/
for(var chars = 0; chars < length; chars++){
num += AtoNum(str[chars])*(Math.pow(26,length-chars-1));
}
return num-1;
}
//单行字符转数字
function AtoNum(str){
switch(str){
case "A":
return 1;
case "B":
return 2;
case "C":
return 3;
case "D":
return 4;
case "E":
return 5;
case "F":
return 6;
case "G":
return 7;
case "H":
return 8;
case "I":
return 9;
case "J":
return 10;
case "K":
return 11;
case "L":
return 12;
case "M":
return 13;
case "N":
return 14;
case "O":
return 15;
case "P":
return 16;
case "Q":
return 17;
case "R":
return 18;
case "S":
return 19;
case "T":
return 20;
case "U":
return 21;
case "V":
return 22;
case "W":
return 23;
case "X":
return 24;
case "Y":
return 25;
case "Z":
return 26;
}
}
评论
发表评论