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脚本
写的比较简单,若有不足请指正,谢谢!