需求

打印Element-UI el-table组件渲染的表格。

总体布局

整体采用居中布局,表格宽度设置为1000px。表格宽度应该根据打印的纸张大小设置,过大会导致表格打印时显示不全,过小则不能充分利用纸张空间。我用A4纸打印设置宽度1000px刚好。

1. 静态页面

  1. <template>
  2. <div class="print-container">
  3. <h1 style="text-align: center">员工信息表</h1>
  4. <el-table
  5. :data="tableData"
  6. style="width: 100%"
  7. border>
  8. <el-table-column
  9. prop="date"
  10. label="日期"
  11. width="180">
  12. </el-table-column>
  13. <el-table-column
  14. prop="name"
  15. label="姓名"
  16. width="180">
  17. </el-table-column>
  18. <el-table-column
  19. prop="gender"
  20. label="性别"
  21. width="180">
  22. </el-table-column>
  23. <el-table-column
  24. prop="address"
  25. label="地址">
  26. </el-table-column>
  27. <el-table-column
  28. prop="phone"
  29. label="手机">
  30. </el-table-column>
  31. </el-table>
  32. <div class="print-button-container">
  33. <el-button type="primary" icon="el-icon-printer">打印</el-button>
  34. </div>
  35. </div>
  36. </template>
  37. <script>
  38. export default {
  39. name: 'Print',
  40. props: {
  41. msg: String
  42. },
  43. data() {
  44. return {
  45. tableData: [{
  46. date: '2016-05-02',
  47. name: '王小虎',
  48. gender: '男',
  49. address: '上海市普陀区金沙江路 1518 弄',
  50. phone: '19029384851'
  51. }, {
  52. date: '2016-05-04',
  53. name: '王小虎',
  54. gender: '男',
  55. address: '上海市普陀区金沙江路 1517 弄',
  56. phone: '19029384851'
  57. }, {
  58. date: '2016-05-01',
  59. name: '王小虎',
  60. gender: '男',
  61. address: '上海市普陀区金沙江路 1519 弄',
  62. phone: '19029384851'
  63. }, {
  64. date: '2016-05-03',
  65. name: '王小虎',
  66. gender: '男',
  67. address: '上海市普陀区金沙江路 1516 弄',
  68. phone: '19029384851'
  69. }]
  70. }
  71. }
  72. }
  73. </script>
  74. <style scoped>
  75. .print-container {
  76. width: 1000px;
  77. margin: 0 auto;
  78. }
  79. .print-button-container {
  80. display: flex;
  81. justify-content: flex-end;
  82. margin-top: 15px;
  83. }
  84. </style>

表格效果:

image.png

2. 调用浏览器的打印方法

  1. <div class="print-button-container">
  2. <el-button type="primary" icon="el-icon-printer" @click="handlePrint">打印</el-button>
  3. </div>
  1. /**
  2. * 调用浏览器的打印方法
  3. */
  4. handlePrint() {
  5. window.print()
  6. }

打印预览:

image.png

可以看到,el-table默认的边框样式在打印时并不怎么清晰,右边框和底部边框还出现了丢失;顶部和底部出现了页眉和页脚;打印按钮也没去掉。接下来将逐步优化打印的效果。

表格样式

首先来优化el-table的样式

  1. /*字体调黑*/
  2. >>> .el-table {
  3. font-size: 16px;
  4. color: #000000;
  5. }
  6. >>> .el-table th {
  7. font-weight: normal;
  8. font-size: 18px;
  9. }
  10. >>> .el-table thead {
  11. color: #000000;
  12. }
  13. /*边框调黑*/
  14. >>> .el-table::before {
  15. background-color: #000000;
  16. }
  17. >>> .el-table--border::after {
  18. background-color: #000000;
  19. }
  20. >>> .el-table--border th, >>> .el-table--border td {
  21. border-color: #000000;
  22. }
  23. >>>.el-table--group, >>>.el-table--border {
  24. border-color: #000000;
  25. }
  26. >>> .el-table th.is-leaf, >>> .el-table td {
  27. border-bottom: 1px solid #000000;
  28. }
  29. /*减小单元格间距*/
  30. >>> .el-table th, >>> .el-table td {
  31. padding: 0 0;
  32. }
  33. /*显示底部边框 估计打印时伪元素把border覆盖了 height设为0隐藏伪元素*/
  34. >>> .el-table::before {
  35. height: 0;
  36. }
  37. /*显示右边框*/
  38. >>> .el-table--group::after, >>> .el-table--border::after {
  39. width: 0;
  40. }

打印预览:

image.png

可以看到,优化后的表格更加清晰简洁,接下来还要设置一些特殊的,只在打印时生效的样式。

打印样式

通过@media print媒体查询设置打印时生效的一些样式:删除“打印”按钮,删除默认的页眉页脚,布局设置为纵向。

  1. @media print {
  2. @page {
  3. /* 纵向打印 */
  4. size: portrait;
  5. /* 横向打印 */
  6. /*size: landscape;*/
  7. /* 去掉页眉页脚*/
  8. margin-top: 0;
  9. margin-bottom: 0;
  10. }
  11. /*打印不显示打印按钮*/
  12. .print-button-container {
  13. display: none !important;
  14. }
  15. }

打印预览
image (1).png
到此为止,打印的任务大功告成!!
完整demo: https://github.com/memory1668/el-table-print
参考: window.print() 前端实现网页打印详解