96SEO 2026-08-03 14:29 1
在日常的公司级后台开发中,Excel 文件的在线处理是个绕不开的需求。除了常见的读取和报表导出,有时我们还需要在纯前端对已有 Excel 文件做结构调整。比如在同一工作簿内复制工作表、跨工作簿复制,或者只复制选定的单元格区域。
最近在项目中正好遇到了这个场景,我把实现过程整理了下来。这篇文章会从环境准备、主要原因、几种复制场景的实现还有实际遇到的问题这几个方面展开。

把文件传到后端让 Java 或 Python 处理是常规做法,但有些情况下前端直接处理也有它的好处:
因为 WebAssembly 的普及,一些原本只能在服务端跑的类库也能在浏览器里用了这让前端处理 Excel 内部结构变成了可能。
创建一个 React 项目,接下来将运行所需的 Wasm 文件、JS 资源还有字体文件放到 public 目录下。这类文件体积通常不小,不适合直接打进 bundle。放在静态资源目录或走 CDN 是更合理的做法。
Spire.XLS for JavaScript 的初始化需要先加载 WASM 模块,并将文件载入虚拟文件程序。下面是一个基础的初始化 Hook:
import { useEffect,useState } from "react";export function useXlsInit {
const = useState;不过,const = useState;const = useState;useEffect => {
const init = async => {
try {
// 等待 WASM 模块就绪
const module = window.wasmModule?.spirexls,if {
setError;return,}
setXlsModule;// 将字体文件载入 VFS
await window.spire.FetchFileToVFS(
'simsun.ttc'。'/Library/Fonts/',`${process.env.PUBLIC_URL}/font/`
);setIsReady,} catch {
setError;}
},init;},),return { xlsModule,isReady,error };按理说,}
使用者痛点:如果忘记加载中文字体。导出的 Excel 会出现乱码或排版错位;务必在初始化阶段确认字体已成功写入 VFS。
这是最常见的需求。其实,官方 API 提供了两种思路:一是通过 Add 新建空工作表再用 CopyFrom 复制内容。二是直接用 AddCopy 在复制的同时创建工作表。
以下示例采用 CopyFrom 的方式,将第一个工作表的内容复制到新工作表中:
const copySheetWithinWorkbook = async => {
if return;// 将 Excel 文件载入 VFS
await window.spire.FetchFileToVFS;// 加载工作簿
const workbook = new xlsModule.Workbook;workbook.LoadFromFile;// 获取第一个工作表
let sheet = workbook.Worksheets.get;// 添加新工作表,并将源表内容复制过来
let sheet1 = workbook.Worksheets.Add;sheet1.CopyFrom;不过,// 保存文件
const outputFileName = "CopySheetWithinWorkbook_output.xlsx";workbook.SaveToFile;// 释放资源
workbook.Dispose;话说回来,//触发下载
downloadFromVFS;},老实说,
使用者痛点:复制后发现样式不完整或公式失效?怎么说呢,请检查源工作表是否包含图表或宏。这类对象目前不被 CopyFrom 完全支持。
有时候源表在一个文件里目标表在另一个文件里需要把整个工作表从一个工作簿搬到另一个工作簿。这时可以用 AddCopy 方法,直接传入源工作表对象:
const copySheetAcrossWorkbooks = async => {
if return;const sourceFileName = "ReadImages.xlsx";const targetFileName = "Sample.xlsx";// 将两个文件都载入 VFS
await window.spire.FetchFileToVFS;await window.spire.FetchFileToVFS;// 加载源工作簿
const sourceWorkbook = new xlsModule.Workbook;sourceWorkbook.LoadFromFile;
const srcWorksheet = sourceWorkbook.Worksheets.get;// 加载目标工作簿
const targetWorkbook = new xlsModule.Workbook;targetWorkbook.LoadFromFile;// 在目标工作簿中添加新工作表,并从源工作表复制
targetWorkbook.Worksheets.AddCopy;// 保存目标工作簿
const outputFileName = "CopyAcrossWorkbooks_output.xlsx";targetWorkbook.SaveToFile;//释放资源
sourceWorkbook.Dispose;targetWorkbook.Dispose;//触发下载
downloadFromVFS;},
Pain Point:跨文件复制时经常会碰到“找不到源 Sheet”错误,这往往是因为源码文件未正确写入 VFS 或者加载顺序错误导致。
If you only need part of data rar than whole sheet。you can precisely control copy operation using Range toger with Copy method.
const copyRange = async => {
if return;const inputFileName = "Sample.xlsx";await window.spire.FetchFileToVFS;老实说,const workbook = new xlsModule.Workbook;workbook.LoadFromFile;const sheet = workbook.Worksheets.get;// 指定源区域,例如 A1:E1
const sourceRange = sheet.Range.get;// 新增目标工作表
let sheet1 = workbook.Worksheets.Add;// 将源区域复制到目标工作表的指定起始位置
sheet.Copy;其实,sheet1.AllocatedRange.AutoFitColumns;按理说,const outputFileName = "CopyRange_output.xlsx";workbook.SaveToFile;workbook.Dispose;downloadFromVFS;},
User Pain Point:The copied range may lose merged cells or conditional formatting;after copying you may need to manually re‑apply those rules.
.env` 配置公共 URL;确保服务器返回正确 `Access‑Control‑Allow‑Origin` 头部。
try {
await window.spire.FetchFileToVFS(
'simsun.ttc'。'/Library/Fonts/',`${process.env.PUBLIC_URL}/font/`
);其实,} catch {
console.error;}
const downloadFromVFS = => {
const fileArray = window.dotnetRuntime.Module.FS.readFile;const blob = new Blob(,{
从type来看。"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",});const url = URL.createObjectURL;const a = document.createElement;a.href = url;a.download = fileName;a.click,URL.revokeObjectURL;},怎么说呢,
const App: React.FC = => {
const { xlsModule。isReady,error } = useXlsInit;if
return
正在加载组件资源,请稍候...
if
return
加载失败的观点是。{error}
return (
Excel 工作表复制
请选择复制模式:
);},
`
。作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback