Files

167 lines
6.1 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Excel 转 Markdown 表格</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#165DFF',
secondary: '#64748b',
},
}
}
}
</script>
<style type="text/tailwindcss">
@layer utilities {
.table-fixed-layout {
table-layout: fixed;
}
.paste-area table {
border-collapse: collapse;
width: 100%;
}
.paste-area td, .paste-area th {
border: 1px solid #cbd5e1;
padding: 6px 10px;
min-width: 80px;
}
.paste-area th {
background-color: #f1f5f9;
}
}
</style>
</head>
<body class="bg-slate-50 min-h-screen">
<div class="container mx-auto px-4 py-8 max-w-7xl">
<header class="text-center mb-8">
<h1 class="text-3xl font-bold text-slate-800 mb-2">
<i class="fa-solid fa-table text-primary mr-2"></i>Excel → Markdown 表格转换
</h1>
<p class="text-secondary">直接粘贴 Excel / 网页表格,左侧实时预览,右侧自动生成 Markdown</p>
</header>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<!-- 左侧:可粘贴表格区域 -->
<div class="bg-white rounded-lg shadow p-5">
<div class="flex justify-between items-center mb-3">
<h2 class="text-xl font-semibold">表格预览</h2>
<button id="clearLeft" class="px-3 py-1.5 bg-slate-200 rounded hover:bg-slate-300 transition">
<i class="fa-solid fa-trash mr-1"></i>清空
</button>
</div>
<div id="pasteArea" class="paste-area border border-slate-300 rounded p-3 h-[calc(100vh-240px)] overflow-auto bg-white">
<div class="text-slate-400 text-center py-10">在此粘贴 Excel 或网页表格内容</div>
</div>
</div>
<!-- 右侧:Markdown 输出 -->
<div class="bg-white rounded-lg shadow p-5">
<div class="flex justify-between items-center mb-3">
<h2 class="text-xl font-semibold">Markdown 输出</h2>
<button id="copyMd" class="px-3 py-1.5 bg-primary text-white rounded hover:opacity-90 transition">
<i class="fa-solid fa-copy mr-1"></i>复制
</button>
</div>
<pre id="mdOutput" class="border border-slate-300 rounded p-3 h-[calc(100vh-240px)] overflow-auto bg-slate-50 whitespace-pre-wrap"></pre>
</div>
</div>
<div class="mt-6 p-4 bg-white rounded shadow text-secondary">
<h3 class="font-semibold mb-2"><i class="fa-solid fa-circle-info text-primary mr-1"></i>使用说明</h3>
<ul class="list-disc pl-5 space-y-1">
<li>直接复制 Excel 或网页里的表格,粘贴到左侧区域</li>
<li>左侧会自动渲染成可视化表格,格式不会丢失</li>
<li>右侧实时生成标准 Markdown 表格</li>
<li>一键复制,可直接用于 Notion、GitHub、语雀、Obsidian</li>
</ul>
</div>
</div>
<script>
const pasteArea = document.getElementById('pasteArea');
const mdOutput = document.getElementById('mdOutput');
const clearLeft = document.getElementById('clearLeft');
const copyMd = document.getElementById('copyMd');
// 粘贴监听(核心)
pasteArea.addEventListener('paste', (e) => {
e.preventDefault();
const html = e.clipboardData.getData('text/html');
const text = e.clipboardData.getData('text');
if (html && html.includes('<table')) {
pasteArea.innerHTML = html;
} else {
pasteArea.innerHTML = textToTable(text);
}
setTimeout(renderMarkdown, 10);
});
// 纯文本转表格(Excel 粘贴纯文本也能识别)
function textToTable(text) {
const rows = text.trim().split(/\r?\n/).filter(i => i);
let html = '<table>';
rows.forEach(row => {
html += '<tr>';
row.split('\t').forEach(cell => {
html += '<td>' + cell + '</td>';
});
html += '</tr>';
});
html += '</table>';
return html;
}
// 把左侧表格转成 Markdown
function renderMarkdown() {
const table = pasteArea.querySelector('table');
if (!table) {
mdOutput.textContent = '请粘贴表格内容';
return;
}
let md = '';
const rows = table.querySelectorAll('tr');
rows.forEach((tr, idx) => {
const cells = tr.querySelectorAll('td, th');
const rowContent = Array.from(cells).map(c => c.innerText.trim());
md += '| ' + rowContent.join(' | ') + ' |\n';
// 表头分隔线
if (idx === 0) {
md += '| ' + rowContent.map(() => '---').join(' | ') + ' |\n';
}
});
mdOutput.textContent = md;
}
// 清空
clearLeft.addEventListener('click', () => {
pasteArea.innerHTML = '<div class="text-slate-400 text-center py-10">在此粘贴 Excel 或网页表格内容</div>';
mdOutput.textContent = '';
});
// 复制
copyMd.addEventListener('click', async () => {
const content = mdOutput.textContent;
if (!content.trim()) return alert('无内容可复制');
await navigator.clipboard.writeText(content);
copyMd.innerHTML = '<i class="fa-solid fa-check mr-1"></i>已复制';
setTimeout(() => {
copyMd.innerHTML = '<i class="fa-solid fa-copy mr-1"></i>复制';
}, 1500);
});
</script>
</body>
</html>