概述
本 Demo 展示了如何通过继承 FormatterBase 类创建自定义格式器,实现基于单元格值的条件格式化和文本颜色设置。Demo 中演示了两个自定义格式器:CustomNumberFormat 根据数值范围设置不同颜色,CustomDateFormat 根据日期年份设置颜色。
实现思路
创建 CustomDateFormat 类,继承自 GC.Spread.Formatter.FormatterBase
实现 format 方法,根据日期年份设置条件颜色(1990 年后为蓝色,否则为红色)
创建 CustomNumberFormat 类,同样继承自 FormatterBase
实现 format 方法,根据数值范围设置条件颜色(≥10 绿色,>0 金色,≤0 蓝色,非数值红色)
为两列单元格分别设置自定义格式器
代码解析
自定义日期格式器
这段代码实现了日期格式化器的 format 方法。首先将单元格值转换为 Date 对象,然后根据年份判断设置条件颜色。通过设置 formattedData.conditionalForeColor 可以改变单元格文本的颜色。
自定义数字格式器
这段代码实现了数字格式化器的核心逻辑。根据数值范围设置不同的条件颜色,对于 NaN 和 Infinity 等非有限数值则显示红色。
应用自定义格式器
使用 getRange().formatter() 方法为单元格区域设置自定义格式器。
运行效果
第一列(Custom Number)显示数字,根据数值范围自动设置颜色:≥10 显示绿色,0-9 显示金色,≤0 显示蓝色,非数字显示红色
第二列(Custom Date)显示日期,1990 年后的日期显示蓝色,之前的显示红色
用户可以修改单元格的值,格式器会自动应用相应的颜色规则
API 参考
FormatterBase 类
用于创建自定义格式器的基类。
format 方法
obj:单元格的原始值
options.conditionalForeColor:可选,设置单元格文本颜色
返回值:格式化后的字符串
parse 方法
str:要解析的文本
返回值:解析后的值
var spreadNS = GC.Spread.Sheets;
function CustomDateFormat() {
}
CustomDateFormat.prototype = new GC.Spread.Formatter.FormatterBase();
CustomDateFormat.prototype.format = function (obj, formattedData) {
var date = new Date(obj);
if (date instanceof Date && isFinite(date)) {
if (date.getFullYear() > 1990 && formattedData) {
formattedData.conditionalForeColor = "blue";
} else if (formattedData) {
formattedData.conditionalForeColor = "red";
}
return (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
}
else {
return obj != null ? obj.toString() : "";
}
};
CustomDateFormat.prototype.parse = function (str) {
return new GC.Spread.Formatter.GeneralFormatter().parse(str);
};
function CustomNumberFormat() {
}
CustomNumberFormat.prototype = new GC.Spread.Formatter.FormatterBase();
CustomNumberFormat.prototype.format = function (obj, formattedData) {
if (typeof obj === "number") {
return formatNumber(obj, formattedData);
} else if (typeof obj === "string") {
if (Number.isFinite(+obj)) {
return formatNumber(parseFloat(obj), formattedData);
}
}
return obj ? obj.toString() : "";
};
function formatNumber(value, formattedData) {
if (isFinite(value) && formattedData) {
if (value >= 10) {
formattedData.conditionalForeColor = "green";
} else if (value > 0) {
formattedData.conditionalForeColor = "gold";
} else {
formattedData.conditionalForeColor = "blue";
}
} else if (formattedData) {
formattedData.conditionalForeColor = "red";
}
return value.toString();
}
CustomNumberFormat.prototype.parse = function (str) {
return new GC.Spread.Formatter.GeneralFormatter().parse(str);
};
window.onload = function () {
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 1});
initSpread(spread);
};
function initSpread(spread) {
var sheet = spread.getSheet(0);
spread.suspendPaint();
sheet.name("Custom Formatter");
initData(sheet);
spread.resumePaint();
};
function initData(sheet) {
sheet.setArray(0, 0, [
[123, new Date(2002, 2, 6)],
["-18", "1988/3/2"],
["0", "Oct 9, 2011"],
[4, 4],
[NaN, NaN],
[Infinity, Infinity]
]);
for (var c = 0; c < 2; c++) {
sheet.setColumnWidth(c, 120);
}
sheet.getRange(0, 0, 6, 2).formatter(new CustomNumberFormat());
sheet.getRange(0, 1, 6, 2).formatter(new CustomDateFormat());
sheet.setText(0, 0, "Custom Number", spreadNS.SheetArea.colHeader);
sheet.setText(0, 1, "Custom Date", spreadNS.SheetArea.colHeader);
};
<!doctype html>
<html style="height:100%;font-size:14px;">
<head>
<meta name="spreadjs culture" content="zh-cn" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css"
href="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css">
<script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/dist/gc.spread.sheets.all.min.js"
type="text/javascript"></script>
<script
src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.min.js"
type="text/javascript"></script>
<script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script>
<script src="app.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="sample-tutorial">
<div id="ss" class="sample-spreadsheets"></div>
<div class="options-container">
<div class="option-row" style="padding:2px 10px">
<p>
修改这些值。单元格已设置自定义格式器,可根据特定条件显示特定颜色:<br />
- 若数字为正数,则显示金色<br />
- 若数字大于 9,则显示绿色<br />
- 若日期在 1990 年之后,则显示蓝色<br />
否则,单元格颜色为红色。
</p>
</div>
</div>
</div>
</body>
</html>
.sample-tutorial {
position: relative;
height: 100%;
overflow: hidden;
}
.sample-spreadsheets {
width: calc(100% - 280px);
height: 100%;
overflow: hidden;
float: left;
}
.options-container {
float: right;
width: 280px;
padding: 12px;
height: 100%;
box-sizing: border-box;
background: #fbfbfb;
overflow: auto;
}
.option-row {
font-size: 14px;
padding: 5px;
margin-top: 10px;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}