|
|
|
@ -2,7 +2,7 @@ import { luckysheetfontformat } from '../utils/util'; |
|
|
|
import menuButton from '../controllers/menuButton'; |
|
|
|
import { getcellvalue } from './getdata'; |
|
|
|
import { colLocationByIndex } from './location'; |
|
|
|
import { hasChinaword } from './validate'; |
|
|
|
import { hasChinaword, isRealNull } from './validate'; |
|
|
|
import Store from '../store'; |
|
|
|
|
|
|
|
//计算范围行高
|
|
|
|
@ -164,7 +164,12 @@ function getMeasureText(value, ctx){ |
|
|
|
} |
|
|
|
else{ |
|
|
|
let measureText = ctx.measureText(value), cache = {}; |
|
|
|
cache.width = measureText.width; |
|
|
|
if(measureText.actualBoundingBoxLeft==null){ |
|
|
|
cache.width = measureText.width; |
|
|
|
} |
|
|
|
else{ |
|
|
|
cache.width = measureText.actualBoundingBoxLeft + measureText.actualBoundingBoxRight; |
|
|
|
} |
|
|
|
cache.actualBoundingBoxDescent = measureText.actualBoundingBoxDescent; |
|
|
|
cache.actualBoundingBoxAscent = measureText.actualBoundingBoxAscent; |
|
|
|
if(cache.actualBoundingBoxDescent==null || cache.actualBoundingBoxAscent==null || isNaN(cache.actualBoundingBoxDescent) || isNaN(cache.actualBoundingBoxAscent)){ |
|
|
|
@ -187,9 +192,361 @@ function getMeasureText(value, ctx){ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//获取单元格文本内容的渲染信息
|
|
|
|
// let measureTextCache = {}, measureTextCacheTimeOut = null;
|
|
|
|
// option {cellWidth,cellHeight,space_width,space_height}
|
|
|
|
function getCellTextInfo(cell , ctx, option){ |
|
|
|
// let cell = Store.flowdata[r][c];
|
|
|
|
let cellWidth = option.cellWidth; |
|
|
|
let cellHeight = option.cellHeight; |
|
|
|
let space_width = option.space_width, space_height = option.space_height; //宽高方向 间隙
|
|
|
|
|
|
|
|
//水平对齐
|
|
|
|
let horizonAlign = menuButton.checkstatusByCell(cell, "ht"); |
|
|
|
//垂直对齐
|
|
|
|
let verticalAlign = menuButton.checkstatusByCell(cell, "vt"); |
|
|
|
|
|
|
|
let tb = menuButton.checkstatusByCell(cell ,"tb");//wrap overflow
|
|
|
|
let tr = menuButton.checkstatusByCell(cell ,"tr");//rotate
|
|
|
|
let rt = menuButton.checkstatusByCell(cell ,"rt");//rotate angle
|
|
|
|
|
|
|
|
let isRotateUp = 1, isRotateDown=0; |
|
|
|
|
|
|
|
if(rt==null){ |
|
|
|
if(tr=="0"){ |
|
|
|
rt = 0; |
|
|
|
} |
|
|
|
else if(tr=="1"){ |
|
|
|
rt = 45; |
|
|
|
} |
|
|
|
else if(tr=="4"){ |
|
|
|
rt = 90; |
|
|
|
} |
|
|
|
else if(tr=="2"){ |
|
|
|
rt = 135; |
|
|
|
} |
|
|
|
else if(tr=="5"){ |
|
|
|
rt = 180; |
|
|
|
} |
|
|
|
|
|
|
|
if(rt==null){ |
|
|
|
rt = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
rt = parseInt(rt); |
|
|
|
if(rt>90){ |
|
|
|
rt = 90 -rt; |
|
|
|
isRotateUp = 0; |
|
|
|
isRotateDown = 1; |
|
|
|
} |
|
|
|
|
|
|
|
let textContent = {}; |
|
|
|
textContent.values = []; |
|
|
|
|
|
|
|
if(cell.ct!=null && cell.ct.t=="inlineStr" && cell.ct.sharedStrings!=null && cell.ct.sharedStrings.length>0){ |
|
|
|
let strArr = [],lineMaxHeight=[]; |
|
|
|
let sharedStrings = cell.ct.sharedStrings; |
|
|
|
for(let i=0;i<cell.ct.sharedStrings.length;i++){ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
else{ |
|
|
|
let fontset = luckysheetfontformat(cell); |
|
|
|
ctx.font = fontset; |
|
|
|
|
|
|
|
let value = cell.m; |
|
|
|
if(value == null){ |
|
|
|
value = cell.v; |
|
|
|
} |
|
|
|
|
|
|
|
if(isRealNull(value)){ |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
let measureText = getMeasureText(value, ctx); |
|
|
|
//luckysheetTableContent.measureText(value);
|
|
|
|
let textWidth = measureText.width; |
|
|
|
let textHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent; |
|
|
|
|
|
|
|
if(tr=="3"){//vertical text
|
|
|
|
value = value.toString(); |
|
|
|
|
|
|
|
let vArr = []; |
|
|
|
if(value.length > 1){ |
|
|
|
vArr = value.split(""); |
|
|
|
} |
|
|
|
else{ |
|
|
|
vArr.push(value); |
|
|
|
} |
|
|
|
|
|
|
|
let textW_all = 0; //拆分后宽高度合计
|
|
|
|
let textH_all = 0; |
|
|
|
|
|
|
|
let oneWordWidth = getMeasureText(vArr[0], ctx).width; |
|
|
|
let colIndex=0, textH_all_cache=0, textH_all_Column = {}, textH_all_ColumnHeight=[]; |
|
|
|
|
|
|
|
for(let i = 0; i < vArr.length; i++){ |
|
|
|
let textW = oneWordWidth + space_width; |
|
|
|
let textH = textHeight + space_height; |
|
|
|
|
|
|
|
// textW_all += textW;
|
|
|
|
textH_all_cache += textH; |
|
|
|
|
|
|
|
|
|
|
|
if(tb=="2"){ |
|
|
|
if(textH_all_cache>cellHeight && textH_all_Column[colIndex]!=null){ |
|
|
|
// textW_all += textW;
|
|
|
|
// textH_all = Math.max(textH_all,textH_all_cache);
|
|
|
|
textH_all_ColumnHeight.push(textH_all_cache-textH); |
|
|
|
textH_all_cache = textH; |
|
|
|
colIndex +=1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(i== vArr.length-1){ |
|
|
|
textH_all_ColumnHeight.push(textH_all_cache); |
|
|
|
} |
|
|
|
|
|
|
|
if(textH_all_Column[colIndex]==null){ |
|
|
|
textH_all_Column[colIndex]= []; |
|
|
|
} |
|
|
|
|
|
|
|
textH_all_Column[colIndex].push({ |
|
|
|
content:vArr[i], |
|
|
|
style:fontset, |
|
|
|
width:textW, |
|
|
|
height:textH, |
|
|
|
left:0, |
|
|
|
top:0, |
|
|
|
colIndex:colIndex, |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
let textH_all_ColumWidth = []; |
|
|
|
for(let i = 0; i < textH_all_ColumnHeight.length; i++){ |
|
|
|
let columnHeight = textH_all_ColumnHeight[i]; |
|
|
|
let col = textH_all_Column[i], colMaxW=0; |
|
|
|
for(let c=0;c<col.length;c++){ |
|
|
|
let word = col[c]; |
|
|
|
colMaxW = Math.max(colMaxW, word.width); |
|
|
|
} |
|
|
|
textH_all_ColumWidth.push(colMaxW); |
|
|
|
textW_all += colMaxW; |
|
|
|
textH_all = Math.max(textH_all, columnHeight); |
|
|
|
} |
|
|
|
|
|
|
|
let cumColumnWidth = 0; |
|
|
|
for(let i = 0; i < textH_all_ColumnHeight.length; i++){ |
|
|
|
let columnHeight = textH_all_ColumnHeight[i]; |
|
|
|
let columnWidth = textH_all_ColumWidth[i]; |
|
|
|
|
|
|
|
let col = textH_all_Column[i]; |
|
|
|
let cumWordHeight = 0; |
|
|
|
for(let c=0;c<col.length;c++){ |
|
|
|
let word = col[c]; |
|
|
|
|
|
|
|
let left = space_width + cumColumnWidth; |
|
|
|
if(horizonAlign == "0"){ |
|
|
|
left = cellWidth / 2 + cumColumnWidth - textW_all/2 + space_width*textH_all_ColumnHeight.length; |
|
|
|
} |
|
|
|
else if(horizonAlign == "2"){ |
|
|
|
left = cellWidth + cumColumnWidth - textW_all + space_width; |
|
|
|
} |
|
|
|
|
|
|
|
let top = (cellHeight - space_height) + cumWordHeight - columnHeight; |
|
|
|
if(verticalAlign == "0"){ |
|
|
|
top = cellHeight / 2 + cumWordHeight - columnHeight/2; |
|
|
|
} |
|
|
|
else if(verticalAlign == "1"){ |
|
|
|
top = space_height + cumWordHeight; |
|
|
|
} |
|
|
|
|
|
|
|
cumWordHeight += word.height; |
|
|
|
|
|
|
|
word.left = left; |
|
|
|
word.top = top; |
|
|
|
|
|
|
|
textContent.values.push(word); |
|
|
|
} |
|
|
|
|
|
|
|
cumColumnWidth+=columnWidth; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
textContent.type = "verticalWrap"; |
|
|
|
textContent.textWidthAll = textW_all; |
|
|
|
textContent.textHeightAll = textH_all; |
|
|
|
} |
|
|
|
else{ |
|
|
|
if(tb=="2"){//wrap
|
|
|
|
value = value.toString(); |
|
|
|
|
|
|
|
let textW_all = 0; //拆分后宽高度合计
|
|
|
|
let textH_all = 0; |
|
|
|
|
|
|
|
// let oneWordWidth = getMeasureText(vArr[0], ctx).width;
|
|
|
|
let splitIndex=0, text_all_cache=0, text_all_split = {}, text_all_splitLen=[]; |
|
|
|
|
|
|
|
|
|
|
|
textContent.rotate = rt; |
|
|
|
rt = Math.abs(rt); |
|
|
|
|
|
|
|
let anchor = 0; |
|
|
|
for(let i = 1; i <= value.length; i++){ |
|
|
|
let str = value.substr(anchor, i); |
|
|
|
let measureText = getMeasureText(str, ctx); |
|
|
|
let textW = measureText.width; |
|
|
|
let textH = measureText.actualBoundingBoxAscent+measureText.actualBoundingBoxDescent; |
|
|
|
|
|
|
|
// textW_all += textW;
|
|
|
|
|
|
|
|
|
|
|
|
if(rt!=0){ |
|
|
|
text_all_cache += textH; |
|
|
|
if(text_all_cache>cellHeight && text_all_split[splitIndex]!=null){ |
|
|
|
text_all_splitLen.push(text_all_cache-textH); |
|
|
|
text_all_cache = textH; |
|
|
|
splitIndex +=1; |
|
|
|
} |
|
|
|
} |
|
|
|
else{ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(i== vArr.length-1){ |
|
|
|
textH_all_ColumnHeight.push(textH_all_cache); |
|
|
|
} |
|
|
|
|
|
|
|
if(textH_all_Column[colIndex]==null){ |
|
|
|
text_all_split[colIndex]= []; |
|
|
|
} |
|
|
|
|
|
|
|
text_all_split[splitIndex].push({ |
|
|
|
content:vArr[i], |
|
|
|
style:fontset, |
|
|
|
width:textW, |
|
|
|
height:textH, |
|
|
|
left:0, |
|
|
|
top:0, |
|
|
|
colIndex:colIndex, |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
let textH_all_ColumWidth = []; |
|
|
|
for(let i = 0; i < textH_all_ColumnHeight.length; i++){ |
|
|
|
let columnHeight = textH_all_ColumnHeight[i]; |
|
|
|
let col = textH_all_Column[i], colMaxW=0; |
|
|
|
for(let c=0;c<col.length;c++){ |
|
|
|
let word = col[c]; |
|
|
|
colMaxW = Math.max(colMaxW, word.width); |
|
|
|
} |
|
|
|
textH_all_ColumWidth.push(colMaxW); |
|
|
|
textW_all += colMaxW; |
|
|
|
textH_all = Math.max(textH_all, columnHeight); |
|
|
|
} |
|
|
|
|
|
|
|
let cumColumnWidth = 0; |
|
|
|
for(let i = 0; i < textH_all_ColumnHeight.length; i++){ |
|
|
|
let columnHeight = textH_all_ColumnHeight[i]; |
|
|
|
let columnWidth = textH_all_ColumWidth[i]; |
|
|
|
|
|
|
|
let col = textH_all_Column[i]; |
|
|
|
let cumWordHeight = 0; |
|
|
|
for(let c=0;c<col.length;c++){ |
|
|
|
let word = col[c]; |
|
|
|
|
|
|
|
let left = space_width + cumColumnWidth; |
|
|
|
if(horizonAlign == "0"){ |
|
|
|
left = cellWidth / 2 + cumColumnWidth - textW_all/2 + space_width*textH_all_ColumnHeight.length; |
|
|
|
} |
|
|
|
else if(horizonAlign == "2"){ |
|
|
|
left = cellWidth + cumColumnWidth - textW_all + space_width; |
|
|
|
} |
|
|
|
|
|
|
|
let top = (cellHeight - space_height) + cumWordHeight - columnHeight; |
|
|
|
if(verticalAlign == "0"){ |
|
|
|
top = cellHeight / 2 + cumWordHeight - columnHeight/2; |
|
|
|
} |
|
|
|
else if(verticalAlign == "1"){ |
|
|
|
top = space_height + cumWordHeight; |
|
|
|
} |
|
|
|
|
|
|
|
cumWordHeight += word.height; |
|
|
|
|
|
|
|
word.left = left; |
|
|
|
word.top = top; |
|
|
|
|
|
|
|
textContent.values.push(word); |
|
|
|
} |
|
|
|
|
|
|
|
cumColumnWidth+=columnWidth; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
textContent.type = "verticalWrap"; |
|
|
|
textContent.textWidthAll = textW_all; |
|
|
|
textContent.textHeightAll = textH_all; |
|
|
|
} |
|
|
|
else{ |
|
|
|
|
|
|
|
textContent.rotate = rt; |
|
|
|
|
|
|
|
rt = Math.abs(rt); |
|
|
|
|
|
|
|
textContent.textWidthAll = textWidth * Math.cos(rt*Math.PI/180) + textHeight * Math.sin(rt*Math.PI/180);//consider text box wdith and line height
|
|
|
|
|
|
|
|
textContent.textHeightAll = textWidth * Math.sin(rt*Math.PI/180) + textHeight * Math.cos(rt*Math.PI/180);//consider text box wdith and line height
|
|
|
|
|
|
|
|
let width = textContent.textWidthAll, height = textContent.textHeightAll; |
|
|
|
|
|
|
|
let left = space_width + textHeight * Math.sin(rt*Math.PI/180)*isRotateDown; //默认为1,左对齐
|
|
|
|
if(horizonAlign == "0"){ //居中对齐
|
|
|
|
left = cellWidth / 2 - (width / 2) + textHeight * Math.sin(rt*Math.PI/180)*isRotateDown; |
|
|
|
} |
|
|
|
else if(horizonAlign == "2"){ //右对齐
|
|
|
|
left = (cellWidth - space_width) - width + textHeight * Math.sin(rt*Math.PI/180)*isRotateDown; |
|
|
|
} |
|
|
|
|
|
|
|
let top = (cellHeight - space_height) - height + textWidth * Math.sin(rt*Math.PI/180)*isRotateUp; //默认为2,下对齐
|
|
|
|
if(verticalAlign == "0"){ //居中对齐
|
|
|
|
top = cellHeight / 2 - (height / 2) + textWidth * Math.sin(rt*Math.PI/180)*isRotateUp; |
|
|
|
} |
|
|
|
else if(verticalAlign == "1"){ //上对齐
|
|
|
|
top = space_height + textWidth * Math.sin(rt*Math.PI/180)*isRotateUp; |
|
|
|
} |
|
|
|
|
|
|
|
textContent.type = "plain"; |
|
|
|
textContent.values.push({ |
|
|
|
content:value, |
|
|
|
style:fontset, |
|
|
|
width:width, |
|
|
|
height:height, |
|
|
|
left:left, |
|
|
|
top:top, |
|
|
|
}); |
|
|
|
|
|
|
|
textContent.textLeftAll = left; |
|
|
|
textContent.textTopAll = top; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return textContent; |
|
|
|
} |
|
|
|
|
|
|
|
export { |
|
|
|
rowlenByRange, |
|
|
|
computeRowlenArr, |
|
|
|
getCellTextSplitArr, |
|
|
|
getMeasureText |
|
|
|
getMeasureText, |
|
|
|
getCellTextInfo |
|
|
|
} |