SheetJs解析EXCEL
来源于 https://blog.csdn.net/qq_38536471/article/details/104784888
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脚本
写的比较简单,若有不足请指正,谢谢!
-------------------------------------------写在后面--------------------------------------------------------------------
(1)作者提供了EXCEL的模板样式;
(2)代码只针对这个EXCEL进行SQL生成代码;
(3)需要自己调整上面的代码
用空常来坐坐
https://www.cnblogs.com/alexgl2008/