| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- var utils = {
- isUTF8: function (bytes) {
- var i = 0;
- while (i < bytes.length) {
- if (( // ASCII
- bytes[i] == 0x09 ||
- bytes[i] == 0x0A ||
- bytes[i] == 0x0D ||
- (0x20 <= bytes[i] && bytes[i] <= 0x7E)
- )) {
- i += 1;
- continue;
- }
- if ((// non-overlong 2-byte
- (0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
- (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF)
- )) {
- i += 2;
- continue;
- }
- if (( // excluding overlongs
- bytes[i] == 0xE0 &&
- (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
- (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
- ) || ( // straight 3-byte
- ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
- bytes[i] == 0xEE ||
- bytes[i] == 0xEF) &&
- (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
- (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
- ) || ( // excluding surrogates
- bytes[i] == 0xED &&
- (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x9F) &&
- (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
- )) {
- i += 3;
- continue;
- }
- if (( // planes 1-3
- bytes[i] == 0xF0 &&
- (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
- (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
- (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
- ) || ( // planes 4-15
- (0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
- (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
- (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
- (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
- ) || ( // plane 16
- bytes[i] == 0xF4 &&
- (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
- (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
- (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
- )) {
- i += 4;
- continue;
- }
- return false;
- }
- return true;
- },
- // 读取cell的数字或字母
- getCellNum: function(str){
- var n = '';
- var isNum = !arguments[1];
- for(var i in str) {
- var val = parseInt(str[i]);
- var _isNaN = isNum ? !isNaN(val) : isNaN(val);
- if(_isNaN) n += str[i];
- }
- return isNum ? parseInt(n) : n;
- },
- // 表头字母转数字
- stringToNum: function(str){
- str=str.toLowerCase().split("");
- var al = str.length;
- var getCharNumber = function(charx){
- return charx.charCodeAt() -96;
- };
- var numout = 0;
- var charnum = 0;
- for(var i = 0; i < al; i++){
- charnum = getCharNumber(str[i]);
- numout += charnum * Math.pow(26, al-i-1);
- };
- return numout;
- },
- // 数字转字母
- numToString: function(numm){
- var stringArray = [];
- stringArray.length = 0;
- var numToStringAction = function(nnum){
- var num = nnum - 1;
- var a = parseInt(num / 26);
- var b = num % 26;
- stringArray.push(String.fromCharCode(64 + parseInt(b+1)));
- if(a>0){
- numToStringAction(a);
- }
- }
- numToStringAction(numm);
- return stringArray.reverse().join("");
- },
- // sheetjs.data转luckysheet.data
- xlsToLuckySheet: function(sheet, _sheet){
- var arr = (_.get(sheet, '!ref') || ':').split(':');
- var cols = this.getCellNum(arr[1], true);
- cols = this.stringToNum(cols);
- cols = cols > 26 ? cols : 26; // 列,字母,不足的填充
- var rows = this.getCellNum(arr[1]);
- rows = rows > 84 ? rows : 84; // 行,数字
- // 表格样式
- var _cols = _.get(sheet, '!cols') || {};
- var _rows = _.get(sheet, '!rows') || {};
- var _merges = _.get(sheet, '!merges') || {};
- var obj = [];
- var self = this;
- for(var i=1; i<=rows; i++) {
- var row = [];
- for(var j=1; j<=cols; j++) {
- var key = self.numToString(j) + i;
- var cell = null;
- if(sheet[key]) {
- // https://mengshukeji.github.io/LuckysheetDocs/zh/guide/cell.html#基本单元格
- var value = sheet[key].v || '';
- var style = sheet[key].s || {};
- var bgColor = _.get(style, 'fgColor.rgb'); // 前景色
- // var ftColor = _.get(style, 'ftColor.rgb');
- cell = {
- m: value, // 显示值
- v: value, // 原始值
- ct: {fa: sheet[key].z || 'General', t: sheet[key].t || 'g'},
- // bg: bgColor ? '#'+bgColor : '',
- // bl: _.get(style, 'patternType') == 'bold' ? 1 : 0,
- tb: 2, // 0:截断;1:溢出;2:换行
- }
- if (bgColor) cell.bg = '#'+bgColor;
- }
- row.push(cell);
- _sheet.config.columnlen[j-1] = _cols[j-1] ? _cols[j-1].wpx : 73; // 默认列宽73px
- }
- obj.push(row)
- _sheet.config.rowlen[i-1] = _rows[i-1] ? _rows[i-1].hpt * 4 / 3 : 19; // 本来有参数hpx,但其值和hpt一样;默认值行高19px
- }
- // 合并单元格
- // https://mengshukeji.github.io/LuckysheetDocs/zh/guide/sheet.html#初始化配置
- _.each(_merges, function(opt){
- var r = opt.s.r; // sheet[!merges] = [{e:{r:,c:},s:{r:,c:}}]
- var c = opt.s.c; // s:start,e:end
- _sheet.config.merge[r+'_'+c] = {
- r: r,
- c: c,
- rs: opt.e.r - r + 1,
- cs: opt.e.c - c + 1,
- };
- });
- return obj;
- },
- // 单个sheet初始配置
- getLuckySheet: function(){
- return {
- "name": "Sheet1",
- "color": "",
- "status": 1,
- "order": 0,
- "data": [ // data直接替换,这里就不写null填充了
- [null],
- [null],
- ],
- "config": {
- rowlen: {}, // 表格行高
- columnlen: {}, // 表格行宽
- merge: {}, // 合并单元格
- },
- "index": 0,
- // "jfgird_select_save": [],
- "luckysheet_select_save": [],
- "visibledatarow": [],
- "visibledatacolumn": [],
- // "ch_width": 4560,
- // "rh_height": 1760,
- "luckysheet_selection_range": [],
- "zoomRatio": 1,
- "celldata": [],
- // "load": "1",
- "scrollLeft": 0,
- "scrollTop": 0
- };
- }
- }
|