- 前端
- UI组件
【免费下载链接】ce
Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.
本指南围绕 Jspreadsheet(及其前身 Jexcel)在数据表格单元格中嵌入图片这一主题展开,覆盖三种典型方案:通过updateTable回调渲染远程 URL 图片、使用image列类型内嵌 base64 图片数据,以及结合编辑器实现本地上传。读完本文,你将能掌握图片列的声明方式、底层渲染原理与编辑器交互机制,并直接复用文中完整示例代码。
示例概览:在单元格中渲染图片
在 Jspreadsheet 的表格体系中,单元格默认以纯文本方式展示数据,但图片资源(远程 URL、base64 数据或本地上传文件)都可以通过两种途径进入单元格:一是借助updateTable回调在每次表格刷新时自定义单元格 HTML,二是直接为列声明type: 'image',让框架内置的渲染与编辑逻辑接管。前者灵活、可控,适用于任意列;后者简洁、与编辑器深度集成,适合封面图、头像、商品图等固定业务场景。
方案一:用 updateTable 回调渲染远程图片(v2 经典写法)
Jspreadsheet v2(即 Jexcel 2.1.0)官方示例 images.md 给出了一段可直接运行的完整页面:先以二维数组作为数据源,再通过updateSettings的table回调重写指定列的单元格内容。
<html> <script src="https://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/js/jquery.jexcel.js"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/css/jquery.jexcel.min.css" type="text/css" /> <div id="my"></div> <script> var data = [ ['https://marketplace.canva.com/MACcZp2p4po/2/0/thumbnail_large/canva-black-white-acoustic-album-cover-MACcZp2p4po.jpg', 'Paul Parker'], ['https://marketplace.canva.com/MACcY55adP4/1/0/thumbnail_large/canva-black-and-white-masculine-acoustic-modern-album-cover-MACcY55adP4.jpg','Mark Ellen'] ] $('#my').jexcel({ data:data, colWidths: [300, 200], }); $('#my').jexcel('updateSettings', { table: function (instance, cell, col, row, val, id) { if (col == 0) { $(cell).html('<input type="hidden" value="'+ val +'"><img src="' + val + '" style="width:100px;height:100px">'); } } }); </script> </html>这段示例有两个值得注意的细节:
- 数据仍以纯文本 URL 存放在单元格中,渲染层通过
table回调把 URL 包装成<img>标签,因此导出、公式引用等数据操作仍基于原始字符串,图片只是展示形态; - 回调中同时写入了一个
<input type="hidden">保存原值val,确保在图片模式下单元格底层数据不丢失、可被读取。
参数含义
updateSettings中table回调的签名依次为:
| 参数 | 说明 |
|---|---|
instance | 当前表格实例 |
cell | 目标单元格的 DOM 元素 |
col | 列索引(从 0 开始) |
row | 行索引(从 0 开始) |
val | 单元格的原始数据值 |
id | 单元格内部记录 ID |
源码佐证:updateTable 与表格刷新链路
在 Jspreadsheet 的现代实现中,table回调对应的机制是 updateTable 及其兄弟函数 updateTableReferences。从源码调用关系看,updateTable会在排序(orderBy.js)、复制粘贴(copyPaste.js)、选区变更(selection.js)、数据更新(data.js)等大量操作后被触发,保证任意数据变动后自定义渲染逻辑都会重新执行——这正是“回调式图片渲染”始终与数据保持同步的底层保障。
方案二:image 列类型与 base64 内嵌图片(v3 官方示例)
Jspreadsheet v3 官方示例 image-upload.md 展示了更进阶的用法:声明type: 'image'列,并把 base64 编码的图片数据直接作为单元格值,框架自动完成图片渲染。
从本地图片生成 base64 并加载到表格
<html> <script src="https://bossanova.uk/jspreadsheet/v3/jexcel.js"></script> <script src="https://jsuites.net/v3/jsuites.js"></script> <link rel="stylesheet" href="https://bossanova.uk/jspreadsheet/v3/jexcel.css" type="text/css" /> <link rel="stylesheet" href="https://jsuites.net/v3/jsuites.css" type="text/css" /> <div id="spreadsheet1"></div> <script> let data = [ ['Purple', 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEA...'], ]; jexcel(document.getElementById('spreadsheet1'), { data:data, minDimensions: [2,4], columns: [ { type:'text', width:300, title:'Title' }, { type:'image', width:120, title:'Cover' }, ] }); </script> </html>要点拆解:
- 列配置中
type: 'image'声明图片列,width控制列宽,title显示表头; - 单元格值为以
data:image/jpeg;base64,...开头的完整 Data URI,图片数据随表格数据一同存储,无外部网络依赖,适合离线场景与数据持久化; - 从当前仓库源码看,
image列的核心渲染逻辑位于 internal.js:当值以data:image前缀开头时,框架创建<img>元素并设置其src,再追加进单元格;对不以该前缀开头的值则不做特殊渲染。这正是 base64 图片得以自动展示的判断依据。
自动渲染远程图片:用 updateTable 处理 URL 列
对于存有远程 URL 的普通文本列,v3 示例同样给出了自动渲染写法——通过updateTable回调在列 0 生成<img>:
<html> <script src="https://bossanova.uk/jspreadsheet/v3/jexcel.js"></script> <script src="https://jsuites.net/v3/jsuites.js"></script> <link rel="stylesheet" href="https://bossanova.uk/jspreadsheet/v3/jexcel.css" type="text/css" /> <link rel="stylesheet" href="https://jsuites.net/v3/jsuites.css" type="text/css" /> <div id="spreadsheet2"></div> <script> jexcel(document.getElementById('spreadsheet2'), { data: [ ['https://marketplace.canva.com/MACcZp2p4po/2/0/thumbnail_large/canva-black-white-acoustic-album-cover-MACcZp2p4po.jpg', 'Paul Parker'], ['https://marketplace.canva.com/MACcY55adP4/1/0/thumbnail_large/canva-black-and-white-masculine-acoustic-modern-album-cover-MACcY55adP4.jpg', 'Mark Ellen'] ], columns: [ { type:'text', width:300, title:'Cover' }, { type:'text', width:300, title:'Title' }, ], updateTable: function (instance, cell, col, row, val, id) { if (col == 0) { cell.innerHTML = '<img src="' + val + '" style="width:100px;height:100px">'; } } }); </script> </html>updateTable与 v2 中的table回调参数一致,区别仅在于触发时机与命名:它会在表格每次重绘单元格时被调用,适合按列索引(如col == 0)决定是否把文本值替换为图片标签。该回调在当代实现中同样对应 updateTable 这条内部刷新链路。
方案三:image 列类型的编辑与上传交互
type: 'image'的真正优势在于它不只负责渲染,还深度接入了编辑流程。双击图片单元格时,框架会调用 jSuites 的jSuites.image组件打开图片编辑器(实现见 editor.js),允许用户选择本地文件替换图片;编辑器关闭后,框架从编辑器中提取<img>的src回写到单元格数据(editor.js),从而把上传的本地图片以 data URL 形式持久化到表格数据中。
配套的 CSS 规则位于 jspreadsheet.css:单元格内的<img>被限制为max-width: 100px并以内联块展示,保证图片在紧凑的表格布局中不会撑破行列。示例中编辑器区域同样有jupload img相关样式(jspreadsheet.css),用于规整上传预览。
三种方案选型建议
| 需求场景 | 推荐方案 | 理由 |
|---|---|---|
| 已有远程图片 URL,希望快速展示 | updateTable/table回调 | 改动最小,数据保持原始 URL 字符串 |
| 图片需随表格数据离线保存或持久化 | type: 'image'+ base64 | 渲染自动完成,数据自包含 |
| 需要用户上传本地图片替换 | type: 'image' | 内置 jSuites.image 编辑器,交互完整 |
无论选择哪种方案,均可参照 v2 示例 images.md 与 v3 示例 image-upload.md 中的完整 HTML 片段直接改造复用;更深入的渲染细节可继续阅读 src/utils/internal.js 与 src/utils/editor.js 的相关实现。
- 前端
- UI组件
【免费下载链接】ce
Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.
相关推荐
docx.js图片处理全攻略:内嵌图片、Base64和缓冲区图像处理
docx.js图片处理全攻略:内嵌图片、Base64和缓冲区图像处理 还在为在Word文档中动态插入图片而烦恼吗?docx.js提供了强大而灵活的图片处理能力,
文档html-to-image 中的图片嵌入技术:base64 与 dataURL 应用
html to image 中的图片嵌入技术:base64 与 dataURL 应用 引言:前端图片嵌入的痛点与解决方案 你是否曾遇到过这些问题:生成的网页截图
前端图像处理Ant Design Menu 内联模式(inline)完全指南:垂直菜单与内嵌子菜单的实战解析
Ant Design Menu 内联模式(inline)完全指南:垂直菜单与内嵌子菜单的实战解析 导读 在 Ant Design 的 Menu 组件中, mod
前端UI组件设计系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考