table 导出excel表格及遇到的一些问题
let tableHtml = `<table>
<thead>
<tr>
<th style="border: 1px solid #999;">姓名</th>
<th style="border: 1px solid #999;">年龄</th>
<th style="border: 1px solid #999;">电话</th>
<th style="border: 1px solid #999;">备注</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid #999;">张三</td>
<td style="border: 1px solid #999;">34</td>
<td style="border: 1px solid #999;">18923456765</td>
<td style="border: 1px solid #999;">性别:男\n身高:169cm</td>
</tr>
<tr>
<td style="border: 1px solid #999;">李四</td>
<td style="border: 1px solid #999;">35</td>
<td style="border: 1px solid #999;">18934387663</td>
<td style="border: 1px solid #999;">性别:男\n身高:163cm</td>
</tr>
</tbody>
</table>`
function download(htmlStr) {
let blob = new Blob([htmlStr], {
type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = 'demo.xls'
document.body.appendChild(a)
a.click()
}
download(tableHtml)
导出结果:
从以上导出结果可以看到两两个问题:
- 电话号码被转换成了科学计数法;
- 备注列的内容没有换行显示;
问题一:数据类型问题
描述: 类似于电话号码、整数、浮点数、百分数、日期等格式的字符串,在导出后会被转换成相应的类型,在显示上会与原始数据有差异。这不是我们想要的,我们要的是与原始数据一样的表现。
解决办法: 使用 excel 自己的 style 标准进行设置,在 td
中添加样式 mso-number-format:'\@'
,将类型转为字符串类型。
<td style="mso-number-format:'\@'"></td>
添加样式后的导出结果:
问题二:单元格内文本换行问题
描述: 使用 \n
、\r
在导出后无法进行换行;如果使用 HTML 元素 <br/>
进行换行的话,则会使单元格被拆分,也不是理想中的换行效果。
解决办法: 使用 excel 自己的 style 标准进行设置,在 <br/>
元素中添加样式 mso-data-placement:same-cell;
<td style="border: 1px solid #999;">性别:男<br style="mso-data-placement:same-cell;"/>身高:169cm</td>
添加样式后的导出结果: