产品一张表luckysheet前端代码库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
6.1 KiB

import { luckysheetfontformat } from '../utils/util';
import menuButton from '../controllers/menuButton';
import { getcellvalue } from './getdata';
import { colLocationByIndex } from './location';
import Store from '../store';
//计算范围行高
function rowlenByRange(d, r1, r2, cfg) {
let cfg_clone = $.extend(true, {}, cfg);
if(cfg_clone["rowlen"] == null){
cfg_clone["rowlen"] = {};
}
let ctcanvas = $("#luckysheetTableContent").get(0).getContext("2d");
for(let r = r1; r <= r2; r++){
if (cfg_clone["rowhidden"] != null && cfg_clone["rowhidden"][r] != null) {
continue;
}
let currentRowLen = Store.defaultrowlen;
if(cfg_clone["rowlen"][r] != null){
currentRowLen = cfg_clone["rowlen"][r];
}
for(let c = 0; c < d[r].length; c++){
if(d[r][c] != null && d[r][c]["v"] != null && d[r][c]["tb"] != null && d[r][c]["tb"] == "2"){
//自动换行
let fontset = luckysheetfontformat(d[r][c]);
ctcanvas.font = fontset;
let oneLineTextHeight = menuButton.getTextSize("田", fontset)[1];
let cellText = getcellvalue(r, c, d).toString(); //单元格文本
let textWidth = ctcanvas.measureText(cellText).width; //文本宽度
let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 8; //单元格宽度
let computeRowlen; //计算行高
if(textWidth > cellWidth){
let strArr = []; //文本截断数组
for(let strI = 1; strI <= cellText.length; strI++){
let strV = cellText.substring(strArr.join("").length, strI);
let strtextMetrics = ctcanvas.measureText(strV).width;
if(strtextMetrics > cellWidth){
strArr.push(cellText.substring(strArr.join("").length, strI-1));
strI = strI-2;
}
else if(strtextMetrics <= cellWidth && strI == cellText.length){
strArr.push(strV);
}
}
computeRowlen = oneLineTextHeight * strArr.length;
}
else{
computeRowlen = oneLineTextHeight;
}
//比较计算行高和当前行高取最大高度
if(computeRowlen > currentRowLen){
currentRowLen = computeRowlen;
}
}
else if(d[r][c] != null && d[r][c]["v"] != null && d[r][c]["tr"] != null){
//文本旋转
let fontset = luckysheetfontformat(d[r][c]);
ctcanvas.font = fontset;
let oneLineTextHeight = menuButton.getTextSize("田", fontset)[1];
let cellText = getcellvalue(r,c,d).toString(); //单元格文本
let textWidth = ctcanvas.measureText(cellText).width; //文本宽度
let computeRowlen; //计算行高
if(d[r][c]["tr"] == "0"){
//无旋转
computeRowlen = oneLineTextHeight;
}
else if(d[r][c]["tr"] == "1" || d[r][c]["tr"] == "2"){
//向下倾斜(45 旋转)----向上倾斜(-45 旋转)
computeRowlen = 0.707 * (textWidth + oneLineTextHeight) + 4;
}
else if(d[r][c]["tr"] == "3"){
//竖排文字
computeRowlen = cellText.length * oneLineTextHeight + 4;
}
else if(d[r][c]["tr"] == "4" || d[r][c]["tr"] == "5"){
//向下90(90 旋转)----向上90(-90 旋转)
computeRowlen = textWidth + 4;
}
computeRowlen = Math.round(computeRowlen);
//比较计算高度和当前高度取最大高度
if(computeRowlen > currentRowLen){
currentRowLen = computeRowlen;
}
}
else{
let fontset = luckysheetfontformat(d[r][c]);
let oneLineTextHeight = menuButton.getTextSize("田", fontset)[1];
//比较计算高度和当前高度取最大高度
if(oneLineTextHeight > currentRowLen){
currentRowLen = oneLineTextHeight;
}
}
}
if(currentRowLen != Store.defaultrowlen){
cfg_clone["rowlen"][r] = currentRowLen;
}
}
return cfg_clone;
}
//计算表格行高数组
function computeRowlenArr(rowHeight, cfg) {
let rowlenArr = [];
let rh_height = 0;
for (let i = 0; i < rowHeight; i++) {
let rowlen = Store.defaultrowlen;
if (cfg["rowlen"] != null && cfg["rowlen"][i] != null) {
rowlen = cfg["rowlen"][i];
}
if (cfg["rowhidden"] != null && cfg["rowhidden"][i] != null) {
rowlen = cfg["rowhidden"][i];
rowlenArr.push(rh_height);
continue;
}
else {
rh_height += rowlen + 1;
}
rowlenArr.push(rh_height);//行的临时长度分布
}
return rowlenArr;
}
//获取换行单元格截断数组
function getCellTextSplitArr(strValue, strArr, cellWidth, canvas){
for(let strI = 1; strI <= strValue.length; strI++){
let strV = strValue.substring(0, strI);
let strtextMetrics = canvas.measureText(strV).width;
if(strtextMetrics > cellWidth){
if(strI - 1 <= 0){
return strArr;
}
else{
strArr.push(strValue.substring(0, strI - 1));
return getCellTextSplitArr(strValue.substring(strI - 1), strArr, cellWidth, canvas);
}
}
else if(strI == strValue.length){
strArr.push(strV);
}
}
return strArr;
}
export {
rowlenByRange,
computeRowlenArr,
getCellTextSplitArr,
}