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.
3086 lines
128 KiB
3086 lines
128 KiB
import pivotTable from '../controllers/pivotTable';
|
|
import conditionformat from '../controllers/conditionformat';
|
|
import alternateformat from '../controllers/alternateformat';
|
|
import luckysheetSparkline from '../controllers/sparkline';
|
|
import menuButton from '../controllers/menuButton';
|
|
import { luckysheetdefaultstyle, luckysheet_CFiconsImg } from '../controllers/constant';
|
|
import { luckysheet_searcharray } from '../controllers/sheetSearch';
|
|
import { dynamicArrayCompute } from './dynamicArray';
|
|
import browser from './browser';
|
|
import { isRealNull } from './validate';
|
|
import { getCellTextSplitArr } from './getRowlen';
|
|
import { getcellvalue } from './getdata';
|
|
import { getBorderInfoCompute } from './border';
|
|
import { getSheetIndex } from '../methods/get';
|
|
import { getObjType, chatatABC, luckysheetfontformat } from '../utils/util';
|
|
import Store from '../store';
|
|
|
|
function luckysheetDrawgrid(scrollWidth, scrollHeight, drawWidth, drawHeight, offsetLeft, offsetTop) {
|
|
if($("#luckysheetTableContent").length == 0){
|
|
return;
|
|
}
|
|
|
|
if(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["isPivotTable"]){
|
|
luckysheetDrawMain_back(scrollWidth, scrollHeight, drawWidth, drawHeight, offsetLeft, offsetTop);
|
|
}
|
|
else{
|
|
luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, offsetLeft, offsetTop);
|
|
}
|
|
|
|
$("#luckysheetTableContent").get(0).getContext("2d").clearRect(0, 0, 46, 20);
|
|
|
|
luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, offsetLeft);
|
|
luckysheetDrawgridRowTitle(scrollHeight, drawHeight, offsetTop);
|
|
}
|
|
|
|
function luckysheetDrawgridRowTitle(scrollHeight, drawHeight, offsetTop) {
|
|
if (scrollHeight == null) {
|
|
scrollHeight = $("#luckysheet-cell-main").scrollTop();
|
|
}
|
|
|
|
if (drawHeight == null) {
|
|
drawHeight = Store.luckysheetTableContentHW[1];
|
|
}
|
|
|
|
if (offsetTop == null) {
|
|
offsetTop = Store.columeHeaderHeight;
|
|
}
|
|
|
|
let luckysheetTableContent = $("#luckysheetTableContent").get(0).getContext("2d");
|
|
luckysheetTableContent.clearRect(
|
|
0,
|
|
offsetTop * Store.devicePixelRatio,
|
|
(Store.rowHeaderWidth - 1) * Store.devicePixelRatio,
|
|
drawHeight * Store.devicePixelRatio
|
|
);
|
|
|
|
luckysheetTableContent.font = luckysheetdefaultstyle.font;
|
|
luckysheetTableContent.textBaseline = luckysheetdefaultstyle.textBaseline; //基准线 垂直居中
|
|
luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;
|
|
|
|
let dataset_row_st, dataset_row_ed;
|
|
dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);
|
|
dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);
|
|
|
|
if (dataset_row_st == -1) {
|
|
dataset_row_st = 0;
|
|
}
|
|
if (dataset_row_ed == -1) {
|
|
dataset_row_ed = Store.visibledatarow.length - 1;
|
|
}
|
|
|
|
let end_r, start_r;
|
|
|
|
for (let r = dataset_row_st; r <= dataset_row_ed; r++) {
|
|
if (r == 0) {
|
|
start_r = -scrollHeight - 1;
|
|
}
|
|
else {
|
|
start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;
|
|
}
|
|
end_r = Store.visibledatarow[r] - scrollHeight;
|
|
|
|
//若超出绘制区域终止
|
|
if(end_r > scrollHeight + drawHeight){
|
|
break;
|
|
}
|
|
|
|
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
|
|
|
|
}
|
|
else {
|
|
//行标题栏序列号
|
|
let textMetrics = luckysheetTableContent.measureText(r + 1);
|
|
|
|
let horizonAlignPos = (Store.rowHeaderWidth * Store.devicePixelRatio - textMetrics.width) / 2;
|
|
let verticalAlignPos = (start_r + (end_r - start_r) / 2 + offsetTop) * Store.devicePixelRatio;
|
|
|
|
luckysheetTableContent.fillText(r + 1, horizonAlignPos, verticalAlignPos);
|
|
}
|
|
|
|
//行标题栏横线
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
-1,
|
|
(end_r + offsetTop - 2 + 0.5) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
(Store.rowHeaderWidth - 1) * Store.devicePixelRatio,
|
|
(end_r + offsetTop - 2 + 0.5) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
|
|
//行标题栏竖线
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
(Store.rowHeaderWidth - 2 + 0.5) * Store.devicePixelRatio,
|
|
(offsetTop - 1) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
(Store.rowHeaderWidth - 2 + 0.5) * Store.devicePixelRatio,
|
|
(Store.rh_height + offsetTop) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
|
|
|
|
//清除canvas左上角区域 防止列标题栏序列号溢出显示
|
|
luckysheetTableContent.clearRect(0, 0, Store.rowHeaderWidth * Store.devicePixelRatio, Store.columeHeaderHeight * Store.devicePixelRatio);
|
|
}
|
|
|
|
function luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, offsetLeft) {
|
|
if (scrollWidth == null) {
|
|
scrollWidth = $("#luckysheet-cell-main").scrollLeft();
|
|
}
|
|
|
|
if (drawWidth == null) {
|
|
drawWidth = Store.luckysheetTableContentHW[0];
|
|
}
|
|
|
|
if (offsetLeft == null) {
|
|
offsetLeft = Store.rowHeaderWidth;
|
|
}
|
|
|
|
let luckysheetTableContent = $("#luckysheetTableContent").get(0).getContext("2d");
|
|
luckysheetTableContent.clearRect(
|
|
offsetLeft * Store.devicePixelRatio,
|
|
-0.5,
|
|
drawWidth * Store.devicePixelRatio,
|
|
(Store.columeHeaderHeight - 1.5) * Store.devicePixelRatio
|
|
);
|
|
|
|
|
|
luckysheetTableContent.font = luckysheetdefaultstyle.font;
|
|
luckysheetTableContent.textBaseline = luckysheetdefaultstyle.textBaseline; //基准线 垂直居中
|
|
luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;
|
|
|
|
let dataset_col_st, dataset_col_ed;
|
|
dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);
|
|
dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);
|
|
|
|
if (dataset_col_st == -1) {
|
|
dataset_col_st = 0;
|
|
}
|
|
if (dataset_col_ed == -1) {
|
|
dataset_col_ed = Store.visibledatacolumn.length - 1;
|
|
}
|
|
|
|
let end_c, start_c;
|
|
|
|
for (let c = dataset_col_st; c <= dataset_col_ed; c++) {
|
|
if (c == 0) {
|
|
start_c = -scrollWidth;
|
|
}
|
|
else {
|
|
start_c = Store.visibledatacolumn[c - 1] - scrollWidth;
|
|
}
|
|
end_c = Store.visibledatacolumn[c] - scrollWidth;
|
|
|
|
//若超出绘制区域终止
|
|
if(end_c > scrollWidth + drawWidth){
|
|
break;
|
|
}
|
|
|
|
//列标题栏序列号
|
|
let abc = chatatABC(c);
|
|
let textMetrics = luckysheetTableContent.measureText(abc);
|
|
|
|
let horizonAlignPos = Math.round((start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - textMetrics.width / 2);
|
|
let verticalAlignPos = Math.round(Store.columeHeaderHeight / 2 * Store.devicePixelRatio);
|
|
|
|
luckysheetTableContent.fillText(abc, horizonAlignPos, verticalAlignPos);
|
|
|
|
//列标题栏竖线
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
(end_c + offsetLeft - 2 + 0.5) * Store.devicePixelRatio,
|
|
0.5
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
(end_c + offsetLeft - 2 + 0.5) * Store.devicePixelRatio,
|
|
(Store.columeHeaderHeight - 2) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
|
|
//列标题栏横线
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
(offsetLeft - 1) * Store.devicePixelRatio,
|
|
(Store.columeHeaderHeight - 2 + 0.5) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
(Store.ch_width + offsetLeft - 2) * Store.devicePixelRatio,
|
|
(Store.columeHeaderHeight - 2 + 0.5) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
|
|
//清除canvas左上角区域 防止列标题栏序列号溢出显示
|
|
luckysheetTableContent.clearRect(0, 0, Store.rowHeaderWidth * Store.devicePixelRatio, Store.columeHeaderHeight * Store.devicePixelRatio);
|
|
}
|
|
|
|
let offlinecanvasElement_cache = {};
|
|
|
|
function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, offsetLeft, offsetTop, columnOffsetCell, rowOffsetCell, mycanvas) {
|
|
if(Store.flowdata == null){
|
|
return;
|
|
}
|
|
|
|
//参数未定义处理
|
|
if (scrollWidth == null) {
|
|
scrollWidth = $("#luckysheet-cell-main").scrollLeft();
|
|
}
|
|
if (scrollHeight == null) {
|
|
scrollHeight = $("#luckysheet-cell-main").scrollTop();
|
|
}
|
|
|
|
if (drawWidth == null) {
|
|
drawWidth = Store.luckysheetTableContentHW[0];
|
|
}
|
|
if (drawHeight == null) {
|
|
drawHeight = Store.luckysheetTableContentHW[1];
|
|
}
|
|
|
|
if (offsetLeft == null) {
|
|
offsetLeft = Store.rowHeaderWidth;
|
|
}
|
|
if (offsetTop == null) {
|
|
offsetTop = Store.columeHeaderHeight;
|
|
}
|
|
|
|
if (columnOffsetCell == null) {
|
|
columnOffsetCell = 0;
|
|
}
|
|
if (rowOffsetCell == null) {
|
|
rowOffsetCell = 0;
|
|
}
|
|
|
|
//表格canvas
|
|
let luckysheetTableContent = null;
|
|
if(mycanvas == null){
|
|
luckysheetTableContent = $("#luckysheetTableContent").get(0).getContext("2d");
|
|
}
|
|
else {
|
|
if(getObjType(mycanvas) == "object"){
|
|
try{
|
|
luckysheetTableContent = mycanvas.get(0).getContext("2d");
|
|
}
|
|
catch(err){
|
|
luckysheetTableContent = mycanvas;
|
|
}
|
|
}
|
|
else{
|
|
luckysheetTableContent = $("#" + mycanvas).get(0).getContext("2d");
|
|
}
|
|
}
|
|
|
|
luckysheetTableContent.clearRect(
|
|
0,
|
|
0,
|
|
Store.luckysheetTableContentHW[0] * Store.devicePixelRatio,
|
|
Store.luckysheetTableContentHW[1] * Store.devicePixelRatio
|
|
);
|
|
|
|
//表格渲染区域 起止行列下标
|
|
let dataset_row_st,
|
|
dataset_row_ed,
|
|
dataset_col_st,
|
|
dataset_col_ed;
|
|
|
|
dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);
|
|
dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);
|
|
|
|
if (dataset_row_st == -1) {
|
|
dataset_row_st = 0;
|
|
}
|
|
|
|
dataset_row_st += rowOffsetCell;
|
|
|
|
if (dataset_row_ed == -1) {
|
|
dataset_row_ed = Store.visibledatarow.length - 1;
|
|
}
|
|
|
|
dataset_row_ed += rowOffsetCell;
|
|
|
|
if (dataset_row_ed >= Store.visibledatarow.length) {
|
|
dataset_row_ed = Store.visibledatarow.length - 1;
|
|
}
|
|
|
|
dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);
|
|
dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);
|
|
|
|
if (dataset_col_st == -1) {
|
|
dataset_col_st = 0;
|
|
}
|
|
|
|
dataset_col_st += columnOffsetCell;
|
|
|
|
if (dataset_col_ed == -1) {
|
|
dataset_col_ed = Store.visibledatacolumn.length - 1;
|
|
}
|
|
|
|
dataset_col_ed += columnOffsetCell;
|
|
|
|
if (dataset_col_ed >= Store.visibledatacolumn.length) {
|
|
dataset_col_ed = Store.visibledatacolumn.length - 1;
|
|
}
|
|
|
|
//表格渲染区域 起止行列坐标
|
|
let fill_row_st,
|
|
fill_row_ed,
|
|
fill_col_st,
|
|
fill_col_ed;
|
|
|
|
if(dataset_row_st == 0){
|
|
fill_row_st = 0;
|
|
}
|
|
else{
|
|
fill_row_st = Store.visibledatarow[dataset_row_st - 1];
|
|
}
|
|
|
|
fill_row_ed = Store.visibledatarow[dataset_row_ed];
|
|
|
|
if(dataset_col_st == 0){
|
|
fill_col_st = 0;
|
|
}
|
|
else{
|
|
fill_col_st = Store.visibledatacolumn[dataset_col_st - 1];
|
|
}
|
|
|
|
fill_col_ed = Store.visibledatacolumn[dataset_col_ed];
|
|
|
|
//表格canvas 初始化处理
|
|
luckysheetTableContent.fillStyle = "#ffffff";
|
|
luckysheetTableContent.fillRect(
|
|
(offsetLeft - 1) * Store.devicePixelRatio,
|
|
(offsetTop - 1) * Store.devicePixelRatio,
|
|
(fill_col_ed - scrollWidth) * Store.devicePixelRatio,
|
|
(fill_row_ed - scrollHeight) * Store.devicePixelRatio
|
|
);
|
|
luckysheetTableContent.font = luckysheetdefaultstyle.font;
|
|
luckysheetTableContent.textBaseline = "top";
|
|
luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;
|
|
|
|
//表格渲染区域 非空单元格行列 起止坐标
|
|
let cellupdate = [];
|
|
let mergeCache = {};
|
|
let borderOffset = {};
|
|
|
|
for (let r = dataset_row_st; r <= dataset_row_ed; r++) {
|
|
let start_r;
|
|
if (r == 0) {
|
|
start_r = -scrollHeight - 1;
|
|
}
|
|
else {
|
|
start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;
|
|
}
|
|
|
|
let end_r = Store.visibledatarow[r] - scrollHeight;
|
|
|
|
for (let c = dataset_col_st; c <= dataset_col_ed; c++) {
|
|
let start_c;
|
|
if (c == 0) {
|
|
start_c = -scrollWidth;
|
|
}
|
|
else {
|
|
start_c = Store.visibledatacolumn[c - 1] - scrollWidth;
|
|
}
|
|
|
|
let end_c = Store.visibledatacolumn[c] - scrollWidth;
|
|
|
|
//数据透视表
|
|
if (!!Store.luckysheetcurrentisPivotTable && pivotTable.drawPivotTable) {
|
|
if ((c == 0 || c == 5) && r <= 11) {
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
|
|
if ((r == 2 || r == 11) && c <= 5) {
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (start_c - 1 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c - 2 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
|
|
if (r == 6 && c == 3) {
|
|
luckysheetTableContent.fillText(
|
|
"数据透视表",
|
|
Store.devicePixelRatio * (start_c + 4 + offsetLeft),
|
|
Store.devicePixelRatio *(start_r + (end_r - start_r) / 2 - 1 + offsetTop)
|
|
);
|
|
}
|
|
}
|
|
else if (!!Store.luckysheetcurrentisPivotTable) {
|
|
if (c < pivotTable.pivotTableBoundary[1] && r < pivotTable.pivotTableBoundary[0]) {
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio*(end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio*(start_r + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio*(end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio*(end_r - 2 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio*(start_c - 1 + offsetLeft),
|
|
Store.devicePixelRatio*(end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio*(end_c - 2 + offsetLeft),
|
|
Store.devicePixelRatio*(end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
|
|
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
|
|
|
|
}
|
|
else {
|
|
let firstcolumlen = Store.defaultcollen;
|
|
if (Store.config["columlen"] != null && Store.config["columlen"][c] != null) {
|
|
firstcolumlen = Store.config["columlen"][c];
|
|
}
|
|
|
|
if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
|
|
let value = Store.flowdata[r][c];
|
|
|
|
if(getObjType(value) == "object" && ("mc" in value)){
|
|
borderOffset[r + "_" + c] = {
|
|
"start_r": start_r,
|
|
"start_c": start_c,
|
|
"end_r": end_r,
|
|
"end_c": end_c
|
|
};
|
|
|
|
if("rs" in value["mc"]){
|
|
let key = "r"+ r + "c" + c;
|
|
mergeCache[key] = cellupdate.length;
|
|
}
|
|
else{
|
|
let key = "r"+ value["mc"].r + "c" + value["mc"].c;
|
|
let margeMain = cellupdate[mergeCache[key]];
|
|
|
|
if(margeMain == null){
|
|
mergeCache[key] = cellupdate.length;
|
|
cellupdate.push({
|
|
"r": r,
|
|
"c": c,
|
|
"start_c": start_c,
|
|
"start_r": start_r,
|
|
"end_r": end_r,
|
|
"end_c": end_c,
|
|
"firstcolumlen": firstcolumlen,
|
|
});
|
|
}
|
|
else{
|
|
if(margeMain.c == c){
|
|
margeMain.end_r += (end_r - start_r - 1);
|
|
}
|
|
|
|
if(margeMain.r == r){
|
|
margeMain.end_c += (end_c - start_c);
|
|
margeMain.firstcolumlen += firstcolumlen;
|
|
}
|
|
}
|
|
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
|
|
cellupdate.push({
|
|
"r": r,
|
|
"c": c,
|
|
"start_r": start_r,
|
|
"start_c": start_c,
|
|
"end_r": end_r,
|
|
"end_c": end_c,
|
|
"firstcolumlen": firstcolumlen,
|
|
});
|
|
borderOffset[r + "_" + c] = {
|
|
"start_r": start_r,
|
|
"start_c": start_c,
|
|
"end_r": end_r,
|
|
"end_c": end_c
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
//动态数组公式计算
|
|
let dynamicArray_compute = dynamicArrayCompute(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["dynamicArray"]);
|
|
|
|
//交替颜色计算
|
|
let af_compute = alternateformat.getComputeMap();
|
|
|
|
//条件格式计算
|
|
let cf_compute = conditionformat.getComputeMap();
|
|
|
|
//sparklines渲染
|
|
let sparklinesRender = function(r, c, offsetX, offsetY, canvasid, ctx){
|
|
if(Store.flowdata[r] == null || Store.flowdata[r][c] == null){
|
|
return;
|
|
}
|
|
|
|
let sparklines = Store.flowdata[r][c].spl;
|
|
if(sparklines != null){
|
|
if(typeof sparklines == "string"){
|
|
sparklines = eval('('+ sparklines +')');
|
|
}
|
|
|
|
if(getObjType(sparklines) == "object"){
|
|
let temp1 = sparklines;
|
|
let x = temp1.offsetX;
|
|
let y = temp1.offsetY;
|
|
x = x == null ? 0 : x;
|
|
y = y == null ? 0 : y;
|
|
luckysheetSparkline.render(
|
|
temp1.shapeseq,
|
|
temp1.shapes,
|
|
offsetX + x,
|
|
offsetY + y,
|
|
temp1.pixelWidth,
|
|
temp1.pixelHeight,
|
|
canvasid,
|
|
ctx
|
|
);
|
|
}
|
|
else if(getObjType(sparklines) == "array" && getObjType(sparklines[0]) == "object"){
|
|
for(let i = 0; i < sparklines.length; i++){
|
|
let temp1 = sparklines[i];
|
|
let x = temp1.offsetX;
|
|
let y = temp1.offsetY;
|
|
x = x == null ? 0 : x;
|
|
y = y == null ? 0 : y;
|
|
luckysheetSparkline.render(
|
|
temp1.shapeseq,
|
|
temp1.shapes,
|
|
offsetX + x,
|
|
offsetY + y,
|
|
temp1.pixelWidth,
|
|
temp1.pixelHeight,
|
|
canvasid,
|
|
ctx
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//空白单元格渲染
|
|
let nullCellRender = function(r, c, start_r, start_c, end_r, end_c){
|
|
let checksAF = alternateformat.checksAF(r, c, af_compute); //交替颜色
|
|
let checksCF = conditionformat.checksCF(r, c, cf_compute); //条件格式
|
|
|
|
let borderfix = menuButton.borderfix(Store.flowdata, r, c);
|
|
|
|
//背景色
|
|
luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c , "bg");
|
|
|
|
if(checksAF != null && checksAF[1] != null){//交替颜色
|
|
luckysheetTableContent.fillStyle = checksAF[1];
|
|
}
|
|
|
|
if(checksCF != null && checksCF["cellColor"] != null){//条件格式
|
|
luckysheetTableContent.fillStyle = checksCF["cellColor"];
|
|
}
|
|
|
|
if(Store.flowdata[r][c] != null && Store.flowdata[r][c].tc != null){//标题色
|
|
luckysheetTableContent.fillStyle = Store.flowdata[r][c].tc;
|
|
}
|
|
|
|
let cellsize = [
|
|
Store.devicePixelRatio * (start_c + offsetLeft + borderfix[0]),
|
|
Store.devicePixelRatio * (start_r + offsetTop + 1 + borderfix[1]),
|
|
Store.devicePixelRatio * (end_c - start_c - 3 + borderfix[2]),
|
|
Store.devicePixelRatio * (end_r - start_r - 3 - 0.5 + borderfix[3])
|
|
];
|
|
luckysheetTableContent.fillRect(cellsize[0], cellsize[1], cellsize[2], cellsize[3]);
|
|
|
|
if((r + "_" + c) in dynamicArray_compute){
|
|
let value = dynamicArray_compute[r + "_" + c].v;
|
|
|
|
luckysheetTableContent.fillStyle = "#000000";
|
|
//文本宽度和高度
|
|
let fontset = luckysheetdefaultstyle.font;
|
|
luckysheetTableContent.font = fontset;
|
|
|
|
let textMetrics = luckysheetTableContent.measureText(value).width;
|
|
let oneLineTextHeight = menuButton.getTextSize("田", fontset)[1];
|
|
|
|
//水平对齐 (默认为1,左对齐)
|
|
let horizonAlignPos = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
|
|
|
|
//垂直对齐 (默认为2,下对齐)
|
|
let verticalFixed = browser.luckysheetrefreshfixed();
|
|
let verticalAlignPos = (end_r + offsetTop - 2) * Store.devicePixelRatio;
|
|
luckysheetTableContent.textBaseline = 'bottom';
|
|
|
|
luckysheetTableContent.fillText(value == null ? "" : value, horizonAlignPos, verticalAlignPos);
|
|
}
|
|
|
|
//若单元格有批注
|
|
if(Store.flowdata[r][c] != null && Store.flowdata[r][c].ps != null){
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(Store.devicePixelRatio * (end_c + offsetLeft - 6), Store.devicePixelRatio * (start_r + offsetTop));
|
|
luckysheetTableContent.lineTo(Store.devicePixelRatio * (end_c + offsetLeft - 1), Store.devicePixelRatio * (start_r + offsetTop));
|
|
luckysheetTableContent.lineTo(Store.devicePixelRatio * (end_c + offsetLeft - 1), Store.devicePixelRatio * (start_r + offsetTop + 5));
|
|
luckysheetTableContent.fillStyle = "#FC6666";
|
|
luckysheetTableContent.fill();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
//右边框
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2 + 0.5),
|
|
Store.devicePixelRatio * (start_r + offsetTop - 2)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2 + 0.5),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
|
|
if (!!Store.luckysheetcurrentisPivotTable && !pivotTable.drawPivotTable) {
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
}
|
|
else{
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
}
|
|
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
|
|
//下边框
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (start_c + offsetLeft - 2),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2 + 0.5)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2 + 0.5)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
|
|
if (!!Store.luckysheetcurrentisPivotTable && !pivotTable.drawPivotTable) {
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
}
|
|
else{
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
}
|
|
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
//非空白单元格渲染
|
|
let cellRender = function(r, c, start_r, start_c, end_r, end_c, value, canvasType){
|
|
let cell = Store.flowdata[r][c];
|
|
let cellWidth = end_c - start_c - 2;
|
|
let cellHeight = end_r - start_r - 2;
|
|
let space_width = 2, space_height = 2; //宽高方向 间隙
|
|
|
|
let fontset = luckysheetfontformat(cell);
|
|
luckysheetTableContent.font = fontset;
|
|
luckysheetTableContent.textBaseline = 'top';
|
|
|
|
//文本计算 宽度和高度
|
|
let cellValueSize = getCellValueSize(cell, value, luckysheetTableContent, cellWidth, cellHeight, space_width, space_height);
|
|
|
|
//水平对齐
|
|
let horizonAlign = menuButton.checkstatus(Store.flowdata, r, c, "ht");
|
|
//垂直对齐
|
|
let verticalAlign = menuButton.checkstatus(Store.flowdata, r, c, "vt");
|
|
|
|
//文本单行 宽度和高度
|
|
let measureText = luckysheetTableContent.measureText(value);
|
|
let textMetrics = measureText.width;
|
|
let oneLineTextHeight = measureText.actualBoundingBoxDescent - measureText.actualBoundingBoxAscent;
|
|
|
|
//交替颜色
|
|
let checksAF = alternateformat.checksAF(r, c, af_compute);
|
|
//条件格式
|
|
let checksCF = conditionformat.checksCF(r, c, cf_compute);
|
|
|
|
//单元格 背景颜色
|
|
luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c, "bg");
|
|
if(checksAF != null && checksAF[1] != null){ //若单元格有交替颜色 背景颜色
|
|
luckysheetTableContent.fillStyle = checksAF[1];
|
|
}
|
|
if(checksCF != null && checksCF["cellColor"] != null){ //若单元格有条件格式 背景颜色
|
|
luckysheetTableContent.fillStyle = checksCF["cellColor"];
|
|
}
|
|
luckysheetTableContent.fillRect(
|
|
(start_c + offsetLeft - 1) * Store.devicePixelRatio,
|
|
(start_r + offsetTop) * Store.devicePixelRatio,
|
|
(end_c - start_c + 2) * Store.devicePixelRatio,
|
|
(end_r - start_r + 1) * Store.devicePixelRatio
|
|
)
|
|
|
|
// 非Safari浏览器
|
|
//(canvasType为offline)
|
|
//(水平对齐方式为居中或右对齐 且 文本宽度大于单元格宽度)
|
|
//(文本高度大于单元格高度)
|
|
// 走离屏canvas方法
|
|
if(browser.BrowserType() != "Safari" && ( canvasType == "offline" || ( (horizonAlign == "0" || horizonAlign == "2") && cellWidth < cellValueSize.width ) || cellHeight < cellValueSize.height )){
|
|
//取渲染单元格大小离屏canvas
|
|
let offlinecanvasElement = offlinecanvasElement_cache[cellWidth + '_' + cellHeight];
|
|
if(offlinecanvasElement == null){
|
|
offlinecanvasElement = document.createElement('canvas');
|
|
offlinecanvasElement.width = cellWidth * Store.devicePixelRatio;
|
|
offlinecanvasElement.height = cellHeight * Store.devicePixelRatio;
|
|
offlinecanvasElement_cache[cellWidth + '_' + cellHeight] = offlinecanvasElement;
|
|
}
|
|
let offlinecanvas = offlinecanvasElement.getContext("2d");
|
|
|
|
offlinecanvas.clearRect(
|
|
0,
|
|
0,
|
|
cellWidth * Store.devicePixelRatio,
|
|
cellHeight * Store.devicePixelRatio
|
|
);
|
|
offlinecanvas.font = fontset;
|
|
|
|
//若单元格有批注(单元格右上角红色小三角标示)
|
|
if(cell.ps != null){
|
|
let ps_w = 5, ps_h = 5; //红色小三角宽高
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(
|
|
Store.devicePixelRatio * (cellWidth - ps_w),
|
|
0
|
|
);
|
|
offlinecanvas.lineTo(
|
|
Store.devicePixelRatio * cellWidth,
|
|
0
|
|
);
|
|
offlinecanvas.lineTo(
|
|
Store.devicePixelRatio * cellWidth,
|
|
Store.devicePixelRatio * ps_h
|
|
);
|
|
offlinecanvas.fillStyle = "#FC6666";
|
|
offlinecanvas.fill();
|
|
offlinecanvas.closePath();
|
|
}
|
|
|
|
//若单元格有条件格式数据条
|
|
if(checksCF != null && checksCF["dataBar"] != null){
|
|
let x = Store.devicePixelRatio * space_width;
|
|
let y = Store.devicePixelRatio * space_height;
|
|
let w = Store.devicePixelRatio * (cellWidth - space_width * 2);
|
|
let h = Store.devicePixelRatio * (cellHeight - space_height * 2);
|
|
|
|
let valueType = checksCF["dataBar"]["valueType"];
|
|
let valueLen = checksCF["dataBar"]["valueLen"];
|
|
let format = checksCF["dataBar"]["format"];
|
|
|
|
if(valueType == 'minus'){
|
|
//负数
|
|
let minusLen = checksCF["dataBar"]["minusLen"];
|
|
|
|
if(format.length > 1){
|
|
//渐变
|
|
let my_gradient = offlinecanvas.createLinearGradient(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y,
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
my_gradient.addColorStop(0, "#ffffff");
|
|
my_gradient.addColorStop(1, "#ff0000");
|
|
|
|
offlinecanvas.fillStyle = my_gradient;
|
|
}
|
|
else{
|
|
//单色
|
|
offlinecanvas.fillStyle = "#ff0000";
|
|
}
|
|
|
|
offlinecanvas.fillRect(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y,
|
|
w * minusLen * valueLen,
|
|
h
|
|
);
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y + h
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen,
|
|
y + h
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y
|
|
);
|
|
offlinecanvas.lineWidth = Store.devicePixelRatio;
|
|
offlinecanvas.strokeStyle = "#ff0000";
|
|
offlinecanvas.stroke();
|
|
offlinecanvas.closePath();
|
|
}
|
|
else if(valueType == 'plus'){
|
|
//正数
|
|
let plusLen = checksCF["dataBar"]["plusLen"];
|
|
|
|
if(plusLen == 1){
|
|
if(format.length > 1){
|
|
//渐变
|
|
let my_gradient = offlinecanvas.createLinearGradient(
|
|
x,
|
|
y,
|
|
x + w * valueLen,
|
|
y
|
|
);
|
|
my_gradient.addColorStop(0, format[0]);
|
|
my_gradient.addColorStop(1, format[1]);
|
|
|
|
offlinecanvas.fillStyle = my_gradient;
|
|
}
|
|
else{
|
|
//单色
|
|
offlinecanvas.fillStyle = format[0];
|
|
}
|
|
|
|
offlinecanvas.fillRect(
|
|
x,
|
|
y,
|
|
w * valueLen,
|
|
h
|
|
);
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(
|
|
x,
|
|
y
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x,
|
|
y + h
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * valueLen,
|
|
y + h
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * valueLen,
|
|
y
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x,
|
|
y
|
|
);
|
|
offlinecanvas.lineWidth = Store.devicePixelRatio;
|
|
offlinecanvas.strokeStyle = format[0];
|
|
offlinecanvas.stroke();
|
|
offlinecanvas.closePath();
|
|
}
|
|
else{
|
|
let minusLen = checksCF["dataBar"]["minusLen"];
|
|
|
|
if(format.length > 1){
|
|
//渐变
|
|
let my_gradient = offlinecanvas.createLinearGradient(
|
|
x + w * minusLen,
|
|
y,
|
|
x + w * minusLen + w * plusLen * valueLen,
|
|
y
|
|
);
|
|
my_gradient.addColorStop(0, format[0]);
|
|
my_gradient.addColorStop(1, format[1]);
|
|
|
|
offlinecanvas.fillStyle = my_gradient;
|
|
}
|
|
else{
|
|
//单色
|
|
offlinecanvas.fillStyle = format[0];
|
|
}
|
|
|
|
offlinecanvas.fillRect(
|
|
x + w * minusLen,
|
|
y,
|
|
w * plusLen * valueLen,
|
|
h
|
|
);
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen,
|
|
y + h
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen + w * plusLen * valueLen,
|
|
y + h
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen + w * plusLen * valueLen,
|
|
y
|
|
);
|
|
offlinecanvas.lineTo(
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
offlinecanvas.lineWidth = Store.devicePixelRatio;
|
|
offlinecanvas.strokeStyle = format[0];
|
|
offlinecanvas.stroke();
|
|
offlinecanvas.closePath();
|
|
}
|
|
}
|
|
}
|
|
|
|
let horizonAlignPos = space_width * Store.devicePixelRatio; //默认为1,左对齐
|
|
if(horizonAlign == "0"){ //居中对齐
|
|
horizonAlignPos = (cellWidth / 2) * Store.devicePixelRatio - (textMetrics / 2);
|
|
}
|
|
else if(horizonAlign == "2"){ //右对齐
|
|
horizonAlignPos = (cellWidth - space_width) * Store.devicePixelRatio - textMetrics;
|
|
}
|
|
|
|
let verticalAlignPos = (cellHeight - space_height) * Store.devicePixelRatio - oneLineTextHeight; //默认为2,下对齐
|
|
let verticalAlignPos_text = (cellHeight - space_height) * Store.devicePixelRatio; //文本垂直方向基准线
|
|
offlinecanvas.textBaseline = "bottom";
|
|
if(verticalAlign == "0"){ //居中对齐
|
|
verticalAlignPos = (cellHeight / 2) * Store.devicePixelRatio - (oneLineTextHeight / 2);
|
|
|
|
verticalAlignPos_text = (cellHeight / 2) * Store.devicePixelRatio;
|
|
offlinecanvas.textBaseline = "middle";
|
|
}
|
|
else if(verticalAlign == "1"){ //上对齐
|
|
verticalAlignPos = space_height * Store.devicePixelRatio;
|
|
|
|
verticalAlignPos_text = space_height * Store.devicePixelRatio;
|
|
offlinecanvas.textBaseline = "top";
|
|
}
|
|
|
|
//若单元格有条件格式图标集
|
|
if(checksCF != null && checksCF["icons"] != null){
|
|
let l = checksCF["icons"]["left"];
|
|
let t = checksCF["icons"]["top"];
|
|
|
|
offlinecanvas.drawImage(
|
|
luckysheet_CFiconsImg,
|
|
l * 42,
|
|
t * 32,
|
|
32,
|
|
32,
|
|
0,
|
|
verticalAlignPos,
|
|
oneLineTextHeight,
|
|
oneLineTextHeight
|
|
);
|
|
|
|
if(horizonAlign != "0" && horizonAlign != "2"){ //左对齐时 文本渲染空出一个图标的距离
|
|
horizonAlignPos = horizonAlignPos + oneLineTextHeight;
|
|
}
|
|
}
|
|
|
|
//单元格 文本颜色
|
|
offlinecanvas.fillStyle = menuButton.checkstatus(Store.flowdata, r, c , "fc");
|
|
|
|
//若单元格有交替颜色 文本颜色
|
|
if(checksAF != null && checksAF[0] != null){
|
|
offlinecanvas.fillStyle = checksAF[0];
|
|
}
|
|
//若单元格有条件格式 文本颜色
|
|
if(checksCF != null && checksCF["textColor"] != null){
|
|
offlinecanvas.fillStyle = checksCF["textColor"];
|
|
}
|
|
|
|
//单元格是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
|
|
if(cell.tb == '2'){
|
|
//自动换行
|
|
offlinecanvas.textBaseline = 'top'; //textBaseline以top计算
|
|
|
|
let strArr = [];//文本截断数组
|
|
strArr = getCellTextSplitArr(value.toString(), strArr, cellWidth - space_width * 2, offlinecanvas);
|
|
|
|
for(let i = 0; i < strArr.length; i++){
|
|
let strV = strArr[i];
|
|
|
|
let strWidth = offlinecanvas.measureText(strV).width;
|
|
let strHeight = oneLineTextHeight;
|
|
|
|
//水平对齐计算
|
|
if(horizonAlign == "0"){
|
|
horizonAlignPos = (cellWidth / 2) * Store.devicePixelRatio - (strWidth / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
horizonAlignPos = (cellWidth - space_width) * Store.devicePixelRatio - strWidth;
|
|
}
|
|
else{
|
|
horizonAlignPos = space_width * Store.devicePixelRatio;
|
|
}
|
|
|
|
//垂直对齐计算
|
|
if(verticalAlign == "0"){
|
|
verticalAlignPos = (cellHeight / 2) * Store.devicePixelRatio - (strHeight / 2) * strArr.length;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
verticalAlignPos = space_height * Store.devicePixelRatio;
|
|
}
|
|
else{
|
|
verticalAlignPos = (cellHeight - space_height) * Store.devicePixelRatio - strHeight * strArr.length;
|
|
}
|
|
|
|
offlinecanvas.fillText(strV, horizonAlignPos, (verticalAlignPos + i * strHeight));
|
|
|
|
if(cl == "1" && !isRealNull(strV)){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#000";
|
|
offlinecanvas.moveTo(
|
|
horizonAlignPos,
|
|
(verticalAlignPos + i * strHeight) + strHeight / 2
|
|
);
|
|
offlinecanvas.lineTo(
|
|
horizonAlignPos + strWidth,
|
|
(verticalAlignPos + i * strHeight) + strHeight / 2
|
|
);
|
|
offlinecanvas.stroke();
|
|
offlinecanvas.closePath();
|
|
}
|
|
}
|
|
}
|
|
else if(cell.tr != null && cell.tr != '0'){
|
|
//旋转
|
|
offlinecanvas.textBaseline = 'top'; //textBaseline以top计算
|
|
|
|
//单元格旋转属性
|
|
let tr = cell.tr;
|
|
|
|
//旋转重新计算水平、垂直方向坐标
|
|
if(cell.tr == "1" || cell.tr == "2"){
|
|
let textW = 0.707 * (textMetrics + oneLineTextHeight);
|
|
let textH = 0.707 * (textMetrics + oneLineTextHeight);
|
|
|
|
let hAP = space_width * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (cellHeight - space_height) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign == "0"){
|
|
vAP = (cellHeight / 2) * Store.devicePixelRatio - (textH / 2);
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = space_height * Store.devicePixelRatio;
|
|
}
|
|
|
|
//向下倾斜(45 旋转)
|
|
if(cell.tr == "1"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP, vAP);
|
|
offlinecanvas.rotate(45 * Math.PI / 180);
|
|
offlinecanvas.translate(-hAP, -vAP);
|
|
offlinecanvas.fillText(
|
|
value == null ? "" : value,
|
|
hAP + (0.707 * 0.707 * oneLineTextHeight),
|
|
vAP - (0.707 * 0.707 * oneLineTextHeight)
|
|
);
|
|
offlinecanvas.restore();
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#000";
|
|
offlinecanvas.moveTo(
|
|
hAP + oneLineTextHeight / 2,
|
|
vAP + oneLineTextHeight / 2
|
|
);
|
|
offlinecanvas.lineTo(
|
|
hAP + textW - oneLineTextHeight / 2,
|
|
vAP + textH - oneLineTextHeight / 2
|
|
);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
|
|
//向上倾斜(-45 旋转)
|
|
if(cell.tr == "2"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP, vAP + textH);
|
|
offlinecanvas.rotate(-45 * Math.PI / 180);
|
|
offlinecanvas.translate(-hAP, -(vAP + textH));
|
|
offlinecanvas.fillText(
|
|
value == null ? "" : value,
|
|
hAP + (0.707 * 0.707 * oneLineTextHeight),
|
|
vAP + textH - (0.707 * 0.707 * oneLineTextHeight)
|
|
);
|
|
offlinecanvas.restore();
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#000";
|
|
offlinecanvas.moveTo(
|
|
hAP + oneLineTextHeight / 2,
|
|
vAP + textH - oneLineTextHeight / 2
|
|
);
|
|
offlinecanvas.lineTo(
|
|
hAP + textW - oneLineTextHeight / 2,
|
|
vAP + oneLineTextHeight / 2
|
|
);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
}
|
|
else if(cell.tr == "3"){
|
|
if(!isRealNull(value)){
|
|
value = value.toString();
|
|
|
|
let vArr = [];
|
|
if(value.length > 1){
|
|
vArr = value.split("");
|
|
}
|
|
else{
|
|
vArr.push(value);
|
|
}
|
|
|
|
let textW_all = 0; //拆分后宽高度合计
|
|
let textH_all = 0;
|
|
|
|
for(let i = 0; i < vArr.length; i++){
|
|
let textW = offlinecanvas.measureText(vArr[i]).width;
|
|
let textH = oneLineTextHeight;
|
|
|
|
textW_all += textW;
|
|
textH_all += textH;
|
|
|
|
let hAP = space_width * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (cellHeight - space_height) * Store.devicePixelRatio - textH * vArr.length;
|
|
if(verticalAlign == "0"){
|
|
vAP = (cellHeight / 2) * Store.devicePixelRatio - (textH / 2) * vArr.length;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = space_height * Store.devicePixelRatio;
|
|
}
|
|
|
|
offlinecanvas.fillText(vArr[i], hAP, (vAP + i * textH));
|
|
}
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
let textW = textW_all / vArr.length;
|
|
let textH = textH_all;
|
|
|
|
let hAP = space_width * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (cellHeight - space_height) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign == "0"){
|
|
vAP = (cellHeight / 2) * Store.devicePixelRatio - (textH / 2);
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = space_height * Store.devicePixelRatio;
|
|
}
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#000";
|
|
offlinecanvas.moveTo(
|
|
hAP + textW / 2,
|
|
vAP
|
|
);
|
|
offlinecanvas.lineTo(
|
|
hAP + textW / 2,
|
|
vAP + textH
|
|
);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
}
|
|
else if(cell.tr == "4" || cell.tr == "5"){
|
|
let textW = oneLineTextHeight;
|
|
let textH = textMetrics;
|
|
|
|
let hAP = space_width * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (cellHeight - space_height) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign == "0"){
|
|
vAP = (cellHeight / 2) * Store.devicePixelRatio - (textH / 2);
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = space_height * Store.devicePixelRatio;
|
|
}
|
|
|
|
//向下90(90 旋转)
|
|
if(tr == "4"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP, vAP);
|
|
offlinecanvas.rotate(90 * Math.PI / 180);
|
|
offlinecanvas.translate(-hAP, -vAP);
|
|
offlinecanvas.fillText(value == null ? "" : value, hAP, vAP - textW);
|
|
offlinecanvas.restore();
|
|
}
|
|
|
|
//向上90(-90 旋转)
|
|
if(tr == "5"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP + textH, vAP);
|
|
offlinecanvas.rotate(-90 * Math.PI / 180);
|
|
offlinecanvas.translate(-(hAP + textH), -vAP);
|
|
offlinecanvas.fillText(value == null ? "" : value, hAP, vAP - textH);
|
|
offlinecanvas.restore();
|
|
}
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#000";
|
|
offlinecanvas.moveTo(hAP + textW / 2, vAP);
|
|
offlinecanvas.lineTo(hAP + textW / 2, vAP + textH);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
//单元格有下钻属性,文本颜色变成超链接的颜色
|
|
if(cell.dd != null){
|
|
offlinecanvas.fillStyle = "#0000ff";
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#0000ff";
|
|
offlinecanvas.moveTo(
|
|
horizonAlignPos,
|
|
verticalAlignPos + oneLineTextHeight
|
|
);
|
|
offlinecanvas.lineTo(
|
|
horizonAlignPos + textMetrics,
|
|
verticalAlignPos + oneLineTextHeight
|
|
);
|
|
offlinecanvas.stroke();
|
|
offlinecanvas.closePath();
|
|
}
|
|
|
|
offlinecanvas.fillText(value == null ? "" : value, horizonAlignPos, verticalAlignPos_text);
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.strokeStyle = "#000";
|
|
offlinecanvas.moveTo(
|
|
horizonAlignPos,
|
|
verticalAlignPos + oneLineTextHeight / 2
|
|
);
|
|
offlinecanvas.lineTo(
|
|
horizonAlignPos + textMetrics,
|
|
verticalAlignPos + oneLineTextHeight / 2
|
|
);
|
|
offlinecanvas.stroke();
|
|
offlinecanvas.closePath();
|
|
}
|
|
}
|
|
|
|
//将离屏canvas 画到主表格canvas上
|
|
luckysheetTableContent.drawImage(
|
|
offlinecanvasElement,
|
|
0,
|
|
0,
|
|
cellWidth * Store.devicePixelRatio,
|
|
cellHeight * Store.devicePixelRatio,
|
|
(start_c + offsetLeft) * Store.devicePixelRatio,
|
|
(start_r + offsetTop) * Store.devicePixelRatio,
|
|
cellWidth * Store.devicePixelRatio,
|
|
cellHeight * Store.devicePixelRatio,
|
|
);
|
|
}
|
|
//走主表格canvas方法
|
|
else{
|
|
let pos_x = start_c + offsetLeft;
|
|
let pos_y = start_r + offsetTop + 1;
|
|
|
|
//若单元格有批注(单元格右上角红色小三角标示)
|
|
if(cell.ps != null){
|
|
let ps_w = 5, ps_h = 5; //红色小三角宽高
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - ps_w),
|
|
start_r + offsetTop
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * end_c + offsetLeft,
|
|
start_r + offsetTop
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * end_c + offsetLeft,
|
|
Store.devicePixelRatio * (start_r + offsetTop + ps_h)
|
|
);
|
|
luckysheetTableContent.fillStyle = "#FC6666";
|
|
luckysheetTableContent.fill();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
//若单元格有条件格式数据条
|
|
if(checksCF != null && checksCF["dataBar"] != null){
|
|
let x = Store.devicePixelRatio * (start_c + offsetLeft + space_width);
|
|
let y = Store.devicePixelRatio * (start_r + offsetTop + space_height);
|
|
let w = Store.devicePixelRatio * (cellWidth - space_width * 2);
|
|
let h = Store.devicePixelRatio * (cellHeight - space_height * 2);
|
|
|
|
let valueType = checksCF["dataBar"]["valueType"];
|
|
let valueLen = checksCF["dataBar"]["valueLen"];
|
|
let format = checksCF["dataBar"]["format"];
|
|
|
|
if(valueType == 'minus'){
|
|
//负数
|
|
let minusLen = checksCF["dataBar"]["minusLen"];
|
|
|
|
if(format.length > 1){
|
|
//渐变
|
|
let my_gradient = luckysheetTableContent.createLinearGradient(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y,
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
my_gradient.addColorStop(0, "#ffffff");
|
|
my_gradient.addColorStop(1, "#ff0000");
|
|
|
|
luckysheetTableContent.fillStyle = my_gradient;
|
|
}
|
|
else{
|
|
//单色
|
|
luckysheetTableContent.fillStyle = "#ff0000";
|
|
}
|
|
|
|
luckysheetTableContent.fillRect(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y,
|
|
w * minusLen * valueLen,
|
|
h
|
|
);
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y + h
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen,
|
|
y + h
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen * (1 - valueLen),
|
|
y
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#ff0000";
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
else if(valueType == 'plus'){
|
|
//正数
|
|
let plusLen = checksCF["dataBar"]["plusLen"];
|
|
|
|
if(plusLen == 1){
|
|
if(format.length > 1){
|
|
//渐变
|
|
let my_gradient = luckysheetTableContent.createLinearGradient(
|
|
x,
|
|
y,
|
|
x + w * valueLen,
|
|
y
|
|
);
|
|
my_gradient.addColorStop(0, format[0]);
|
|
my_gradient.addColorStop(1, format[1]);
|
|
|
|
luckysheetTableContent.fillStyle = my_gradient;
|
|
}
|
|
else{
|
|
//单色
|
|
luckysheetTableContent.fillStyle = format[0];
|
|
}
|
|
|
|
luckysheetTableContent.fillRect(
|
|
x,
|
|
y,
|
|
w * valueLen,
|
|
h
|
|
);
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
x,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x,
|
|
y + h
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * valueLen,
|
|
y + h
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * valueLen,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = format[0];
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
else{
|
|
let minusLen = checksCF["dataBar"]["minusLen"];
|
|
|
|
if(format.length > 1){
|
|
//渐变
|
|
let my_gradient = luckysheetTableContent.createLinearGradient(
|
|
x + w * minusLen,
|
|
y,
|
|
x + w * minusLen + w * plusLen * valueLen,
|
|
y
|
|
);
|
|
my_gradient.addColorStop(0, format[0]);
|
|
my_gradient.addColorStop(1, format[1]);
|
|
|
|
luckysheetTableContent.fillStyle = my_gradient;
|
|
}
|
|
else{
|
|
//单色
|
|
luckysheetTableContent.fillStyle = format[0];
|
|
}
|
|
|
|
luckysheetTableContent.fillRect(
|
|
x + w * minusLen,
|
|
y,
|
|
w * plusLen * valueLen,
|
|
h
|
|
);
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen,
|
|
y + h
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen + w * plusLen * valueLen,
|
|
y + h
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen + w * plusLen * valueLen,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
x + w * minusLen,
|
|
y
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = format[0];
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
}
|
|
}
|
|
|
|
let horizonAlignPos = (pos_x + space_width) * Store.devicePixelRatio; //默认为1,左对齐
|
|
if(horizonAlign == "0"){ //居中对齐
|
|
horizonAlignPos = (pos_x + cellWidth / 2) * Store.devicePixelRatio - (textMetrics / 2);
|
|
}
|
|
else if(horizonAlign == "2"){ //右对齐
|
|
horizonAlignPos = (pos_x + cellWidth - space_width) * Store.devicePixelRatio - textMetrics;
|
|
}
|
|
|
|
let verticalAlignPos = (pos_y + cellHeight - space_height) * Store.devicePixelRatio - oneLineTextHeight; //默认为2,下对齐
|
|
let verticalAlignPos_text = (pos_y + cellHeight - space_height) * Store.devicePixelRatio; //文本垂直方向基准线
|
|
luckysheetTableContent.textBaseline = "bottom";
|
|
if(verticalAlign == "0"){ //居中对齐
|
|
verticalAlignPos = (pos_y + cellHeight / 2) * Store.devicePixelRatio - (oneLineTextHeight / 2);
|
|
|
|
verticalAlignPos_text = (pos_y + cellHeight / 2) * Store.devicePixelRatio;
|
|
luckysheetTableContent.textBaseline = "middle";
|
|
}
|
|
else if(verticalAlign == "1"){ //上对齐
|
|
verticalAlignPos = (pos_y + space_height) * Store.devicePixelRatio;
|
|
|
|
verticalAlignPos_text = (pos_y + space_height) * Store.devicePixelRatio;
|
|
luckysheetTableContent.textBaseline = "top";
|
|
}
|
|
|
|
//若单元格有条件格式图标集
|
|
if(checksCF != null && checksCF["icons"] != null){
|
|
let l = checksCF["icons"]["left"];
|
|
let t = checksCF["icons"]["top"];
|
|
|
|
luckysheetTableContent.drawImage(
|
|
luckysheet_CFiconsImg,
|
|
l * 42,
|
|
t * 32,
|
|
32,
|
|
32,
|
|
pos_x * Store.devicePixelRatio,
|
|
verticalAlignPos,
|
|
oneLineTextHeight,
|
|
oneLineTextHeight
|
|
);
|
|
|
|
if(horizonAlign != "0" && horizonAlign != "2"){ //左对齐时 文本渲染空出一个图标的距离
|
|
horizonAlignPos = horizonAlignPos + oneLineTextHeight;
|
|
}
|
|
}
|
|
|
|
//单元格 文本颜色
|
|
luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c , "fc");
|
|
|
|
//若单元格有交替颜色 文本颜色
|
|
if(checksAF != null && checksAF[0] != null){
|
|
luckysheetTableContent.fillStyle = checksAF[0];
|
|
}
|
|
//若单元格有条件格式 文本颜色
|
|
if(checksCF != null && checksCF["textColor"] != null){
|
|
luckysheetTableContent.fillStyle = checksCF["textColor"];
|
|
}
|
|
|
|
//单元格是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
|
|
if(cell.tb == '2'){
|
|
//自动换行
|
|
luckysheetTableContent.textBaseline = 'top'; //textBaseline以top计算
|
|
|
|
let strArr = [];//文本截断数组
|
|
strArr = getCellTextSplitArr(value.toString(), strArr, cellWidth - space_width * 2, luckysheetTableContent);
|
|
|
|
for(let i = 0; i < strArr.length; i++){
|
|
let strV = strArr[i];
|
|
|
|
let strWidth = luckysheetTableContent.measureText(strV).width;
|
|
let strHeight = oneLineTextHeight;
|
|
|
|
//水平对齐计算
|
|
if(horizonAlign == "0"){
|
|
horizonAlignPos = (pos_x + cellWidth / 2) * Store.devicePixelRatio - (strWidth / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
horizonAlignPos = (pos_x + cellWidth - space_width) * Store.devicePixelRatio - strWidth;
|
|
}
|
|
else{
|
|
horizonAlignPos = (pos_x + space_width) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//垂直对齐计算
|
|
if(verticalAlign == "0"){
|
|
verticalAlignPos = (pos_y + cellHeight / 2) * Store.devicePixelRatio - (strHeight / 2) * strArr.length;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
verticalAlignPos = (pos_y + space_height) * Store.devicePixelRatio;
|
|
}
|
|
else{
|
|
verticalAlignPos = (pos_y + cellHeight - space_height) * Store.devicePixelRatio - strHeight * strArr.length;
|
|
}
|
|
|
|
luckysheetTableContent.fillText(strV, horizonAlignPos, (verticalAlignPos + i * strHeight));
|
|
|
|
if(cl == "1" && !isRealNull(strV)){
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#000";
|
|
luckysheetTableContent.moveTo(
|
|
horizonAlignPos,
|
|
(verticalAlignPos + i * strHeight) + strHeight / 2
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
horizonAlignPos + strWidth,
|
|
(verticalAlignPos + i * strHeight) + strHeight / 2
|
|
);
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
}
|
|
}
|
|
else if(cell.tr != null && cell.tr != '0'){
|
|
//旋转
|
|
luckysheetTableContent.textBaseline = 'top'; //textBaseline以top计算
|
|
|
|
//单元格旋转属性
|
|
let tr = cell.tr;
|
|
|
|
//旋转重新计算水平、垂直方向坐标
|
|
if(cell.tr == "1" || cell.tr == "2"){
|
|
let textW = 0.707 * (textMetrics + oneLineTextHeight);
|
|
let textH = 0.707 * (textMetrics + oneLineTextHeight);
|
|
|
|
let hAP = (pos_x + space_width) * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (pos_x + cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (pos_x + cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (pos_y + cellHeight - space_height) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign == "0"){
|
|
vAP = (pos_y + cellHeight / 2) * Store.devicePixelRatio - (textH / 2);
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = (pos_y + space_height) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//向下倾斜(45 旋转)
|
|
if(cell.tr == "1"){
|
|
luckysheetTableContent.save();
|
|
luckysheetTableContent.translate(hAP, vAP);
|
|
luckysheetTableContent.rotate(45 * Math.PI / 180);
|
|
luckysheetTableContent.translate(-hAP, -vAP);
|
|
luckysheetTableContent.fillText(
|
|
value == null ? "" : value,
|
|
hAP + (0.707 * 0.707 * oneLineTextHeight),
|
|
vAP - (0.707 * 0.707 * oneLineTextHeight)
|
|
);
|
|
luckysheetTableContent.restore();
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#000";
|
|
luckysheetTableContent.moveTo(
|
|
hAP + oneLineTextHeight / 2,
|
|
vAP + oneLineTextHeight / 2
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
hAP + textW - oneLineTextHeight / 2,
|
|
vAP + textH - oneLineTextHeight / 2
|
|
);
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
|
|
//向上倾斜(-45 旋转)
|
|
if(cell.tr == "2"){
|
|
luckysheetTableContent.save();
|
|
luckysheetTableContent.translate(hAP, vAP + textH);
|
|
luckysheetTableContent.rotate(-45 * Math.PI / 180);
|
|
luckysheetTableContent.translate(-hAP, -(vAP + textH));
|
|
luckysheetTableContent.fillText(
|
|
value == null ? "" : value,
|
|
hAP + (0.707 * 0.707 * oneLineTextHeight),
|
|
vAP + textH - (0.707 * 0.707 * oneLineTextHeight)
|
|
);
|
|
luckysheetTableContent.restore();
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#000";
|
|
luckysheetTableContent.moveTo(
|
|
hAP + oneLineTextHeight / 2,
|
|
vAP + textH - oneLineTextHeight / 2
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
hAP + textW - oneLineTextHeight / 2,
|
|
vAP + oneLineTextHeight / 2
|
|
);
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
}
|
|
else if(cell.tr == "3"){
|
|
if(!isRealNull(value)){
|
|
value = value.toString();
|
|
|
|
let vArr = [];
|
|
if(value.length > 1){
|
|
vArr = value.split("");
|
|
}
|
|
else{
|
|
vArr.push(value);
|
|
}
|
|
|
|
let textW_all = 0; //拆分后宽高度合计
|
|
let textH_all = 0;
|
|
|
|
for(let i = 0; i < vArr.length; i++){
|
|
let textW = luckysheetTableContent.measureText(vArr[i]).width;
|
|
let textH = oneLineTextHeight;
|
|
|
|
textW_all += textW;
|
|
textH_all += textH;
|
|
|
|
let hAP = (pos_x + space_width) * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (pos_x + cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (pos_x + cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (pos_y + cellHeight - space_height) * Store.devicePixelRatio - textH * vArr.length;
|
|
if(verticalAlign == "0"){
|
|
vAP = (pos_y + cellHeight / 2) * Store.devicePixelRatio - (textH / 2) * vArr.length;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = (pos_y + space_height) * Store.devicePixelRatio;
|
|
}
|
|
|
|
luckysheetTableContent.fillText(vArr[i], hAP, (vAP + i * textH));
|
|
}
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
let textW = textW_all / vArr.length;
|
|
let textH = textH_all;
|
|
|
|
let hAP = (pos_x + space_width) * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (pos_x + cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (pos_x + cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (pos_y + cellHeight - space_height) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign == "0"){
|
|
vAP = (pos_y + cellHeight / 2) * Store.devicePixelRatio - (textH / 2);
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = (pos_y + space_height) * Store.devicePixelRatio;
|
|
}
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#000";
|
|
luckysheetTableContent.moveTo(
|
|
hAP + textW / 2,
|
|
vAP
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
hAP + textW / 2,
|
|
vAP + textH
|
|
);
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
}
|
|
else if(cell.tr == "4" || cell.tr == "5"){
|
|
let textW = oneLineTextHeight;
|
|
let textH = textMetrics;
|
|
|
|
let hAP = (pos_x + space_width) * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
hAP = (pos_x + cellWidth / 2) * Store.devicePixelRatio - (textW / 2);
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
hAP = (pos_x + cellWidth - space_width) * Store.devicePixelRatio - textW;
|
|
}
|
|
|
|
let vAP = (pos_y + cellHeight - space_height) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign == "0"){
|
|
vAP = (pos_y + cellHeight / 2) * Store.devicePixelRatio - (textH / 2);
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
vAP = (pos_y + space_height) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//向下90(90 旋转)
|
|
if(tr == "4"){
|
|
luckysheetTableContent.save();
|
|
luckysheetTableContent.translate(hAP, vAP);
|
|
luckysheetTableContent.rotate(90 * Math.PI / 180);
|
|
luckysheetTableContent.translate(-hAP, -vAP);
|
|
luckysheetTableContent.fillText(value == null ? "" : value, hAP, vAP - textW);
|
|
luckysheetTableContent.restore();
|
|
}
|
|
|
|
//向上90(-90 旋转)
|
|
if(tr == "5"){
|
|
luckysheetTableContent.save();
|
|
luckysheetTableContent.translate(hAP + textH, vAP);
|
|
luckysheetTableContent.rotate(-90 * Math.PI / 180);
|
|
luckysheetTableContent.translate(-(hAP + textH), -vAP);
|
|
luckysheetTableContent.fillText(value == null ? "" : value, hAP, vAP - textH);
|
|
luckysheetTableContent.restore();
|
|
}
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#000";
|
|
luckysheetTableContent.moveTo(hAP + textW / 2, vAP);
|
|
luckysheetTableContent.lineTo(hAP + textW / 2, vAP + textH);
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
//单元格有下钻属性,文本颜色变成超链接的颜色
|
|
if(cell.dd != null){
|
|
luckysheetTableContent.fillStyle = "#0000ff";
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#0000ff";
|
|
luckysheetTableContent.moveTo(
|
|
horizonAlignPos,
|
|
verticalAlignPos + oneLineTextHeight
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
horizonAlignPos + textMetrics,
|
|
verticalAlignPos + oneLineTextHeight
|
|
);
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
luckysheetTableContent.fillText(value == null ? "" : value, horizonAlignPos, verticalAlignPos_text);
|
|
|
|
if(cl == "1" && !isRealNull(value)){
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.strokeStyle = "#000";
|
|
luckysheetTableContent.moveTo(
|
|
horizonAlignPos,
|
|
verticalAlignPos + oneLineTextHeight / 2
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
horizonAlignPos + textMetrics,
|
|
verticalAlignPos + oneLineTextHeight / 2
|
|
);
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
}
|
|
}
|
|
|
|
//右边框重绘
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2 + 0.5),
|
|
Store.devicePixelRatio * (start_r + offsetTop - 2)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2 + 0.5),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
|
|
if (!!Store.luckysheetcurrentisPivotTable && !pivotTable.drawPivotTable) {
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
}
|
|
else{
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
}
|
|
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
|
|
//下边框重绘
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (start_c + offsetLeft - 2),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2 + 0.5)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2 + 0.5)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
|
|
if (!!Store.luckysheetcurrentisPivotTable && !pivotTable.drawPivotTable) {
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
}
|
|
else{
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
}
|
|
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
let mcArr = [];
|
|
|
|
for(let cud = 0; cud < cellupdate.length; cud++){
|
|
let item = cellupdate[cud];
|
|
let r = item.r,
|
|
c = item.c,
|
|
start_r = item.start_r,
|
|
start_c = item.start_c,
|
|
end_r = item.end_r,
|
|
end_c = item.end_c;
|
|
let firstcolumlen = item.firstcolumlen;
|
|
|
|
if(Store.flowdata[r] == null){
|
|
continue;
|
|
}
|
|
|
|
if(Store.flowdata[r][c] == null){ //空单元格
|
|
nullCellRender(r, c, start_r, start_c, end_r, end_c);
|
|
}
|
|
else{
|
|
let cell = Store.flowdata[r][c];
|
|
let value = null, er = r, ec = c, end_ec = end_c;
|
|
|
|
if((typeof cell == "object") && "mc" in cell){
|
|
mcArr.push(cellupdate[cud]);
|
|
|
|
let margeMaindata = cell["mc"];
|
|
value = getcellvalue(margeMaindata.r, margeMaindata.c, null, "m");
|
|
|
|
if(value == null){
|
|
value = getcellvalue(margeMaindata.r, margeMaindata.c);
|
|
}
|
|
|
|
r = margeMaindata.r;
|
|
c = margeMaindata.c;
|
|
|
|
er += margeMaindata.rs;
|
|
ec += margeMaindata.rc;
|
|
|
|
if (c == 0) {
|
|
start_c = -scrollWidth;
|
|
}
|
|
else {
|
|
start_c = Store.visibledatacolumn[c - 1] - scrollWidth;
|
|
}
|
|
|
|
if (r == 0) {
|
|
start_r = -scrollHeight - 1;
|
|
}
|
|
else {
|
|
start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;
|
|
}
|
|
|
|
end_ec = Store.visibledatacolumn[ec] - scrollWidth;
|
|
}
|
|
else{
|
|
value = getcellvalue(r, c, null, "m");
|
|
if(value == null){
|
|
value = getcellvalue(r, c);
|
|
}
|
|
}
|
|
|
|
if(value == null || value.toString().length == 0){
|
|
nullCellRender(r, c, start_r, start_c, end_r, end_c);
|
|
|
|
//sparklines渲染
|
|
let borderfix = menuButton.borderfix(Store.flowdata, r, c);
|
|
let cellsize = [
|
|
Store.devicePixelRatio * (start_c + offsetLeft + borderfix[0]),
|
|
Store.devicePixelRatio * (start_r + offsetTop + 0.5 + borderfix[1]),
|
|
Store.devicePixelRatio * (end_c - start_c - 3 + borderfix[2]),
|
|
Store.devicePixelRatio * (end_r - start_r - 3 - 0.5 + borderfix[3])
|
|
];
|
|
sparklinesRender(r, c, cellsize[0], cellsize[1], "luckysheetTableContent", luckysheetTableContent);
|
|
}
|
|
else{
|
|
if((r + "_" + c) in dynamicArray_compute){//动态数组公式
|
|
value = dynamicArray_compute[r + "_" + c].v;
|
|
}
|
|
|
|
cellRender(r, c, start_r, start_c, end_r, end_c, value);
|
|
}
|
|
}
|
|
}
|
|
|
|
//合并单元格再处理
|
|
for(let m = 0; m < mcArr.length; m++){
|
|
let item = mcArr[m];
|
|
let r = item.r,
|
|
c = item.c,
|
|
start_r = item.start_r,
|
|
start_c = item.start_c,
|
|
end_r = item.end_r,
|
|
end_c = item.end_c;
|
|
let firstcolumlen = item.firstcolumlen;
|
|
|
|
let cell = Store.flowdata[r][c];
|
|
let value = null, er = r, ec = c, end_ec = end_c;
|
|
|
|
let margeMaindata = cell["mc"];
|
|
value = getcellvalue(margeMaindata.r, margeMaindata.c, null, "m");
|
|
|
|
if(value == null){
|
|
value = getcellvalue(margeMaindata.r, margeMaindata.c);
|
|
}
|
|
|
|
r = margeMaindata.r;
|
|
c = margeMaindata.c;
|
|
|
|
er += margeMaindata.rs;
|
|
ec += margeMaindata.rc;
|
|
|
|
if (c == 0) {
|
|
start_c = -scrollWidth;
|
|
}
|
|
else {
|
|
start_c = Store.visibledatacolumn[c - 1] - scrollWidth;
|
|
}
|
|
|
|
if (r == 0) {
|
|
start_r = -scrollHeight - 1;
|
|
}
|
|
else {
|
|
start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;
|
|
}
|
|
|
|
end_ec = Store.visibledatacolumn[ec] - scrollWidth;
|
|
|
|
if(value == null || value.toString().length == 0){
|
|
nullCellRender(r, c, start_r, start_c, end_r, end_c);
|
|
|
|
//sparklines渲染
|
|
let borderfix = menuButton.borderfix(Store.flowdata, r, c);
|
|
let cellsize = [
|
|
Store.devicePixelRatio * (start_c + offsetLeft + borderfix[0]),
|
|
Store.devicePixelRatio * (start_r + offsetTop + 0.5 + borderfix[1]),
|
|
Store.devicePixelRatio * (end_c - start_c - 3 + borderfix[2]),
|
|
Store.devicePixelRatio * (end_r - start_r - 3 - 0.5 + borderfix[3])
|
|
];
|
|
sparklinesRender(r, c, cellsize[0], cellsize[1], "luckysheetTableContent", luckysheetTableContent);
|
|
}
|
|
else{
|
|
if((r + "_" + c) in dynamicArray_compute){//动态数组公式
|
|
value = dynamicArray_compute[r + "_" + c].v;
|
|
}
|
|
|
|
cellRender(r, c, start_r, start_c, end_r, end_c, value, "offline");
|
|
}
|
|
}
|
|
|
|
//边框单独渲染
|
|
if(Store.config["borderInfo"] != null && Store.config["borderInfo"].length > 0){
|
|
//边框渲染
|
|
let borderLeftRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){
|
|
let linetype = style;
|
|
|
|
let m_st = Store.devicePixelRatio * (start_c - 2 + 0.5 + offsetLeft);
|
|
let m_ed = Store.devicePixelRatio * (start_r + offsetTop);
|
|
let line_st = Store.devicePixelRatio * (start_c - 2 + 0.5 + offsetLeft);
|
|
let line_ed = Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop);
|
|
|
|
menuButton.setLineDash(canvas, linetype, "v", m_st, m_ed, line_st, line_ed);
|
|
|
|
canvas.strokeStyle = color;
|
|
|
|
canvas.stroke();
|
|
canvas.closePath();
|
|
canvas.restore();
|
|
}
|
|
|
|
let borderRightRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){
|
|
let linetype = style;
|
|
|
|
let m_st = Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft);
|
|
let m_ed = Store.devicePixelRatio * (start_r + offsetTop);
|
|
let line_st = Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft);
|
|
let line_ed = Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop);
|
|
|
|
menuButton.setLineDash(canvas, linetype, "v", m_st, m_ed, line_st, line_ed);
|
|
|
|
canvas.strokeStyle = color;
|
|
|
|
canvas.stroke();
|
|
canvas.closePath();
|
|
canvas.restore();
|
|
}
|
|
|
|
let borderBottomRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){
|
|
let linetype = style;
|
|
|
|
let m_st = Store.devicePixelRatio * (start_c - 2 + offsetLeft);
|
|
let m_ed = Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop);
|
|
let line_st = Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft);
|
|
let line_ed = Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop);
|
|
|
|
menuButton.setLineDash(canvas, linetype, "h", m_st, m_ed, line_st, line_ed);
|
|
|
|
canvas.strokeStyle = color;
|
|
|
|
canvas.stroke();
|
|
canvas.closePath();
|
|
canvas.restore();
|
|
}
|
|
|
|
let borderTopRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas){
|
|
let linetype = style;
|
|
|
|
let m_st = Store.devicePixelRatio * (start_c - 2 + offsetLeft);
|
|
let m_ed = Store.devicePixelRatio * (start_r - 1 + 0.5 + offsetTop);
|
|
let line_st = Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft);
|
|
let line_ed = Store.devicePixelRatio * (start_r - 1 + 0.5 + offsetTop);
|
|
|
|
menuButton.setLineDash(canvas, linetype, "h", m_st, m_ed, line_st, line_ed);
|
|
|
|
canvas.strokeStyle = color;
|
|
|
|
canvas.stroke();
|
|
canvas.closePath();
|
|
canvas.restore();
|
|
}
|
|
|
|
let borderInfoCompute = getBorderInfoCompute();
|
|
|
|
for(let x in borderInfoCompute){
|
|
let bd_r = x.split("_")[0], bd_c = x.split("_")[1];
|
|
|
|
if(borderOffset[bd_r + "_" + bd_c]){
|
|
let start_r = borderOffset[bd_r + "_" + bd_c].start_r;
|
|
let start_c = borderOffset[bd_r + "_" + bd_c].start_c;
|
|
let end_r = borderOffset[bd_r + "_" + bd_c].end_r;
|
|
let end_c = borderOffset[bd_r + "_" + bd_c].end_c;
|
|
|
|
let borderLeft = borderInfoCompute[x].l;
|
|
if(borderLeft != null){
|
|
borderLeftRender(borderLeft.style, borderLeft.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);
|
|
}
|
|
|
|
let borderRight = borderInfoCompute[x].r;
|
|
if(borderRight != null){
|
|
borderRightRender(borderRight.style, borderRight.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);
|
|
}
|
|
|
|
let borderTop = borderInfoCompute[x].t;
|
|
if(borderTop != null){
|
|
borderTopRender(borderTop.style, borderTop.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);
|
|
}
|
|
|
|
let borderBottom = borderInfoCompute[x].b;
|
|
if(borderBottom != null){
|
|
borderBottomRender(borderBottom.style, borderBottom.color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, luckysheetTableContent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//渲染表格时有尾列时,清除右边灰色区域,防止表格有值溢出
|
|
if(dataset_col_ed == Store.visibledatacolumn.length - 1){
|
|
luckysheetTableContent.clearRect(
|
|
(fill_col_ed - scrollWidth + offsetLeft - 1) * Store.devicePixelRatio,
|
|
(offsetTop - 1) * Store.devicePixelRatio,
|
|
(Store.ch_width - Store.visibledatacolumn[dataset_col_ed]) * Store.devicePixelRatio,
|
|
(fill_row_ed - scrollHeight) * Store.devicePixelRatio
|
|
);
|
|
}
|
|
}
|
|
|
|
function getCellValueSize(cell, value, canvas, cellWidth, cellHeight, space_width, space_height){
|
|
let textWidth, textHeight;
|
|
|
|
value = value.toString();
|
|
|
|
let measureText = canvas.measureText(value);
|
|
let textW = measureText.width;
|
|
let textH = measureText.actualBoundingBoxDescent - measureText.actualBoundingBoxAscent;
|
|
|
|
if(cell.tb == '2' && textW > cellWidth - space_width * 2){
|
|
//自动换行 且 文本长度超出单元格长度
|
|
let strArr = [];//文本截断数组
|
|
strArr = getCellTextSplitArr(value, strArr, cellWidth - space_width * 2, canvas);
|
|
|
|
textWidth = cellWidth - space_width * 2;
|
|
textHeight = textH * strArr.length;
|
|
}
|
|
else if(cell.tr != null && cell.tr != '0'){
|
|
//旋转
|
|
if(cell.tr == '1' || cell.tr == '2'){
|
|
textWidth = 0.707 * (textW + textH);
|
|
textHeight = 0.707 * (textW + textH);
|
|
}
|
|
else if(cell.tr == '3'){
|
|
let vArr = [];
|
|
|
|
if(value.length > 1){
|
|
vArr = value.split('');
|
|
}
|
|
else{
|
|
vArr.push(value);
|
|
}
|
|
|
|
let textW_all, textH_all;
|
|
|
|
for(let i = 0; i < vArr.length; i++){
|
|
let measureText_i = canvas.measureText(vArr[i]);
|
|
textW_all += measureText_i.width;
|
|
textH_all += measureText_i.actualBoundingBoxDescent - measureText_i.actualBoundingBoxAscent;
|
|
}
|
|
|
|
textWidth = textW_all / vArr.length;
|
|
textHeight = textH_all;
|
|
}
|
|
else if(cell.tr == '4' || cell.tr == '5'){
|
|
textWidth = textH;
|
|
textHeight = textW;
|
|
}
|
|
}
|
|
else{
|
|
textWidth = textW;
|
|
textHeight = textH;
|
|
}
|
|
|
|
return {
|
|
width: textWidth,
|
|
height: textHeight
|
|
}
|
|
}
|
|
|
|
function luckysheetDrawMain_back(scrollWidth, scrollHeight, drawWidth, drawHeight, offsetLeft, offsetTop, columnOffsetCell, rowOffsetCell, mycanvas) {
|
|
if (scrollWidth == null) {
|
|
scrollWidth = $("#luckysheet-cell-main").scrollLeft();
|
|
}
|
|
if (scrollHeight == null) {
|
|
scrollHeight = $("#luckysheet-cell-main").scrollTop();
|
|
}
|
|
|
|
if (drawWidth == null) {
|
|
drawWidth = Store.luckysheetTableContentHW[0];
|
|
}
|
|
if (drawHeight == null) {
|
|
drawHeight = Store.luckysheetTableContentHW[1];
|
|
}
|
|
|
|
if (offsetLeft == null) {
|
|
offsetLeft = Store.rowHeaderWidth;
|
|
}
|
|
if (offsetTop == null) {
|
|
offsetTop = Store.columeHeaderHeight;
|
|
}
|
|
|
|
if (columnOffsetCell == null) {
|
|
columnOffsetCell = 0;
|
|
}
|
|
if (rowOffsetCell == null) {
|
|
rowOffsetCell = 0;
|
|
}
|
|
|
|
let luckysheetTableContent = null;
|
|
if(mycanvas == null){
|
|
luckysheetTableContent = $("#luckysheetTableContent").get(0).getContext("2d");
|
|
}
|
|
else {
|
|
if(getObjType(mycanvas) == "object"){
|
|
try{
|
|
luckysheetTableContent = mycanvas.get(0).getContext("2d");
|
|
}
|
|
catch(err){
|
|
luckysheetTableContent = mycanvas;
|
|
}
|
|
}
|
|
else{
|
|
luckysheetTableContent = $("#" + mycanvas).get(0).getContext("2d");
|
|
}
|
|
}
|
|
|
|
luckysheetTableContent.clearRect(
|
|
offsetLeft * Store.devicePixelRatio,
|
|
offsetTop * Store.devicePixelRatio,
|
|
drawWidth * Store.devicePixelRatio,
|
|
drawHeight * Store.devicePixelRatio
|
|
);
|
|
|
|
//离屏canvas
|
|
let offlinecanvas = $("#luckysheetTableContentF").get(0).getContext("2d");
|
|
offlinecanvas.fillStyle = "#ffffff";
|
|
offlinecanvas.fillRect(
|
|
0,
|
|
0,
|
|
Store.luckysheetTableContentHW[0] * Store.devicePixelRatio,
|
|
Store.luckysheetTableContentHW[1] * Store.devicePixelRatio
|
|
);
|
|
|
|
offlinecanvas.font = luckysheetdefaultstyle.font;
|
|
offlinecanvas.textBaseline = "top";
|
|
offlinecanvas.fillStyle = luckysheetdefaultstyle.fillStyle;
|
|
|
|
let dataset_row_st, dataset_row_ed, dataset_col_st, dataset_col_ed;
|
|
|
|
dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);
|
|
dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);
|
|
|
|
if (dataset_row_st == -1) {
|
|
dataset_row_st = 0;
|
|
}
|
|
|
|
dataset_row_st += rowOffsetCell;
|
|
|
|
if (dataset_row_ed == -1) {
|
|
dataset_row_ed = Store.visibledatarow.length - 1;
|
|
}
|
|
|
|
dataset_row_ed += rowOffsetCell;
|
|
|
|
if (dataset_row_ed >= Store.visibledatarow.length) {
|
|
dataset_row_ed = Store.visibledatarow.length - 1;
|
|
}
|
|
|
|
dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);
|
|
dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);
|
|
|
|
if (dataset_col_st == -1) {
|
|
dataset_col_st = 0;
|
|
}
|
|
|
|
dataset_col_st += columnOffsetCell;
|
|
|
|
if (dataset_col_ed == -1) {
|
|
dataset_col_ed = Store.visibledatacolumn.length - 1;
|
|
}
|
|
|
|
dataset_col_ed += columnOffsetCell;
|
|
|
|
if (dataset_col_ed >= Store.visibledatacolumn.length) {
|
|
dataset_col_ed = Store.visibledatacolumn.length - 1;
|
|
}
|
|
|
|
let fill_row_st, fill_row_ed, fill_col_st, fill_col_ed;
|
|
if(dataset_row_st==0){
|
|
fill_row_st = 0;
|
|
}
|
|
else{
|
|
fill_row_st = Store.visibledatarow[dataset_row_st-1];
|
|
}
|
|
|
|
fill_row_ed = Store.visibledatarow[dataset_row_ed];
|
|
|
|
if(dataset_col_st==0){
|
|
fill_col_st = 0;
|
|
}
|
|
else{
|
|
fill_col_st = Store.visibledatacolumn[dataset_col_st-1];
|
|
}
|
|
|
|
fill_col_ed = Store.visibledatacolumn[dataset_col_ed];
|
|
|
|
luckysheetTableContent.fillStyle="#ffffff";
|
|
luckysheetTableContent.fillRect(
|
|
(offsetLeft - 1) * Store.devicePixelRatio,
|
|
(offsetTop - 1) * Store.devicePixelRatio,
|
|
(fill_col_ed - fill_col_st) * Store.devicePixelRatio,
|
|
(fill_row_ed - fill_row_st) * Store.devicePixelRatio
|
|
);
|
|
|
|
let end_r, start_r, end_c, start_c;
|
|
|
|
let cellupdate = [];
|
|
let mergeCache = {};
|
|
for (let r = dataset_row_st; r <= dataset_row_ed; r++) {
|
|
if (r == 0) {
|
|
start_r = -scrollHeight - 1;
|
|
}
|
|
else {
|
|
start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;
|
|
}
|
|
end_r = Store.visibledatarow[r] - scrollHeight;
|
|
|
|
for (let c = dataset_col_st; c <= dataset_col_ed; c++) {
|
|
if (c == 0) {
|
|
start_c = -scrollWidth;
|
|
}
|
|
else {
|
|
start_c = Store.visibledatacolumn[c - 1] - scrollWidth;
|
|
}
|
|
end_c = Store.visibledatacolumn[c] - scrollWidth;
|
|
|
|
if(c==dataset_col_ed){
|
|
if (!Store.luckysheetcurrentisPivotTable && end_r <= drawHeight && start_r >= -1) {
|
|
//行
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (offsetLeft - 1),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2 + 0.5)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft-2),
|
|
Store.devicePixelRatio * (end_r + offsetTop - 2 + 0.5)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
|
|
if (r == dataset_row_st) {
|
|
if (!Store.luckysheetcurrentisPivotTable && end_c <= drawWidth + 18 && start_c >= -1) {
|
|
//列
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2 + 0.5),
|
|
Store.devicePixelRatio * (offsetTop - 1)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2 + 0.5),
|
|
Store.devicePixelRatio * (fill_row_ed - fill_row_st + offsetTop-2)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
|
|
if (!!Store.luckysheetcurrentisPivotTable && pivotTable.drawPivotTable) {
|
|
if ((c == 0 || c == 5) && r <= 11) {
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
|
|
if ((r == 2 || r == 11) && c <= 5) {
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (start_c - 1 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft-2),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
|
|
if (r == 6 && c == 3) {
|
|
luckysheetTableContent.fillText(
|
|
"数据透视表",
|
|
Store.devicePixelRatio * (start_c + 4 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r + (end_r - start_r) / 2 - 1 + offsetTop)
|
|
);
|
|
}
|
|
}
|
|
else if (!!Store.luckysheetcurrentisPivotTable) {
|
|
if (c < pivotTable.pivotTableBoundary[1] && r < pivotTable.pivotTableBoundary[0]) {
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
|
|
luckysheetTableContent.beginPath();
|
|
luckysheetTableContent.moveTo(
|
|
Store.devicePixelRatio * (start_c - 1 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
luckysheetTableContent.lineTo(
|
|
Store.devicePixelRatio * (end_c + offsetLeft - 2),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop));
|
|
luckysheetTableContent.lineWidth = Store.devicePixelRatio;
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
luckysheetTableContent.closePath();
|
|
luckysheetTableContent.stroke();
|
|
}
|
|
}
|
|
|
|
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
|
|
|
|
}
|
|
else {
|
|
if (Store.flowdata[r] != null && Store.flowdata[r][c] != null && start_r >= -1 && start_c >= -1 ) {
|
|
let value = Store.flowdata[r][c];
|
|
|
|
let firstcolumlen = Store.defaultcollen;
|
|
if (Store.config["columlen"] != null && Store.config["columlen"][c] != null) {
|
|
firstcolumlen = Store.config["columlen"][c];
|
|
}
|
|
|
|
if(getObjType(value) == "object" && ("mc" in value)){
|
|
if("rs" in value["mc"]){
|
|
let key = "r"+ r + "c" + c;
|
|
mergeCache[key] = cellupdate.length;
|
|
}
|
|
else{
|
|
let key = "r"+ value["mc"].r + "c" + value["mc"].c;
|
|
let margeMain = cellupdate[mergeCache[key]];
|
|
|
|
if(margeMain==null){
|
|
mergeCache[key] = cellupdate.length;
|
|
cellupdate.push({
|
|
"r": r,
|
|
"c": c,
|
|
"start_c": start_c,
|
|
"start_r": start_r,
|
|
"end_r": end_r,
|
|
"end_c": end_c,
|
|
"firstcolumlen": firstcolumlen,
|
|
"startlist": []
|
|
});
|
|
}
|
|
else{
|
|
if(margeMain.c==c){
|
|
margeMain.end_r += (end_r-start_r-1);
|
|
margeMain.startlist.push(start_r);
|
|
}
|
|
|
|
if(margeMain.r==r){
|
|
margeMain.end_c += (end_c-start_c);
|
|
margeMain.firstcolumlen += firstcolumlen;
|
|
}
|
|
|
|
|
|
let margeMaindata = Store.flowdata[margeMain.r][margeMain.c];
|
|
if((margeMain.c + margeMaindata.mc.cs-1)==c && (margeMain.r + margeMaindata.mc.rs-1)==r){
|
|
//margeMain.end_r -= 10;
|
|
//margeMain.end_c -= 1;
|
|
}
|
|
}
|
|
|
|
continue;
|
|
}
|
|
}
|
|
cellupdate.push({
|
|
"r": r,
|
|
"c": c,
|
|
"start_c": start_c,
|
|
"start_r": start_r,
|
|
"end_r": end_r,
|
|
"end_c": end_c,
|
|
"firstcolumlen": firstcolumlen,
|
|
"startlist": []
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
for(let cud = 0; cud < cellupdate.length; cud++){
|
|
let item = cellupdate[cud];
|
|
let r= item.r,
|
|
c = item.c,
|
|
start_c = item.start_c,
|
|
start_r = item.start_r,
|
|
end_c = item.end_c,
|
|
end_r = item.end_r;
|
|
let firstcolumlen = item.firstcolumlen;
|
|
|
|
let cell = Store.flowdata[r][c];
|
|
let value = null, er = r, ec = c, end_ec = end_c;
|
|
if((typeof cell == "object") && "mc" in cell){
|
|
let margeMaindata = cell["mc"];
|
|
value = getcellvalue(margeMaindata.r, margeMaindata.c, null,"m");
|
|
if(value == null){
|
|
value = getcellvalue(margeMaindata.r, margeMaindata.c);
|
|
}
|
|
|
|
r = margeMaindata.r;
|
|
c = margeMaindata.c;
|
|
|
|
er += margeMaindata.rs;
|
|
ec += margeMaindata.rc;
|
|
|
|
if (c == 0) {
|
|
start_c = -scrollWidth;
|
|
}
|
|
else {
|
|
start_c = Store.visibledatacolumn[c - 1] - scrollWidth;
|
|
}
|
|
|
|
if (r == 0) {
|
|
start_r = -scrollHeight - 1;
|
|
}
|
|
else {
|
|
start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;
|
|
}
|
|
|
|
end_ec = Store.visibledatacolumn[ec] - scrollWidth;
|
|
}
|
|
else{
|
|
value = getcellvalue(r, c, null,"m");
|
|
if(value == null){
|
|
value = getcellvalue(r, c);
|
|
}
|
|
}
|
|
|
|
let borderfix = menuButton.borderfix(Store.flowdata, r, c);
|
|
offlinecanvas.fillStyle= menuButton.checkstatus(Store.flowdata, r, c , "bg");
|
|
|
|
let cellsize = [
|
|
Store.devicePixelRatio * (start_c + offsetLeft + borderfix[0]),
|
|
Store.devicePixelRatio * (start_r + offsetTop + 0.5 + borderfix[1]),
|
|
Store.devicePixelRatio * (end_c - start_c - 3 + borderfix[2]),
|
|
Store.devicePixelRatio * (end_r - start_r-3 - 0.5 + borderfix[3])
|
|
];
|
|
offlinecanvas.fillRect(cellsize[0], cellsize[1], cellsize[2], cellsize[3]);
|
|
|
|
offlinecanvas.fillStyle= menuButton.checkstatus(Store.flowdata, r, c , "fc");
|
|
|
|
let fontset = luckysheetfontformat(Store.flowdata[r][c]);
|
|
offlinecanvas.font = fontset;
|
|
|
|
let textMetrics = offlinecanvas.measureText(value).width;
|
|
let oneLineTextHeight = menuButton.getTextSize("田", fontset)[1];
|
|
|
|
offlinecanvas.fillStyle= menuButton.checkstatus(Store.flowdata, r, c , "fc");
|
|
|
|
let horizonAlign = menuButton.checkstatus(Store.flowdata, r, c , "ht");
|
|
let horizonAlignPos = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
|
|
if(horizonAlign == "0"){
|
|
horizonAlignPos = (start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - (textMetrics)/2;
|
|
}
|
|
else if(horizonAlign=="2"){
|
|
horizonAlignPos = (end_c + offsetLeft - 8) * Store.devicePixelRatio - (textMetrics);
|
|
}
|
|
|
|
let verticalAlign = menuButton.checkstatus(Store.flowdata, r, c , "vt");
|
|
let verticalFixed = browser.luckysheetrefreshfixed();
|
|
let verticalAlignPos = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight;
|
|
if(verticalAlign == "0"){
|
|
verticalAlignPos = (start_r + (end_r - start_r) / 2 + offsetTop + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight/2;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
verticalAlignPos = (start_r + offsetTop + verticalFixed) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//自动换行、旋转、删除线功能
|
|
if(Store.flowdata[r][c].tb == "2" && textMetrics > (end_c - start_c)){
|
|
let strValue = value.toString();
|
|
let cellWidth = end_c-start_c-8;
|
|
let strArr = [];
|
|
|
|
for(let strI = 1; strI <= strValue.length; strI++){
|
|
let strV = strValue.substring(strArr.join("").length,strI);
|
|
let strtextMetrics = offlinecanvas.measureText(strV).width;
|
|
if(strtextMetrics > cellWidth){
|
|
strArr.push(strValue.substring(strArr.join("").length,strI - 1));
|
|
strI = strI - 2;
|
|
}
|
|
else if(strtextMetrics <= cellWidth && strI == strValue.length){
|
|
strArr.push(strV);
|
|
}
|
|
}
|
|
|
|
for(let iFill = 0; iFill < strArr.length; iFill++){
|
|
//水平对齐计算
|
|
let strWidth = offlinecanvas.measureText(strArr[iFill]).width;
|
|
if(horizonAlign == "0"){
|
|
horizonAlignPos = (start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - (strWidth)/2;
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
horizonAlignPos = (end_c + offsetLeft - 8) * Store.devicePixelRatio - (strWidth);
|
|
}
|
|
else{
|
|
horizonAlignPos = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//垂直对齐计算
|
|
if(verticalAlign == "0"){
|
|
verticalAlignPos = (start_r + (end_r - start_r) / 2 + offsetTop + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight * strArr.length / 2;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
verticalAlignPos = (start_r + offsetTop + verticalFixed) * Store.devicePixelRatio;
|
|
}
|
|
else{
|
|
verticalAlignPos = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight * strArr.length;
|
|
}
|
|
|
|
offlinecanvas.fillText(strArr[iFill], horizonAlignPos, (verticalAlignPos + iFill * Store.oneLineTextHeight));
|
|
}
|
|
}
|
|
else if(!!Store.flowdata[r][c].tr && Store.flowdata[r][c].tr != "0"){
|
|
//单元格旋转属性
|
|
let tr = Store.flowdata[r][c].tr;
|
|
|
|
if(tr == "1" || tr == "2"){
|
|
//旋转重新计算水平、垂直方向坐标
|
|
let textW = 0.707 * (textMetrics + oneLineTextHeight);
|
|
let textH = 0.707 * (textMetrics + oneLineTextHeight);
|
|
|
|
let hAP = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
|
|
if(horizonAlign=="0"){
|
|
hAP = (start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - (textW)/2;
|
|
}
|
|
else if(horizonAlign=="2"){
|
|
hAP = (end_c + offsetLeft - 8) * Store.devicePixelRatio - (textW);
|
|
}
|
|
|
|
let vAP = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign=="0"){
|
|
vAP = (start_r + (end_r - start_r) / 2 + offsetTop + verticalFixed) * Store.devicePixelRatio - textH/2;
|
|
}
|
|
else if(verticalAlign=="1"){
|
|
vAP = (start_r + offsetTop + verticalFixed) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//向下倾斜(45 旋转)
|
|
if(tr == "1"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP, vAP);
|
|
offlinecanvas.rotate(45 * Math.PI / 180);
|
|
offlinecanvas.translate(-hAP, -vAP);
|
|
offlinecanvas.fillText(
|
|
value == null ? "" : value,
|
|
hAP + (0.707 * 0.707 * oneLineTextHeight),
|
|
vAP - (0.707 * 0.707 * oneLineTextHeight)
|
|
);
|
|
offlinecanvas.restore();
|
|
|
|
//是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
if(cl == "1" && !!value){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(hAP + oneLineTextHeight/2, vAP + oneLineTextHeight/2);
|
|
offlinecanvas.lineTo(hAP + textW - oneLineTextHeight/2, vAP + textH - oneLineTextHeight/2);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
//向上倾斜(-45 旋转)
|
|
if(tr == "2"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP + textW, vAP);
|
|
offlinecanvas.rotate(-45 * Math.PI / 180);
|
|
offlinecanvas.translate(-(hAP + textW), -vAP);
|
|
offlinecanvas.fillText(
|
|
value == null ? "" : value,
|
|
hAP - (0.707 * 0.707 * oneLineTextHeight),
|
|
vAP - (0.707 * 0.707 * oneLineTextHeight)
|
|
);
|
|
offlinecanvas.restore();
|
|
|
|
//是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
if(cl == "1" && !!value){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(hAP + oneLineTextHeight/2, vAP + textH - oneLineTextHeight/2);
|
|
offlinecanvas.lineTo(hAP + textW - oneLineTextHeight/2, vAP + oneLineTextHeight/2);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
}
|
|
else if(tr == "3"){
|
|
if(!!value){
|
|
value = value.toString();
|
|
|
|
let vArr;
|
|
if(value.length > 1){
|
|
vArr = value.split("");
|
|
}
|
|
else{
|
|
vArr = [];
|
|
vArr.push(value);
|
|
}
|
|
|
|
let textW = offlinecanvas.measureText(vArr[0]).width;
|
|
let textH = vArr.length * oneLineTextHeight;
|
|
|
|
for(let i = 0; i < vArr.length; i++){
|
|
let vWidth = offlinecanvas.measureText(vArr[i]).width;
|
|
|
|
//水平对齐计算
|
|
if(horizonAlign == "0"){
|
|
horizonAlignPos = (start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - (vWidth)/2;
|
|
}
|
|
else if(horizonAlign == "2"){
|
|
horizonAlignPos = (end_c + offsetLeft - 8) * Store.devicePixelRatio - (vWidth);
|
|
}
|
|
else{
|
|
horizonAlignPos = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//垂直对齐计算
|
|
if(verticalAlign == "0"){
|
|
verticalAlignPos = (start_r + (end_r - start_r) / 2 + offsetTop + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight*vArr.length/2;
|
|
}
|
|
else if(verticalAlign == "1"){
|
|
verticalAlignPos = (start_r + offsetTop + verticalFixed) * Store.devicePixelRatio;
|
|
}
|
|
else{
|
|
verticalAlignPos = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio - oneLineTextHeight*vArr.length;
|
|
}
|
|
|
|
offlinecanvas.fillText(vArr[i], horizonAlignPos, (verticalAlignPos + i * oneLineTextHeight));
|
|
}
|
|
|
|
//是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
if(cl == "1" && !!value){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(horizonAlignPos + textW/2, verticalAlignPos);
|
|
offlinecanvas.lineTo(horizonAlignPos + textW/2, verticalAlignPos + textH);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
}
|
|
else if(tr == "4" || tr == "5"){
|
|
//旋转重新计算水平、垂直方向坐标
|
|
let textW = oneLineTextHeight;
|
|
let textH = textMetrics;
|
|
|
|
let hAP = (start_c + 4 + offsetLeft) * Store.devicePixelRatio;
|
|
if(horizonAlign=="0"){
|
|
hAP = (start_c + (end_c - start_c) / 2 + offsetLeft) * Store.devicePixelRatio - (textW)/2;
|
|
}
|
|
else if(horizonAlign=="2"){
|
|
hAP = (end_c + offsetLeft - 8) * Store.devicePixelRatio - (textW);
|
|
}
|
|
|
|
let vAP = (end_r + offsetTop - 2 + verticalFixed) * Store.devicePixelRatio - textH;
|
|
if(verticalAlign=="0"){
|
|
vAP = (start_r + (end_r - start_r) / 2 + offsetTop + verticalFixed) * Store.devicePixelRatio - textH/2;
|
|
}
|
|
else if(verticalAlign=="1"){
|
|
vAP = (start_r + offsetTop + verticalFixed) * Store.devicePixelRatio;
|
|
}
|
|
|
|
//向下90(90 旋转)
|
|
if(tr == "4"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP, vAP);
|
|
offlinecanvas.rotate(90 * Math.PI / 180);
|
|
offlinecanvas.translate(-hAP, -vAP);
|
|
offlinecanvas.fillText(value == null ? "" : value, hAP, vAP - textW);
|
|
offlinecanvas.restore();
|
|
|
|
//是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
if(cl == "1" && !!value){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(hAP + textW/2, vAP);
|
|
offlinecanvas.lineTo(hAP + textW/2, vAP + textH);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
//向上90(-90 旋转)
|
|
if(tr == "5"){
|
|
offlinecanvas.save();
|
|
offlinecanvas.translate(hAP + textH, vAP);
|
|
offlinecanvas.rotate(-90 * Math.PI / 180);
|
|
offlinecanvas.translate(-(hAP + textH), -vAP);
|
|
offlinecanvas.fillText(value == null ? "" : value, hAP, vAP - textH);
|
|
offlinecanvas.restore();
|
|
|
|
//是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
if(cl == "1" && !!value){
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(hAP + textW/2, vAP);
|
|
offlinecanvas.lineTo(hAP + textW/2, vAP + textH);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
//是否有删除线
|
|
let cl = menuButton.checkstatus(Store.flowdata, r, c , "cl");
|
|
if(cl == "1" && !!value){
|
|
luckysheetTableContent.strokeStyle = "#000000";
|
|
|
|
offlinecanvas.beginPath();
|
|
offlinecanvas.moveTo(horizonAlignPos, verticalAlignPos + oneLineTextHeight/2);
|
|
offlinecanvas.lineTo(horizonAlignPos + textMetrics, verticalAlignPos + oneLineTextHeight/2);
|
|
offlinecanvas.closePath();
|
|
offlinecanvas.stroke();
|
|
|
|
offlinecanvas.textBaseline = "middle";
|
|
offlinecanvas.fillText(value==null?"":value, horizonAlignPos, verticalAlignPos + oneLineTextHeight/2);
|
|
}
|
|
else{
|
|
offlinecanvas.textBaseline = "top";
|
|
offlinecanvas.fillText(value==null?"":value, horizonAlignPos, verticalAlignPos);
|
|
}
|
|
}
|
|
|
|
offlinecanvas.font = luckysheetdefaultstyle.font;
|
|
|
|
luckysheetTableContent.drawImage($("#luckysheetTableContentF").get(0), cellsize[0], cellsize[1], cellsize[2], cellsize[3], cellsize[0], cellsize[1], cellsize[2], cellsize[3]);
|
|
|
|
let bs = menuButton.checkstatus(Store.flowdata, r, c , "bs");
|
|
let bc = menuButton.checkstatus(Store.flowdata, r, c , "bc");
|
|
let bs_t = menuButton.checkstatus(Store.flowdata, r, c , "bs_t");
|
|
let bc_t = menuButton.checkstatus(Store.flowdata, r, c , "bc_t");
|
|
let bs_b = menuButton.checkstatus(Store.flowdata, r, c , "bs_b");
|
|
let bc_b = menuButton.checkstatus(Store.flowdata, r, c , "bc_b");
|
|
let bs_l = menuButton.checkstatus(Store.flowdata, r, c , "bs_l");
|
|
let bc_l = menuButton.checkstatus(Store.flowdata, r, c , "bc_l");
|
|
let bs_r = menuButton.checkstatus(Store.flowdata, r, c , "bs_r");
|
|
let bc_r = menuButton.checkstatus(Store.flowdata, r, c , "bc_r");
|
|
|
|
//左边框
|
|
if(bs_l!="none" || bs!="none"){
|
|
let linetype = bs_l=="none" ?bs:bs_l;
|
|
|
|
menuButton.setLineDash(
|
|
luckysheetTableContent,
|
|
linetype,
|
|
"v",
|
|
Store.devicePixelRatio * (start_c - 2+ 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r + offsetTop),
|
|
Store.devicePixelRatio * (start_c - 2+ 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + offsetTop)
|
|
);
|
|
|
|
luckysheetTableContent.strokeStyle = bs_l == "none" ? bc : bc_l;
|
|
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
// //右边框
|
|
if(bs_r!="none" || bs!="none"){
|
|
let linetype = bs_r=="none" ?bs:bs_r;
|
|
|
|
menuButton.setLineDash(
|
|
luckysheetTableContent,
|
|
linetype,
|
|
"v",
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r + offsetTop),
|
|
Store.devicePixelRatio * (end_c - 2 + 0.5 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + offsetTop)
|
|
);
|
|
|
|
luckysheetTableContent.strokeStyle = bs_r == "none" ? bc : bc_r;
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
//下边框
|
|
if(bs_b!="none" || bs!="none"){
|
|
let linetype = bs_b=="none" ?bs:bs_b;
|
|
|
|
menuButton.setLineDash(
|
|
luckysheetTableContent,
|
|
linetype,
|
|
"h",
|
|
Store.devicePixelRatio * (start_c - 2 + offsetLeft),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop),
|
|
Store.devicePixelRatio * (end_c + offsetLeft-2),
|
|
Store.devicePixelRatio * (end_r - 2 + 0.5 + offsetTop)
|
|
);
|
|
|
|
luckysheetTableContent.strokeStyle = bs_b == "none" ? bc : bc_b;
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
|
|
//上边框
|
|
if(bs_t!="none" || bs!="none"){
|
|
let linetype = bs_t=="none" ?bs:bs_t;
|
|
|
|
menuButton.setLineDash(
|
|
luckysheetTableContent,
|
|
linetype,
|
|
"h",
|
|
Store.devicePixelRatio * (start_c - 2 + offsetLeft),
|
|
Store.devicePixelRatio * (start_r - 1 + 0.5 + offsetTop),
|
|
Store.devicePixelRatio * (end_c + offsetLeft-2),
|
|
Store.devicePixelRatio * (start_r - 1 + 0.5 + offsetTop)
|
|
);
|
|
|
|
luckysheetTableContent.strokeStyle = bs_t == "none" ? bc : bc_t;
|
|
luckysheetTableContent.stroke();
|
|
luckysheetTableContent.closePath();
|
|
}
|
|
}
|
|
}
|
|
|
|
export {
|
|
luckysheetDrawgrid,
|
|
luckysheetDrawgridRowTitle,
|
|
luckysheetDrawgridColumnTitle,
|
|
luckysheetDrawMain,
|
|
luckysheetDrawMain_back,
|
|
}
|