上一篇

在HTML中,通过JavaScript将数据转换为JSON或CSV等格式,利用Blob对象和URL.createObjectURL生成下载链接,实现数据导出。
HTML数据导出方法详解:实用指南与代码示例
在网页开发中,数据导出是常见需求,本文将深入探讨如何通过HTML结合JavaScript实现多种格式的数据导出功能。


<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">HTML数据导出完全指南</title>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
<script src="https://cdn.sheetjs.com/xlsx-0.19.3/package/dist/xlsx.full.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Noto Sans SC', sans-serif;
line-height: 1.6;
color: #333;
background: linear-gradient(135deg, #f5f7fa 0%, #e4edf5 100%);
padding: 20px;
max-width: 1200px;
margin: 0 auto;
}
header {
text-align: center;
padding: 40px 20px;
background: linear-gradient(120deg, #1e5799, #207cca);
color: white;
border-radius: 12px;
margin-bottom: 30px;
box-shadow: 0 10px 20px rgba(0,0,0,0.1);
}
h1 {
font-size: 2.8rem;
margin-bottom: 15px;
text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
}
.subtitle {
font-size: 1.2rem;
opacity: 0.9;
max-width: 800px;
margin: 0 auto;
}
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 25px;
margin-bottom: 40px;
}
.card {
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 16px rgba(0,0,0,0.08);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.card:hover {
transform: translateY(-10px);
box-shadow: 0 15px 30px rgba(0,0,0,0.15);
}
.card-header {
padding: 20px;
background: #2c3e50;
color: white;
font-size: 1.4rem;
font-weight: 500;
}
.card-body {
padding: 25px;
}
.card h3 {
color: #2980b9;
margin-bottom: 15px;
font-size: 1.3rem;
}
.card p {
margin-bottom: 20px;
color: #555;
}
.btn {
display: inline-block;
padding: 12px 25px;
background: #3498db;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 1rem;
font-weight: 500;
transition: all 0.3s ease;
text-decoration: none;
margin-right: 10px;
margin-bottom: 10px;
}
.btn:hover {
background: #2980b9;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
.btn-json { background: #9b59b6; }
.btn-json:hover { background: #8e44ad; }
.btn-csv { background: #27ae60; }
.btn-csv:hover { background: #219653; }
.btn-excel { background: #e67e22; }
.btn-excel:hover { background: #d35400; }
.btn-txt { background: #7f8c8d; }
.btn-txt:hover { background: #34495e; }
.demo-section {
background: white;
border-radius: 12px;
padding: 30px;
margin: 40px 0;
box-shadow: 0 8px 16px rgba(0,0,0,0.08);
}
.demo-header {
text-align: center;
margin-bottom: 30px;
color: #2c3e50;
}
table {
width: 100%;
border-collapse: collapse;
margin: 25px 0;
box-shadow: 0 0 20px rgba(0,0,0,0.05);
}
th, td {
padding: 15px;
text-align: left;
border-bottom: 1px solid #e1e1e1;
}
th {
background-color: #f8f9fa;
font-weight: 600;
}
tr:hover {
background-color: #f5f7fa;
}
.export-controls {
display: flex;
flex-wrap: wrap;
gap: 15px;
justify-content: center;
margin-top: 30px;
}
.code-block {
background: #2d2d2d;
color: #f8f8f2;
padding: 20px;
border-radius: 8px;
overflow-x: auto;
margin: 25px 0;
font-family: 'Courier New', monospace;
font-size: 0.95rem;
}
.important-note {
background: #fff8e6;
border-left: 4px solid #ffc107;
padding: 20px;
border-radius: 0 8px 8px 0;
margin: 25px 0;
}
footer {
text-align: center;
padding: 30px;
color: #7f8c8d;
font-size: 0.9rem;
margin-top: 40px;
border-top: 1px solid #eee;
}
@media (max-width: 768px) {
.container {
grid-template-columns: 1fr;
}
h1 {
font-size: 2.2rem;
}
}
</style>
</head>
<body>
<header>
<h1>HTML数据导出完全指南</h1>
<p class="subtitle">探索多种方法将网页数据导出为JSON、CSV、Excel和文本格式</p>
</header>
<div class="container">
<div class="card">
<div class="card-header">JSON格式导出</div>
<div class="card-body">
<h3>轻量级数据交换格式</h3>
<p>JSON是Web应用中常用的数据格式,结构清晰且易于解析,适合导出配置数据、API响应和结构化信息。</p>
<p><strong>优点:</strong> 通用性强、支持嵌套数据结构、文件体积小</p>
<button class="btn btn-json" onclick="exportJSON()">导出JSON示例</button>
</div>
</div>
<div class="card">
<div class="card-header">CSV格式导出</div>
<div class="card-body">
<h3>表格数据首选格式</h3>
<p>CSV(逗号分隔值)是存储表格数据的标准格式,兼容Excel等电子表格软件,适合导出大量结构化数据。</p>
<p><strong>优点:</strong> 通用性强、人类可读、处理速度快</p>
<button class="btn btn-csv" onclick="exportCSV()">导出CSV示例</button>
</div>
</div>
<div class="card">
<div class="card-header">Excel格式导出</div>
<div class="card-body">
<h3>专业电子表格格式</h3>
<p>使用SheetJS等库可以生成原生Excel文件,保留格式和公式,适合商业报表和财务数据。</p>
<p><strong>优点:</strong> 保留格式、支持多工作表、专业外观</p>
<button class="btn btn-excel" onclick="exportExcel()">导出Excel示例</button>
</div>
</div>
</div>
<div class="demo-section">
<div class="demo-header">
<h2>数据导出实战演示</h2>
<p>使用下面的表格数据进行导出操作</p>
</div>
<table id="dataTable">
<thead>
<tr>
<th>ID</th>
<th>产品名称</th>
<th>类别</th>
<th>价格</th>
<th>库存</th>
</tr>
</thead>
<tbody>
<tr>
<td>1001</td>
<td>无线蓝牙耳机</td>
<td>电子产品</td>
<td>¥299.00</td>
<td>120</td>
</tr>
<tr>
<td>1002</td>
<td>机械键盘</td>
<td>电脑配件</td>
<td>¥450.00</td>
<td>85</td>
</tr>
<tr>
<td>1003</td>
<td>智能手表</td>
<td>可穿戴设备</td>
<td>¥899.00</td>
<td>45</td>
</tr>
<tr>
<td>1004</td>
<td>便携充电宝</td>
<td>移动电源</td>
<td>¥159.00</td>
<td>200</td>
</tr>
</tbody>
</table>
<div class="export-controls">
<button class="btn btn-json" onclick="exportTableToJSON()">导出为JSON</button>
<button class="btn btn-csv" onclick="exportTableToCSV()">导出为CSV</button>
<button class="btn btn-excel" onclick="exportTableToExcel()">导出为Excel</button>
<button class="btn btn-txt" onclick="exportTableToTXT()">导出为文本</button>
</div>
</div>
<div class="demo-section">
<h2>实现代码解析</h2>
<h3>JSON导出核心代码</h3>
<div class="code-block">
<pre><code>function exportJSON() {
const data = {
fileName: "示例数据.json",
content: {
system: "数据导出系统",
version: "1.2.0",
timestamp: new Date().toISOString(),
modules: ["用户管理", "订单处理", "库存跟踪"]
}
};
const jsonStr = JSON.stringify(data.content, null, 2);
const blob = new Blob([jsonStr], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = data.fileName;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 100);
}</code></pre>
</div>
<h3>CSV导出核心代码</h3>
<div class="code-block">
<pre><code>function exportCSV() {
const headers = ["ID", "产品名称", "类别", "价格", "库存"];
const rows = [
[1001, "无线蓝牙耳机", "电子产品", "¥299.00", 120],
[1002, "机械键盘", "电脑配件", "¥450.00", 85],
[1003, "智能手表", "可穿戴设备", "¥899.00", 45],
[1004, "便携充电宝", "移动电源", "¥159.00", 200]
];
let csvContent = "data:text/csv;charset=utf-8,";
csvContent += headers.join(",") + "n";
rows.forEach(row => {
csvContent += row.map(field => `"${field}"`).join(",") + "n";
});
const encodedUri = encodeURI(csvContent);
const link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "产品数据.csv");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}</code></pre>
</div>
<div class="important-note">
<h3>重要注意事项</h3>
<p>1. 数据安全:当导出敏感数据时,务必在服务器端进行验证和过滤</p>
<p>2. 性能优化:导出大型数据集时考虑分页或流式处理</p>
<p>3. 浏览器兼容性:Blob API在IE10+支持,旧版浏览器需要polyfill</p>
<p>4. 移动端适配:确保在移动设备上有良好的导出体验</p>
<p>5. 用户体验:提供导出进度提示,特别是处理大数据时</p>
</div>
</div>
<footer>
<p>© 2025 网页数据导出指南 | 本文内容基于Web标准技术,参考MDN文档及SheetJS官方文档</p>
<p>引用来源:MDN Web文档、SheetJS文档、ECMAScript规范</p>
</footer>
<script>
// 示例数据导出函数
function exportJSON() {
const data = {
fileName: "示例数据.json",
content: {
system: "数据导出系统",
version: "1.2.0",
timestamp: new Date().toISOString(),
modules: ["用户管理", "订单处理", "库存跟踪"]
}
};
const jsonStr = JSON.stringify(data.content, null, 2);
downloadFile(jsonStr, data.fileName, 'application/json');
// 显示成功消息
alert(`成功导出JSON文件: ${data.fileName}`);
}
function exportCSV() {
const headers = ["ID", "产品名称", "类别", "价格", "库存"];
const rows = [
[1001, "无线蓝牙耳机", "电子产品", "¥299.00", 120],
[1002, "机械键盘", "电脑配件", "¥450.00", 85],
[1003, "智能手表", "可穿戴设备", "¥899.00", 45],
[1004, "便携充电宝", "移动电源", "¥159.00", 200]
];
let csvContent = headers.join(",") + "n";
rows.forEach(row => {
csvContent += row.map(field => `"${field}"`).join(",") + "n";
});
downloadFile(csvContent, "产品数据.csv", 'text/csv;charset=utf-8;');
alert("成功导出CSV文件: 产品数据.csv");
}
function exportExcel() {
// 创建示例工作簿
const wb = XLSX.utils.book_new();
wb.SheetNames.push("产品数据");
const data = [
["ID", "产品名称", "类别", "价格", "库存"],
[1001, "无线蓝牙耳机", "电子产品", 299.00, 120],
[1002, "机械键盘", "电脑配件", 450.00, 85],
[1003, "智能手表", "可穿戴设备", 899.00, 45],
[1004, "便携充电宝", "移动电源", 159.00, 200]
];
const ws = XLSX.utils.aoa_to_sheet(data);
wb.Sheets["产品数据"] = ws;
// 导出Excel文件
const wbout = XLSX.write(wb, {bookType:'xlsx', type:'binary'});
const blob = new Blob([s2ab(wbout)], {type:"application/octet-stream"});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '产品数据.xlsx';
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 100);
alert("成功导出Excel文件: 产品数据.xlsx");
}
// 表格数据导出函数
function exportTableToJSON() {
const table = document.getElementById('dataTable');
const headers = Array.from(table.querySelectorAll('th')).map(th => th.textContent);
const rows = Array.from(table.querySelectorAll('tbody tr'));
const result = rows.map(row => {
const cells = Array.from(row.querySelectorAll('td'));
return headers.reduce((obj, header, index) => {
obj[header] = cells[index].textContent;
return obj;
}, {});
});
const jsonStr = JSON.stringify(result, null, 2);
downloadFile(jsonStr, '表格数据.json', 'application/json');
alert("成功导出表格数据为JSON格式");
}
function exportTableToCSV() {
const table = document.getElementById('dataTable');
const headers = Array.from(table.querySelectorAll('th')).map(th => th.textContent);
const rows = Array.from(table.querySelectorAll('tbody tr'));
let csvContent = headers.map(header => `"${header}"`).join(',') + '
