JavaScript实现Excel文件在Web页面的渲染与交互
作者:青柠时间:2026-11-01 04:01:34浏览:124
本文详解如何在Web页面中通过JavaScript渲染Excel文件。针对后端返回的文档流和文件地址两种场景,分别提供了基于Blob和XMLHttpRequest的处理方案。此外,还介绍了利用原生JS实现Excel表格的放大缩小与拖拽交互功能,帮助开发者在前端完整展示和处理Excel数据。
后端文档流与URL地址的Excel渲染方案
首先考虑从后端接口直接获取Excel文档流的情况。此时需要处理异步请求,确保获取到正确的二进制数据以便后续解析。
// 从后端接口获取 Excel 文档流
async function fetchExcelFromBackend() {
try {
// 假设后端接口 URL
const backendApiUrl = `http://local.hct10039.com:18080/recognition/downloadExcel?orderSn=${orderSn}`;
const response = await fetch(backendApiUrl);
if (!response.ok) {
throw new Error('Failed to fetch Excel from backend: ' + response.status);
}
const blob = await response.blob();
const file = new File([blob], 'filename.xlsx', { type: blob.type });
loadExcelAndRender(file);
} catch (error) {
alert('出错了:' + error.message);
}
}
// 加载并渲染 Excel
async function loadExcelAndRender(file) {
try {
const reader = new FileReader();
reader.onload = function (e) {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array' });
const firstSheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[firstSheetName];
const html = XLSX.utils.sheet_to_html(worksheet, { id: firstSheetName });
document.getElementById('excelDom').innerHTML = html;
};
reader.readAsArrayBuffer(file);
} catch (error) {
alert('出错了:' + error.message);
}
}
// 调用函数从后端接口获取并渲染 Excel
fetchExcelFromBackend();其次,若后端返回的是文件的访问地址,则需要通过URL获取文件对象。这通常涉及发起HTTP请求并将响应类型设置为Blob,从而构建出可用于前端解析的File对象。
function getFileObjectFromUrl(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob'; // 重要:设置响应类型为blob
xhr.onload = function() {
if (this.status === 200) {
// 请求成功,this.response包含Blob对象
var blob = this.response;
// 创建File对象
var file = new File([blob], 'filename.xlsx', {type: blob.type});
// 调用回调函数,传入File对象
callback(file);
} else {
console.error('Failed to download file:', this.status);
}
};
xhr.onerror = function() {
console.error('Request error');
};
xhr.send();
}
async function loadExcelAndRender(file) {
try {
const reader = new FileReader();
reader.onload = function (e) {
const data = new Uint8Array(e.target.result);
const workbook = XLSX.read(data, { type: 'array' });
const firstSheetName = workbook.SheetNames[0]; // 获取第一个sheet的名称
const worksheet = workbook.Sheets[firstSheetName];
const html = XLSX.utils.sheet_to_html(worksheet, {id: firstSheetName}); // 只渲染第一个sheet
document.getElementById('excelDom').innerHTML = html; // 将HTML渲染到指定的div中
};
reader.readAsArrayBuffer(file);
} catch (error) {
console.error('Error loading or rendering Excel:', error);
}
}以下是上述两种方法在实际应用中的展示效果,直观呈现Excel内容在网页中的渲染结果。

除了基础的渲染,有时还需要对Excel内容进行额外的功能扩展,以优化用户体验。
Excel页面的放大缩小与拖拽交互实现
为了实现更好的浏览体验,可以为渲染后的Excel容器添加放大、缩小以及拖拽平移的功能。这通常通过监听鼠标事件并动态调整容器的变换属性来实现。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>滚动拖拽示例</title>
</head>
<body>
<div class="excelContent borderLineBlack" style="width: 100%;height: 100%;" style="overflow: auto;">
<div id="excelDom" style="width: 30%;height: 30vh;background-color: aquamarine;">子盒子</div>
</div>
<!-- 引入JavaScript脚本 -->
<script >
// 获取父元素excelContent
const excelContent = document.querySelector('.excelContent.borderLineBlack');
// 监听父元素的wheel事件,防止滚动父盒子
excelContent.addEventListener('wheel', function(event) {
// 判断事件的目标元素是否为excelDom或其子元素
if (!excelDom.contains(event.target)) {
// 如果不是,则阻止默认的滚动行为
event.preventDefault();
}
});
let scale = 1; // 设置初始缩放比例
var excelDom = document.getElementById("excelDom");
let isDragging = false;
let offsetX = 0, offsetY = 0; // 用于记录拖动时的偏移量
// 监听鼠标滚轮事件
excelDom.addEventListener('wheel', function(event) {
if (event.ctrlKey) {
event.preventDefault();
if (event.deltaY < 0) {
scale += 0.1;
} else {
scale -= 0.1;
}
scale = Math.max(0.1, scale);
// 更新变换,应用缩放和平移
excelDom.style.transform = `scale(${scale}) translate(${offsetX}px, ${offsetY}px)`;
}
});
// 监听鼠标按下事件
excelDom.addEventListener('mousedown', function(event) {
isDragging = true;
let startX = event.clientX;
let startY = event.clientY;
// 监听鼠标移动事件,只在拖动时添加
const mouseMoveHandler = function(event) {
const dx = event.clientX - startX;
const dy = event.clientY - startY;
offsetX += dx;
offsetY += dy;
// 更新变换,应用平移
excelDom.style.transform = `scale(${scale}) translate(${offsetX}px, ${offsetY}px)`;
// 重置起始坐标
startX = event.clientX;
startY = event.clientY;
};
// 添加鼠标移动事件监听器
document.addEventListener('mousemove', mouseMoveHandler);
// 监听鼠标释放事件,只在拖动时添加
const mouseUpHandler = function() {
isDragging = false;
excelDom.style.cursor = 'auto';
// 移除鼠标移动和释放事件监听器
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
};
// 添加鼠标释放事件监听器
document.addEventListener('mouseup', mouseUpHandler);
event.preventDefault();
});
</script>
</body>
</html>至此,关于如何在JavaScript中实现Excel文件在页面上的渲染及相关交互功能已介绍完毕。如需了解更多相关技术细节,可参考本站其他文章或继续浏览后续内容。
作者最新文章
ES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
