vue3+ts--实际开发之--table表格打印或者保存

一、 问题页面效果

  1. 实现功能:自定义table表格包含行和列的合并,要求保持css样式不懂能直接导出打印成A4
  2. 常见问题:能实现生成图片导出唤起打印窗口,但是会出现文字分列被分割问题,如下两种被分割情况(文字被分割或者行被分割):

在这里插入图片描述
在这里插入图片描述

二、 Print.js相关属性 和使用

1. 介绍

官网https://printjs.crabbly.com

一个小的javascript库,帮助从web打印和保存。在应用程序中直接打印PDF文件而编写的,不需要离开界面,也不需要使用嵌入。

2. 安装引入

使用npm安装:

  npm install print-js --save

使用纱线安装:

  yarn add print-js

引入:

import printJS from "print-js";

3. PrintJS参数配置表

浏览器翻译的 也可以自己去官网查看https://printjs.crabbly.com

参数默认值描述
printablenull文档来源:pdf或图像url, html元素id或json数据对象。
type‘pdf’可打印类型。可用的打印选项有:pdf, html, image, json和raw-html。
headernull可选标题与HTML、图像或JSON打印一起使用。它将被放置在页面顶部。此属性将接受文本或原始HTML。
headerStyle‘font-weight: 300;’可选的标题样式应用于标题文本。
maxWidth800最大文档宽度(以像素为单位)。根据需要进行更改。打印HTML、图像或JSON时使用。
cssnull这允许我们传递一个或多个css文件URL,这些URL应该应用于正在打印的html。值可以是具有单个URL的字符串或具有多个URL的数组。
stylenull这允许我们传递一个具有自定义样式的字符串,该字符串应应用于正在打印的html。
scanStylestrue当设置为false时,库将不会处理应用于正在打印的html的样式。使用css参数时很有用。
targetStylenull默认情况下,在打印HTML元素时,库仅处理某些样式。此选项允许您传递要处理的样式数组。例如:[‘padding-top’,‘border-bottom’]
targetStylesnull与“targetStyle”一样,这将处理任何一系列样式。例如:[‘border’,‘padding’],将包括’border-bottom’,‘border-top’,‘border-left’,‘border-right’,‘padding-top’等。您也可以传递[’*']来处理所有样式。
ignoreElements[]接受打印父html元素时应忽略的html ID数组。
propertiesnullJSON时使用。这些是对象属性名称。
gridHeaderStyle‘font-weight: bold;’JSON数据时,网格标头的可选样式。
gridStyle‘border: 1px solid lightgray; margin-bottom: -1px;’JSON数据时网格行的可选样式。
repeatTableHeadertrueJSON数据时使用。当设置为false时,数据表标题将仅显示在第一页中。
showModalnull此选项以在检索或处理大型PDF文件时显示用户反馈。
modalMessage‘Retrieving Document…’当showModal设置为true,向用户显示的消息。
onLoadingStartnull加载PDF时要执行的函数
onLoadingEndnull加载PDF后要执行的功能
documentTitle‘Document’打印html、图像或json时,这将显示为文档标题。
fallbackPrintablenull打印pdf时,如果浏览器不兼容(检查浏览器兼容性表),库将在新选项卡中打开pdf。这允许您传递要打开的不同pdf文档,而不是以“可打印”方式传递的原件。如果您在备用pdf文件中注入javascript,这可能会很有用。
onPdfOpennull打印pdf时,如果浏览器不兼容(检查浏览器兼容性表),库将在新选项卡中打开pdf。可以在这里传递一个回调函数,当发生这种情况时,该函数将被执行。在某些情况下,当您想处理打印流程、更新用户界面等时,它可能会很有用。
onPrintDialogClosenull浏览器打印对话框关闭后执行回调功能。
onErrorerror => throw error文档来源:pdf或图像url, html元素id或json数据对象。
base64null文档来源:pdf或图像url, html元素id或json数据对象。

三 、解决关于分页文字或者表格被分割问题,解决后如下:

在这里插入图片描述

⚠️ 注意 ⚠️ :此方法只适用于原声table使用,因为禁止行内分页属性不能绝对定位使用,一般的el-table等组件里边有使用定位
在这里插入图片描述

1. 设置一个自定义table


  <!-- html -->
  <el-button @click="generateImage">导出唤起打印</el-button>
  <table id="tableDataDayin">
    <tr>
      <th rowspan="2">Name</th>
      <th colspan="2">Details</th>
    </tr>
    <tr>
      <th>Age</th>
      <th>Address</th>
    </tr>
    <tr>
      <td>John</td>
      <td>30</td>
      <td rowspan="2">New York</td>
    </tr>
    <tr>
      <td>Jane</td>
      <td>25</td>
    </tr>
    <tr v-for="index in 16" :key="index">
      <td>Jane</td>
      <td>25</td>
      <td>
        New减肥还得好几个返回结核杆菌快递发货个i哦怕u分9外俄文i哦额UI日哦额回个i哦怕u分9外俄文i哦额UI日哦额回复{{
          index
        }}
      </td>
    </tr>
    <tr>
      <td>John</td>
      <td>30</td>
      <td rowspan="3">New York</td>
    </tr>
    <tr>
      <td>Jane</td>
      <td>25</td>
    </tr>
    <tr>
      <td>Jane</td>
      <td>25</td>
    </tr>
    <tr>
      <td>John</td>
      <td>30</td>
      <td rowspan="2">New York</td>
    </tr>
    <tr>
      <td>Jane</td>
      <td>25</td>
    </tr>
  </table>
<!-- css -->
#tableDataDayin {
  border-collapse: collapse;
  width: 100%;
}

#tableDataDayin th {
  background-color: #f2f2f2;
  border: 1px solid #ddd;
}

#tableDataDayin td {
  border: 1px solid #ddd;
  padding: 8px;
}

#tableDataDayin th,
#tableDataDayin td {
  text-align: left;
  page-break-inside: avoid !important; //主要就是这个属性 禁止行内分页
}

#tableDataDayin tr:nth-child(odd) {
  background-color: #f7f7f7;
}

#tableDataDayin tr:nth-child(even) {
  background-color: #f2f2f2;
}

2. 运行后效果:

在这里插入图片描述

3. 添加导出打印js

<!-- js -->
<script setup lang="ts">
import printJS from "print-js";

const generateImage = () => {
  printJS({
    printable: "tableDataDayin", //table表格 id
    type: "html", // 类型
    targetStyles: ["*"],
  });
};
</script>

4.解决后导出打印效果

在这里插入图片描述

四、 element-ui中使用 待更新…

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以帮你回答这个问题。您可以使用 element-plus 中的 el-table 组件创建一个表格,然后使用 Vue3 中提供的 VueDraggable 插件来实现拖拽换行操作。具体实现步骤可以参考以下代码示例: 1.安装所需插件: ```bash npm install vue3-draggable --save npm install element-plus --save ``` 2.引入所需插件: ```js import draggable from 'vuedraggable' import { ElTable, ElTableColumn } from 'element-plus' ``` 3.编写组件代码: ```vue <template> <el-table :data="tableData" style="width: 100%"> <el-table-column type="index" label="序号"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> <draggable v-model="tableData" handle=".handle" :move="onMove"> <template #header> <el-table-column label="操作"> <template #header> <span class="handle">拖拽换行</span> </template> </el-table-column> </template> </draggable> </el-table> </template> <script> import { reactive } from 'vue' export default { components: { draggable, ElTable, ElTableColumn }, setup() { const tableData = reactive([ { name: '张三', age: 18, address: '北京市朝阳区' }, { name: '李四', age: 20, address: '上海市徐汇区' }, { name: '王五', age: 22, address: '广州市天河区' }, { name: '赵六', age: 24, address: '深圳市南山区' } ]) const onMove = (event) => { const draggedElement = event.draggedContext.element const draggedIndex = event.draggedContext.index const relatedElement = event.relatedContext.element const relatedIndex = event.relatedContext.index tableData.splice(draggedIndex, 1) tableData.splice(relatedIndex, 0, draggedElement) } return { tableData, onMove } } } </script> ``` 以上就是使用 Vue3 ts element-plus 技术创建一个列表,可进行拖拽换行操作的步骤。希望能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白菜1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值