表格里调好格式的单元格,往往要直接搬到别处复用:单价列已经配好金额格式、浅蓝底纹与细边框,同一行的金额列却仍是默认样式。复制单元格格式,就是把源格已经定下来的那套外观交给目标格——数字格式、字体、填充、边框、对齐方式一次到位,目标格原有的数据保持不变。Spire.XLS for JavaScript 基于 WebAssembly 在浏览器端直接完成上述操作,通过虚拟文件系统(VFS)管理输入与输出文件,无需后端服务支持。
本文介绍两个核心功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.XLS for JavaScript。以下示例默认已安装 Spire.XLS 并完成 WebAssembly 模块初始化。
复制整个单元格的格式
单元格的每一处外观都收在它自己的样式对象里,把源格的样式对象整个交给目标格,数字格式、字体、填充、边框与对齐方式便一并跟过去,而目标格里的数据留在原处不动。示例工作簿的单价列已经配好金额格式与浅蓝底纹,金额列还是默认样式,把前者逐行套到后者即可看出差别。
把源格的 Style 整个赋给目标格的 Style,即可完成整格复制:
| 写法 | 得到的结果 |
|---|---|
sheet.Range.get('C2').Style |
取出源格(单价列)的整份样式对象 |
sheet.Range.get('E2').Style = sheet.Range.get('C2').Style |
把整份样式赋给目标格(金额列),数字格式、字体、填充、边框与对齐一并跟过去 |
sheet.Range.get({ row, column: 5 }).Text |
目标格原有的数值仍留在原处,不受样式赋值影响 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,用workbook.LoadFromFile载入输入文件,再用workbook.Worksheets.get(0)取得第一张工作表。 - 用
sheet.Range.get逐行取源列的单元格与目标列的单元格。 - 把源格的
Style赋给目标格的Style,整格样式随之复制过去,目标格原有的数值不受影响。 - 用
workbook.SaveToFile保存工作簿,再用workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 React 中复制整个单元格的格式:
function App() {
const copyCellStyle = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'CopyCellStyle.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿,取第一张工作表
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
const sheet = workbook.Worksheets.get(0);
// 逐行把单价列的格式套到金额列,金额列原有的数值保持不变
for (let row = 2; row <= 7; row++) {
sheet.Range.get(`E${row}`).Style = sheet.Range.get(`C${row}`).Style;
}
// 保存工作簿
const outputFileName = 'CopyCellStyle-output.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2016 });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>复制单元格格式</h1>
<button id="copy-cell-style" onClick={copyCellStyle}>复制整个单元格的格式</button>
</div>
);
}
export default App;
复制整个单元格的格式后的工作表:

克隆命名样式并复用
同一套格式要用在好几处时,把它登记成命名样式,之后按名字套到任意区域,配色要改也只需改一处。命名样式存在工作簿上,用 workbook.Styles.Add 新建,设好各项格式后,用 Range.CellStyleName 按名字套用。示例先给表头建一套白字钢青底的样式,再克隆一份改掉配色,供合计行使用——改动只落在克隆体上,原样式不受影响。
命名样式在工作簿上登记,按名字套用到区域:
| 写法 | 得到的结果 |
|---|---|
workbook.Styles.Add('OrderHeader') |
在工作簿上新建一套名为 OrderHeader 的命名样式 |
headerStyle.Font.Color、headerStyle.Color、headerStyle.FillPattern |
逐项设置字色、底色与填充方式 |
headerStyle.clone() |
复制出一份独立的样式副本,名字自动加序号 |
sheet.Range.get('A1:E1').CellStyleName = headerStyle.Name |
把命名样式按名字套到指定区域 |
具体操作步骤如下:
- 用
window.spire.FetchFileToVFS把字体文件与测试数据文件载入 VFS。 - 用
new Workbook()新建工作簿,用workbook.LoadFromFile载入输入文件,再用workbook.Worksheets.get(0)取得第一张工作表。 - 用
workbook.Styles.Add新建命名样式,设置字体名称、字号、加粗、字色、底色、填充方式与水平对齐方式。 - 用
sheet.Range.get('A1:E1').CellStyleName把该样式按名字套到表头区域。 - 用样式的
clone()复制一份,只改字色与底色,得到合计行要用的变体。 - 用
sheet.Range.get('A8:E8').CellStyleName把变体套到合计行。 - 用
workbook.SaveToFile保存工作簿,再用workbook.Dispose释放 workbook 对象以释放资源。
以下为完整的代码示例,演示如何在 React 中克隆命名样式并复用到不同区域:
function App() {
const cloneNamedStyle = async () => {
// 获取 Spire.XLS WASM 模块
const xlsModule = window.wasmModule?.spirexls;
// 检查模块是否就绪
if (!xlsModule) {
alert('Spire.Xls is not ready yet');
return;
}
// 将字体与测试数据文件载入 VFS
await window.spire.FetchFileToVFS('simsun.ttc', '/Library/Fonts/', `${process.env.PUBLIC_URL}/font/`);
const inputFileName = 'CopyCellStyle.xlsx';
await window.spire.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}data/`);
// 加载工作簿,取第一张工作表
const workbook = new xlsModule.Workbook();
workbook.LoadFromFile({ fileName: inputFileName });
const sheet = workbook.Worksheets.get(0);
// 新建一套命名样式:白字、钢青色底纹、居中
const headerStyle = workbook.Styles.Add('OrderHeader');
headerStyle.Font.FontName = '宋体';
headerStyle.Font.Size = 11;
headerStyle.Font.IsBold = true;
headerStyle.Font.Color = xlsModule.Color.get_White();
headerStyle.Color = xlsModule.Color.get_SteelBlue();
headerStyle.FillPattern = xlsModule.ExcelPatternType.Solid;
headerStyle.HorizontalAlignment = xlsModule.HorizontalAlignType.Center;
// 把命名样式套到表头
sheet.Range.get('A1:E1').CellStyleName = headerStyle.Name;
// 克隆一份,只改配色,得到合计行要用的变体
const totalStyle = headerStyle.clone();
totalStyle.Font.Color = xlsModule.Color.get_DarkBlue();
totalStyle.Color = xlsModule.Color.get_LightYellow();
// 把克隆出的样式套到合计行
sheet.Range.get('A8:E8').CellStyleName = totalStyle.Name;
// 保存工作簿
const outputFileName = 'CloneNamedStyle.xlsx';
workbook.SaveToFile({ fileName: outputFileName, version: xlsModule.ExcelVersion.Version2016 });
// 释放 workbook 对象以释放资源
workbook.Dispose();
// 从 VFS 读取结果文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>克隆命名样式并复用</h1>
<button id="clone-named-style" onClick={cloneNamedStyle}>克隆命名样式并复用</button>
</div>
);
}
export default App;
克隆命名样式并复用后的工作表:

常见问题
只复制数字格式,不搬底色与边框
原因:整格复制会把数字格式连同填充、字体、边框一起带过去,只想换一种显示方式时并不合适。
解决:从源格样式取出 NumberFormat 单项,赋给目标格样式的同名属性,其余属性保持不变:
// 取合计行数量格的数字格式,作为要套用的格式
const sourceStyle = sheet.Range.get('D8').Style;
// 只把数字格式一项套到数量列,加粗与上边框一概不动
for (let row = 2; row <= 7; row++) {
sheet.Range.get(`D${row}`).Style.NumberFormat = sourceStyle.NumberFormat;
}
为什么不能把整个字体对象直接赋给目标格
原因:Style.Font 是只读属性,返回的是该格当前字体对象,不能整体替换,只能改它挂着的成员。
解决:逐项设置 FontName、Size、Color、IsBold 等成员。若要连同填充与边框一起搬,用整格 Style 赋值;若要成组复用,把整套格式登记成命名样式后按名字套用。
克隆出来的样式改配色后,原样式会跟着变吗
原因:clone() 生成的是与原样式彼此独立的副本,落盘后在工作簿的命名样式里各自占一条,名字会自动加上序号区分,例如 OrderHeader 克隆出来的是 OrderHeader1。改副本的字色与底色不会带动原样式,原样式仍是克隆前的配色。
解决:需要多个配色变体时,都从同一套基础样式克隆,再各自调整配色,基础样式的定义始终保持不变。
命名样式和直接给 Style 赋值,该用哪一个
原因:给 Style 赋值是把源格当前的外观一次性复制给目标格,适合只搬一次的场景;Range.CellStyleName 套用的是工作簿上登记的命名样式,同一套格式反复用在不同区域时,代码里只需写一个名字。
解决:只需搬一次外观,用整格 Style 赋值;同一套格式要在多处复用,用 workbook.Styles.Add 建成命名样式,再按名字套用。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。









