在数据可视化应用中,将 Excel 工作簿中的图表和形状导出为独立图像是提升跨平台兼容性的关键。通过将动态生成的图表、形状转换为 PNG/JPG 等通用图像格式,开发者可确保数据可视化内容在网页、移动端等非 Office 环境中正确展示,同时简化报告生成和演示文稿更新的工作流程。借助 Spire.XLS for JavaScript 库,开发人员能够在 React 程序中轻松实现 Excel 图表和形状的导出功能。
本文将介绍如何使用 Spire.XLS for JavaScript 在 React 中通过 JavaScript 代码将 Excel 工作簿中的图表和形状保存为图像,提供详细的步骤介绍和代码示例。
安装 Spire.XLS for JavaScript
要在 React 应用中实现 Excel 图表和形状的导出,首先需要下载 Spire.XLS for JavaScript,或者通过 npm 进行安装:
npm i spire.xls
安装完成后,将 Spire.Xls.Base.js 和 Spire.Xls.Base.wasm 文件复制到项目的 public 文件夹中。
详细的安装和配置步骤,请参考此教程:如何在 React 项目中集成 Spire.XLS for JavaScript
使用 JavaScript 将 Excel 图表保存为图像
借助 Spire.XLS for JavaScript 的 WebAssembly 模块,开发人员可以使用 Workbook.SaveChartAsImage() 方法将 Excel 工作表中的特定图表保存为图像,并存储到虚拟文件系统(VFS)中。保存的图像可以下载或用于进一步处理。
具体步骤如下:
- 加载 Spire.Xls.Base.js 文件以初始化 WebAssembly 模块。
- 使用 wasmModule.FetchFileToVFS() 方法将 Excel 文件和字体文件加载到 VFS。
- 使用 wasmModule.Workbook.Create() 方法创建 Workbook 实例。
- 使用 Workbook.LoadFromFile() 方法将 Excel 文件加载到 Workbook 实例中。
- 使用 Workbook.Worksheets.get() 方法获取特定工作表或遍历所有工作表。
- 遍历图表并使用 Workbook.SaveChartAsImage() 方法将其保存为图像,参数包括工作表和图表索引。
- 使用 image.Save() 方法将图像保存到 VFS。
- 下载图像或按需使用。
- JavaScript
import React, { useState, useEffect } from 'react';
import JSZip from 'jszip';
function App() {
// 用于存储加载的WASM模块的状态
const [wasmModule, setWasmModule] = useState(null);
// 组件挂载时使用useEffect钩子加载WASM模块
useEffect(() => {
const loadWasm = async () => {
try {
// 从全局window对象访问Module和spirexls
const { Module, spirexls } = window;
// 当运行时初始化时设置wasmModule状态
Module.onRuntimeInitialized = () => {
setWasmModule(spirexls);
};
} catch (err) {
// 记录模块加载期间发生的任何错误
console.error('加载WASM模块失败:', err);
}
};
// 创建一个脚本元素来加载WASM JavaScript文件
const script = document.createElement('script');
script.src = `${process.env.PUBLIC_URL}/Spire.Xls.Base.js`;
script.onload = loadWasm;
// 将脚本添加到文档主体
document.body.appendChild(script);
// 清理函数,当组件卸载时移除脚本
return () => {
document.body.removeChild(script);
};
}, []);
// 将图表转换为图片的函数
const SaveExcelChartAsImage = async () => {
if (wasmModule) {
// 指定输入文件名
const inputFileName = 'Sample.xlsx';
// 获取输入文件并将其添加到VFS(虚拟文件系统)
await wasmModule.FetchFileToVFS(inputFileName, '', `${process.env.PUBLIC_URL}/`);
// 获取字体文件并将其添加到VFS
await wasmModule.FetchFileToVFS('HarmonyOS_Sans.ttf', '/Library/Fonts/',`${process.env.PUBLIC_URL}/`);await wasmModule.FetchFileToVFS('Arial.ttf','/Library/Fonts/',`${process.env.PUBLIC_URL}/`);// 在VFS中创建图像文件夹 const imageFolderName = `Images`;wasmModule.FS.mkdir(imageFolderName,0x1FF);// 创建Workbook类的实例 const workbook = wasmModule.Workbook.Create();// 从输入文件加载Excel工作簿 workbook.LoadFromFile({fileName:inputFileName});// 遍历工作簿中的每个工作表 for (let i = 0;i <workbook.Worksheets.Count;i++){// 获取当前工作表 const sheet = workbook.Worksheets.get(i);// 遍历工作表中的每个图表 for (let j = 0;j <sheet.Charts.Count;j++){// 将当前图表保存为图像 let image = workbook.SaveChartAsImage({worksheet:sheet,chartIndex:j}) // 将图像保存到VFS image.Save(`${imageFolderName}/${sheet.Name}_Chart-${j}.png`,0x1FF)}}// 递归函数,将目录及其内容添加到ZIP中 const addFilesToZip = (folderPath,zipFolder) =>{const items = wasmModule.FS.readdir(folderPath);items.filter(item =>item !== "." && item !== "..").forEach((item) =>{const itemPath = `${folderPath}/${item}`;try{// 尝试读取文件数据 const fileData = wasmModule.FS.readFile(itemPath);zipFolder.file(item,fileData);}catch (error){if (error.code === 'EISDIR'){// 如果是目录,则在ZIP中创建新文件夹,并递归进入它 const zipSubFolder = zipFolder.folder(item);addFilesToZip(itemPath,zipSubFolder);}else{// 处理其他错误 console.error(`处理${itemPath}时出错:`,error);}}});};// 将图像文件夹打包成ZIP文件 const zip = new JSZip();addFilesToZip(imageFolderName,zip);// 从结果ZIP文件生成Blob并触发下载 zip.generateAsync({type:"blob"}) .then(function(content){const link = document.createElement('a');link.href = URL.createObjectURL(content);link.download = 'Charts.zip';document.body.appendChild(link);link.click();document.body.removeChild(link);URL.revokeObjectURL(link.href);}).catch(function(err){console.error("生成ZIP文件时出错:",err);});}};return ( <div style={{textAlign:'center',height:'300px'}}><h1>React中使用JavaScript将Excel图表保存为图像</h1><button onClick={SaveExcelChartAsImage}disabled={!wasmModule}>导出图表 </button></div>);}export default App;
使用 JavaScript 将 Excel 形状保存为图像
开发者可以使用 Worksheet.PrstGeomShapes.get()方法从 Excel 工作表中获取形状,并使用 shape.SaveToImage()方法将其保存为图像。保存的图像可存储在虚拟文件系统(VFS)中,并可下载或用于进一步处理。
具体步骤如下:
- 加载 Spire.Xls.Base.js 文件以初始化 WebAssembly 模块。
- 使用 wasmModule.FetchFileToVFS()方法将 Excel 文件和字体文件加载到 VFS。
- 使用 wasmModule.Workbook.Create()方法创建 Workbook实例。
- 使用 Workbook.LoadFromFile()方法将 Excel 文件加载到 Workbook实例中。
- 使用 Workbook.Worksheets.get()方法获取特定工作表或遍历所有工作表。
- 使用 Worksheet.PrstGeomShapes.get()方法获取单个形状或遍历所有形状。
- 使用 shape.SaveToImage()方法将形状保存为图像。
- 使用 image.Save()方法将图像保存到 VFS。
- 下载图像或按需使用。
- JavaScript
import React,{useState,useEffect}from 'react';import JSZip from 'jszip';function App(){// 用于存储加载的WASM模块的状态 const [wasmModule,setWasmModule] = useState(null);// 组件挂载时使用useEffect钩子加载WASM模块 useEffect(() =>{const loadWasm = async () =>{try{// 从全局window对象访问Module和spirexls const{Module,spirexls}= window;// 当运行时初始化时设置wasmModule状态 Module.onRuntimeInitialized = () =>{setWasmModule(spirexls);};}catch (err){// 记录模块加载期间发生的任何错误 console.error('加载WASM模块失败:',err);}};// 创建一个脚本元素来加载WASM JavaScript文件 const script = document.createElement('script');script.src = `${process.env.PUBLIC_URL}/Spire.Xls.Base.js`;script.onload = loadWasm;// 将脚本添加到文档主体 document.body.appendChild(script);// 清理函数,当组件卸载时移除脚本 return () =>{document.body.removeChild(script);};},[]);// 将形状转换为图像的函数 const SaveExcelShapeAsImage = async () =>{if (wasmModule){// 指定输入文件名 const inputFileName = 'Sample65.xlsx';// 获取输入文件并添加到VFS(虚拟文件系统) await wasmModule.FetchFileToVFS(inputFileName,'',`${process.env.PUBLIC_URL}/`);// 获取字体文件并添加到VFS await wasmModule.FetchFileToVFS('HarmonyOS_Sans.ttf','/Library/Fonts/',`${process.env.PUBLIC_URL}/`);await wasmModule.FetchFileToVFS('Arial.ttf','/Library/Fonts/',`${process.env.PUBLIC_URL}/`);// 在VFS中创建图像文件夹 const imageFolderName = `Images`;wasmModule.FS.mkdir(imageFolderName,0x1FF);// 创建Workbook类的实例 const workbook = wasmModule.Workbook.Create();// 从输入文件加载Excel工作簿 workbook.LoadFromFile({fileName:inputFileName});// 遍历工作簿中的每个工作表 for (let i = 0;i <workbook.Worksheets.Count;i++){// 获取当前工作表 const sheet = workbook.Worksheets.get(i);// 遍历工作表中的每个形状 for (let j = 0;j <sheet.PrstGeomShapes.Count;j++){// 获取当前形状 const shape = sheet.PrstGeomShapes.get(j);// 将形状保存为图像 const image = shape.SaveToImage();// 将图像保存到VFS image.Save(`${imageFolderName}/${sheet.Name}_Shape-${j}.png`,0x1FF)}}// 递归函数,用于将目录及其内容添加到ZIP中 const addFilesToZip = (folderPath,zipFolder) =>{const items = wasmModule.FS.readdir(folderPath);items.filter(item =>item !== "." && item !== "..").forEach((item) =>{const itemPath = `${folderPath}/${item}`;try{// 尝试读取文件数据 const fileData = wasmModule.FS.readFile(itemPath);zipFolder.file(item,fileData);}catch (error){if (error.code === 'EISDIR'){// 如果是目录,则在ZIP中创建一个新文件夹,并递归进入它 const zipSubFolder = zipFolder.folder(item);addFilesToZip(itemPath,zipSubFolder);}else{// 处理其他错误 console.error(`Error processing ${itemPath}:`,error);}}});};// 将图像文件夹打包到ZIP文件中 const zip = new JSZip();addFilesToZip(imageFolderName,zip);// 从结果ZIP文件生成Blob并触发下载 zip.generateAsync({type:"blob"}) .then(function(content){const link = document.createElement('a');link.href = URL.createObjectURL(content);link.download = 'Shapes.zip';document.body.appendChild(link);link.click();document.body.removeChild(link);URL.revokeObjectURL(link.href);}).catch(function(err){console.error("生成zip文件出错:",err);});}};return ( <div style={{textAlign:'center',height:'300px'}}><h1>在React中用JavaScript将Excel形状保存为图像</h1><button onClick={SaveExcelShapeAsImage}disabled={!wasmModule}>导出形状 </button></div>);}export default App;
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。