SheetJs解析EXCEL

SheetJs

不介绍了,自己百度吧。

上代码

要做的功能就是解析excel,并转换为sql脚本。

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JS-XLSX Live Demo</title>

    <style>
        #drop{
            border:2px dashed #bbb;
            -moz-border-radius:5px;
            -webkit-border-radius:5px;
            border-radius:5px;
            padding:25px;
            text-align:center;
            font:20pt bold,"Vollkorn";color:#bbb
        }
        #b64data{
            width:100%;
        }
        a { text-decoration: none }
        button{}
    </style>
</head>
<body>
<pre>
<input type="file" name="xlfile" id="xlf" onchange="importf(this)">
</pre>
<pre id="out"></pre>
<br>
<div id="demo"></div>

<script src="js/jquery-1.8.3.js"></script>
<script src="js/xlsx.full.min.js"></script>
<script>
    /*
          FileReader共有4种读取方法:
          1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。
          2.readAsBinaryString(file):将文件读取为二进制字符串
          3.readAsDataURL(file):将文件读取为Data URL
          4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'
                       */
    var workbook;//读取完成的数据
    var rABS = false; //是否将文件读取为二进制字符串

    function importf(obj) {//导入
        if(!obj.files) {
            return;
        }
        var f = obj.files[0];
        var reader = new FileReader();
        reader.onload = function(e) {
            var data = e.target.result;
            if(rABS) {
                workbook = XLSX.read(btoa(fixdata(data)), {//手动转化
                    type: 'base64'
                });
            } else {
                workbook = XLSX.read(data, {
                    type: 'binary'
                });
            }
            // 循环页签取数
            console.log("页签数量:"+workbook.SheetNames.length);
            var showHtml = "";
            for(var sheetNum=0;sheetNum<Number(workbook.SheetNames.length);sheetNum++){
            	var first_sheet_name = workbook.SheetNames[sheetNum]; // 获取工作簿中的工作表名字
				console.log("workbook.SheetNames[0]"+first_sheet_name)
				var address_of_cell = 'B1'; // 提供一个引用样式(单元格下标)
				var address_of_cell2 = 'B2'; // 提供一个引用样式(单元格下标)
				
				var worksheet = workbook.Sheets[first_sheet_name]; // 获取对应的工作表对象
//				console.log(worksheet['!ref']) // 获得该excel的内容范围 例如: A1:F30
				var scope = worksheet['!ref'] ;
				if(scope == undefined){
					console.log("文件格式有误!")
					showHtml= showHtml + first_sheet_name+"页签解析有误,请检查格式是否正确! <br />"
					break ;
				}else{
					showHtml= showHtml + first_sheet_name+"页签已解析完成 <br />"
				}
				// js截取某个字符串后面的内容:
				scope = scope.match(/:(\S*)/)[1]; // 获取表格边界 例如:F30
	//			console.log(scope);
				// 用正则去除字符串种的数字,获取表格边界字母值  例如:F
				var scopeLetter = scope.replace(/\d+/g,''); 
	//			console.log(scopeLetter);
				// 用正则将非数字的去除,获取表格边界行值  例如:30
				var scopeNum= scope.replace(/[^0-9]/ig,"");
	//			console.log(Number(scopeNum)+1);
				// 表名称
				var tableName = "";
				// 表注释
				var tableNameNote = "";
				// 创建表结构的字符串
				var tableSql = "create table ";
				// 创建表字段注释字符串
				var tableNote = "";
				// 创建表的主键字符串
				var tablePk = "";
//				// 循环获取数据
				for(var num = 1 ; num<Number(scopeNum)+1 ; num++){ //  循环边界行值
					var isNull = "";// 是否为空
					var def = ""; // 默认值
					for(var i=0;i<26;i++){// 循环边界字母值
					var letters = String.fromCharCode(65+i); // 字母
	//				console.log(String.fromCharCode(65+i)+num);//输出A-Z  26个大写字母
					var address_cell = String.fromCharCode(65+i)+num; // 提供一个引用样式(单元格下标)
					var desired_cell = worksheet[address_cell];// 获取对应的单元格对象
					var desired_value = (desired_cell ? desired_cell.v : undefined);// 获取对应的单元格对象的值
	//				console.log(desired_value)
					// 表结构字符串
					if(address_cell == "B1"){ // 表注释
						tableNameNote = desired_value ;
					}
					if(address_cell == "B2"){ // 表名称
						tableSql = tableSql + desired_value+" (";
						tableName = desired_value ;
	//					console.log(tableSql);
					}
					if(num >= 4){ // 读取到第四行的时候,拼接表字段 
						// age  TIMESTAMP(6) default 1 not null
						// 读取A4字段名  B4字段类型   E4默认值   D4是否为空
						// 拼接表结构
						if(letters == "A" || letters == "B" || letters == "D" || letters == "E"){
							if(letters == "A" || letters == "B"){
								tableSql = tableSql + " " +desired_value;
								if(letters == "A"){
									// 判断其是否为主键
								// 拼接表主键
								var address_cell_pk = 'C'+num; // 提供一个引用样式(单元格下标)
								var desired_cell_pk = worksheet[address_cell_pk];// 获取对应的单元格对象
							    var desired_value_pk = (desired_cell_pk ? desired_cell_pk.v : undefined);// 获取对应的单元格对象的值
								if(desired_value_pk != undefined && desired_value_pk == "Y"){
									/**
									 * alter table LJWTEST
										  add constraint ID primary key (ID)
										  using index 
										  pctfree 10
										  initrans 2
										  maxtrans 255;
									 */
									tablePk = "alter table "+tableName+
									"\n add constraint "+tableName+"_"+desired_value+" primary key ("+desired_value+")"+
									"\n using index "+"\n pctfree 10"+"\n initrans 2"+"\n maxtrans 255;"
								}
								}
							}
							
							if(letters == "D"){ // 是否为空
								if(desired_value == "N" ){ // 不可为空
									isNull = " not null ";
								}else{ // 可为空
									isNull = "";
								}
							}
							
							if(letters == "E"){ // 默认值列
								if(desired_value != undefined){ // 默认值会有空的情况
									def = " default "+desired_value;
								}
								// 重新拼接起来,并且换行
								if(num == Number(scopeNum)){ // 最后一行
									tableSql = tableSql + def + isNull + ");";
								}else{
									tableSql = tableSql + def + isNull + ","+"\n";
								}
							}
						}
						
						// 拼接表注释
						// 读取A字段 F注释
						if(letters == "A" || letters == "F"){
							// var tableNote = "comment on column";
							if(letters == "A"){
								tableNote = tableNote+"comment on column " + tableName+"."+desired_value+" is ";
							}
							if(letters == "F"){
								var noteVal = "";
								if(desired_value != undefined){
									noteVal = desired_value ;
								}
								// comment on column LJWTEST.id is '主键ID';
								tableNote = tableNote + "'"+noteVal+"';\n";
								if(num == Number(scopeNum)){// 最后一行
									tableNote = tableNote +"comment on table "+tableName+" is '"+tableNameNote+"';"
								}
							}
						}
						
					}
					if(String.fromCharCode(65+i) == scopeLetter){
						console.log("已经到字母的边界值,跳出循环")
						break;
					}
					}
				}
				console.log(tableSql);
				console.log(tableNote);
				console.log(tablePk);
				function download(filename, text) {
				  var element = document.createElement('a');
				  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
				  element.setAttribute('download', filename);
				 
				  element.style.display = 'none';
				  document.body.appendChild(element);
				 
				  element.click();
				 
				  document.body.removeChild(element);
				}
	 			download(first_sheet_name+".sql",tableSql+"\n"+tableNote+"\n"+tablePk);
	 			
            }
			
            document.getElementById("demo").innerHTML= showHtml;
        };
        if(rABS) {
            reader.readAsArrayBuffer(f);
        } else {
            reader.readAsBinaryString(f);
        }
    }

    function fixdata(data) { //文件流转BinaryString
        var o = "",
            l = 0,
            w = 10240;
        for(; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
        o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
        return o;
    }
</script>
</body>
</html>

解析的excel表格式

在这里插入图片描述

解析后生成的sql脚本

在这里插入图片描述
写的比较简单,若有不足请指正,谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值