- /******************************** 单元格文本换行,重写 Tex 的 paint 方法 ********************************/
- function AutoWrapTextCellType() {
- }
- AutoWrapTextCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
- AutoWrapTextCellType.prototype.paint = function (ctx, value, x, y, w, h, style, context) {
- ctx.font = style.font;
- value = wrapString(ctx, value, w - 2);
- GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, [ctx, value, x, y, w, h, style, context]);
- };
- function wrapString(c, str, maxWidth) {
- if(typeof str == 'object' && str['richText']){
- return wrapRichTextString(c, str, maxWidth);
- }
- return wrapTextString(c, str, maxWidth)
- }
- /**
- * 对普通文本进行换行
- * @param c
- * @param str
- * @param maxWidth
- * @returns {string|*}
- */
- function wrapTextString(c, str, maxWidth){
- let width = c.measureText(str).width;
- if (width <= maxWidth) return str;
- const len = str.length;
- let newStrList = [];
- let index = 0;
- for (let i = 0; i < len; i++) {
- // 临时拼接字符串
- let _newStr = newStrList[index] + str[i];
- // 临时拼接字符串的长度
- let newWidth = c.measureText(_newStr).width;
- // 初始化数组
- if (!newStrList[index]) newStrList[index] = '';
- // 长度判断
- if (newWidth >= maxWidth) { // 长度超过,换行
- newStrList[index + 1] = newStrList[index].substr(newStrList[index].length - 1) + str[i];
- newStrList[index] = newStrList[index].substr(0, newStrList[index].length - 1);
- index++;
- } else {
- newStrList[index] = newStrList[index] + str[i];
- }
- }
- return newStrList.join('\r\n');
- }
- /**
- * 对富文本进行换行
- * @param c
- * @param str
- * @param maxWidth
- * @returns {*}
- */
- function wrapRichTextString(c, str, maxWidth){
- const richText = str['richText'];
- const newRichText = [];
- // 之前部分遗留的字符串
- let prevStr = '';
- // 需要测量长度的字符串
- let tmpStr = '';
- let index = 0;
- for (let i = 0; i < richText.length; i++) {
- const text = richText[i]['text'];
- const style = richText[i]['style'];
- const len = text.length;
- for (let j = 0; j < len; j++) {
- // 临时拼接字符串
- let _tmpStr = tmpStr + text[j];
- // 临时拼接字符串的长度 上个部分遗留的+当前拼接的
- let newWidth = c.measureText(prevStr+_tmpStr).width;
- // 长度判断
- if (newWidth >= maxWidth) { // 长度超过,换行
- newRichText[index] = {
- text : tmpStr,
- style: style,
- }
- index++;
- newRichText[index] = {
- text : '\r\n',
- style: style,
- }
- index++;
- // 记录当前字符,并将之前部分的记录清空
- tmpStr = text[j];
- prevStr = '';
- } else {
- tmpStr = _tmpStr;
- }
- }
- // 每一部分结束后,将剩余的该部分单独组成一个完成的部分,并记录到prevStr
- newRichText[index] = {
- text : tmpStr,
- style: style,
- }
- index++;
- prevStr = prevStr + tmpStr;
- tmpStr = '';
- }
- str['richText'] = newRichText
- return str;
- }
复制代码
这是换行的cellType,spreadjs并不识别 |