概述
本 Demo 展示了 SpreadJS 中单元格内容的多种显示模式,包括数字自适应模式、自动缩小字体、显示省略号和文本缩进。用户可以通过交互按钮切换不同的显示模式,体验各种显示效果。
实现思路
初始化工作簿并设置测试数据,包括日期、数字和长文本
设置较窄的列宽(35 像素),使内容无法完全显示
为「掩码」和「溢出」按钮绑定事件,切换 numbersFitMode 模式
为「自动缩小」、「显示省略号」和「缩进」按钮绑定事件,设置单元格样式属性
每次点击按钮时,获取当前活动单元格并应用相应的样式
代码解析
设置数字自适应模式
这段代码通过设置 spread.options.numbersFitMode 属性来切换数字和日期的显示模式。numbersFitMode 为 0 时使用掩码模式,为 1 时使用溢出模式。
设置自动缩小字体
这段代码获取当前活动单元格,并通过 shrinkToFit() 方法切换自动缩小字体的状态。当设置为 true 时,单元格文本会自动缩小以适应列宽。
设置显示省略号
这段代码通过 showEllipsis() 方法控制是否在文本超出单元格边界时显示省略号。设置后会关闭自动缩小功能,避免样式冲突。
设置文本缩进
这段代码通过 textIndent() 方法增加文本缩进值,每个增量代表 8 像素的缩进距离。
运行效果
点击「掩码」按钮:D 列的日期和 F 列的数字会显示为 ###
点击「溢出」按钮:日期和数字会延伸到右侧相邻单元格显示完整内容
选中 J 列的长文本单元格,点击「自动缩小」按钮:文本会自动缩小字体以适应列宽
选中单元格后点击「显示省略号」按钮:超出部分会显示省略号(…)
点击「增加文本缩进」或「减少文本缩进」按钮:文本会向右或向左移动
API 参考
numbersFitMode
工作簿级别的选项,控制数字和日期的自适应显示模式。
值为 0:掩码模式,当列宽不足时显示 ###
值为 1:溢出模式,允许内容延伸到相邻单元格
shrinkToFit()
单元格方法,控制是否自动缩小字体以适应单元格大小。
参数:value?: boolean
返回值:any
showEllipsis()
单元格方法,控制文本超出边界时是否显示省略号。
参数:value?: boolean
返回值:any
注意:显示省略号的优先级高于溢出文本
textIndent()
单元格方法,获取或设置文本缩进。
参数:value?: number(每个增量代表 8 像素)
返回值:any
window.onload = function() {
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {
sheetCount: 1
});
var sheet = spread.getActiveSheet();
spread.suspendPaint();
initData();
spread.resumePaint();
document.getElementById("mask").addEventListener("click", function(){
spread.options.numbersFitMode = 0;
});
document.getElementById("overflow").addEventListener("click", function(){
spread.options.numbersFitMode = 1;
});
document.getElementById("shrink").addEventListener("click", function(){
var row = sheet.getActiveRowIndex();
var col = sheet.getActiveColumnIndex();
sheet.getCell(row, col, ).wordWrap(false);
if (!sheet.getActualStyle(row, col).shrinkToFit) {
sheet.getCell(row, col).shrinkToFit(true);
} else {
sheet.getCell(row, col).shrinkToFit(false);
}
});
document.getElementById("showEllipsis").addEventListener("click", function(){
var row = sheet.getActiveRowIndex();
var col = sheet.getActiveColumnIndex();
sheet.getCell(row, col, ).wordWrap(false);
sheet.getCell(row, col).shrinkToFit(false);
if (!sheet.getActualStyle(row, col).showEllipsis) {
sheet.getCell(row, col).showEllipsis(true);
} else {
sheet.getCell(row, col).showEllipsis(false);
}
});
document.getElementById("indentIncrease").addEventListener("click", function(){
var row = sheet.getActiveRowIndex();
var col = sheet.getActiveColumnIndex();
sheet.getCell(row, col).textIndent((sheet.getCell(row, col).textIndent() || 0) + 1);
});
document.getElementById("indentDecrease").addEventListener("click", function(){
var row = sheet.getActiveRowIndex();
var col = sheet.getActiveColumnIndex();
sheet.getCell(row, col).textIndent((sheet.getCell(row, col).textIndent() || 0) - 1);
});
function initData() {
var align = ["Left","Middle","Right","General"];
sheet.getRange(5, 5, 4, 1).formatter("mm-dd-yyyy");
for(var i=0; i<4; i++)
{
sheet.setValue(i+1, 1, align[i]);
sheet.setValue(i+1, 3, new Date(2011, 10, 11));
sheet.setValue((i+1), 5, 123456.789654);
sheet.setValue(i+1, 9, "This is a very very long text.");
sheet.getRange(i+1, 1, 1, 9).hAlign(i);
}
sheet.setColumnWidth(3, 35, 3);
sheet.setColumnWidth(5, 35, 3);
}
};
<!doctype html>
<html style="height:100%;font-size:14px;">
<head>
<meta charset="utf-8" />
<meta name="spreadjs culture" content="zh-cn" />
<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$/spread/source/js/license.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="app.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="sample-tutorial">
<div class="sample-container">
<div id="ss" class="sample-spreadsheets"></div>
</div>
<div class="options-container">
<label><b>更改数字和日期单元格的显示方式(D列和G列)</b></label>
<hr />
<div class="options-row">
<input id="mask" type="button" value="掩码" />
</div>
<label>掩码模式会在列宽无法显示完整值时将值显示为掩码 (#)</label>
<div class="options-row">
<input id="overflow" type="button" value="溢出" />
</div>
<label>溢出模式会允许值溢出到相邻单元格以显示完整值</label>
<br />
<label><b>选择一个单元格文本(B列和J列),点击以下按钮查看显示效果的变化</b></label>
<hr />
<div class="options-row">
<input id="shrink" type="button" value="自动缩小" />
</div>
<div class="options-row">
<input id="showEllipsis" type="button" value="显示省略号" />
</div>
<div class="options-row">
<input id="indentIncrease" type="button" value="增加文本缩进" />
</div>
<div class="options-row">
<input id="indentDecrease" type="button" value="减少文本缩进" />
</div>
</div>
</div>
</body>
</html>
* {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.sample-options {
float: right;
height: 100%;
}
.options-toggle {
display: none;
}
@media only screen and (max-width: 768px) {
.options-toggle {
display: block !important;
top: 20px;
left: -30px;
width: 30px;
height: 30px;
position: absolute;
background-color: #86bd00;
line-height: 30px;
text-align: center;
padding: 4px;
box-sizing: border-box;
color: #fff;
}
.options-container {
width: 280px !important;
overflow: auto;
height: 100%;
padding: 22px;
box-sizing: border-box;
}
.sample-container {
width: 100% !important;
height: 100%;
overflow: hidden;
float: left;
}
.sample-options {
right: 0;
padding: 0 !important;
overflow: visible !important;
position: absolute;
box-shadow: 0 0 3px 0 rgba(0, 0, 0, .25);
transition: right .25s ease-in-out;
z-index: 1000;
}
.sample-options.hidden {
right: -280px;
}
#statusBar {
bottom: 0;
height: 25px;
width: 100%;
position: relative;
float: left;
}
}
.sample-tutorial {
position: relative;
height: 100%;
overflow: hidden;
}
.sample-container {
width: calc(100% - 280px);
height: 100%;
float: left;
}
.sample-spreadsheets {
width: 100%;
height: calc(100% - 25px);
overflow: hidden;
}
#statusBar {
bottom: 0;
height: 25px;
width: 100%;
position: relative;
}
.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;
}
label {
display: block;
margin-bottom: 6px;
}
input {
padding: 4px 6px;
box-sizing: border-box;
width: 100%;
}
input[type=button] {
margin-top: 6px;
display: block;
}
.summary {
background-color: #e6e6fa;
padding: 3px;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}