这是一个自我回答的问题。
如何在浏览器中以<table>
格式下载HTML?假设HTML表的实际数据中不包含逗号。
这是我的HTML表:
<table style="width:100%">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
</table>
我不关心老的浏览器,只关心完全支持ES6的现代浏览器。
发布于 2018-08-19 07:53:49
只需循环遍历HTML行tr
,使用逗号,
连接列,使用换行符/n
连接行。
然后循环遍历headers th
,并用逗号,
将它们连接起来。
然后使用换行符/n
连接标题字符串和行字符串。
从那时起,只需使用CSV字符串的一组Blob
创建一个超链接<a>
,并强制.click()
它,即可开始下载。
下面是一个在Chrome68,FF 58,MacOS Safari11上运行良好的例子:
const tableToCSV = table => {
const headers = Array.from(table.querySelectorAll('th'))
.map(item => item.innerText).join(',')
const rows = Array.from(table.querySelectorAll('tr'))
.reduce((arr, domRow) => {
if (domRow.querySelector('th')) return arr
const cells = Array.from(domRow.querySelectorAll('td'))
.map(item => item.innerText)
.join(',')
return arr.concat([cells])
}, [])
return headers + '\n' + rows.join('\n')
}
const downloadCSV = csv => {
const csvFile = new Blob([csv], { type: 'text/csv' })
const downloadLink = document.createElement('a')
downloadLink.download = `CSV-${new Date().toDateString()}.csv`
downloadLink.href = window.URL.createObjectURL(csvFile)
downloadLink.style.display = 'none'
document.body.appendChild(downloadLink)
downloadLink.click()
}
document.querySelector('button').addEventListener('click', () => {
const table = document.querySelector('table')
const csv = tableToCSV(table)
return downloadCSV(csv)
})
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 15px;
text-align: left;
}
table#t01 {
width: 100%;
background-color: #f1f1c1;
}
<table style="width:100%">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
</table>
<button on-click="download()">Download CSV</button>
https://stackoverflow.com/questions/51913381
复制相似问题