Vue-打印自定义HTML表格

自定义打印方法

1. 准备HTML结构

首先,构造了一个基本的HTML页面框架,并设置了页面的字符编码为UTF-8,以确保中文和其他特殊字符能正确显示。页面的标题设置为传入的 title 参数值。

let printStr = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><title>" + title + '</title></head>'

2. 创建DOM元素与表格内容

接下来,创建了两个 <div> 元素,其中一个被赋予了ID table,用于容纳后续动态生成的表格内容。根据传入的 data 对象,构建了一个复杂的HTML表格字符串,这个表格包含了产品信息、订单详情、生产过程中的各个步骤(如配料、贴片、测试等)以及备注信息。

const div1 = document.createElement('div')
const div = document.createElement('div')
div.id = 'table'
div1.appendChild(div)// ... 构建表格内容 ...div.insertAdjacentHTML('afterbegin', table)

3. 样式应用

为了确保表格的边框能够正常显示,向页面中插入了简单的CSS样式规则,指定每个单元格 (td) 的边框为1像素实线黑色。

printStr = printStr + content + '</body><style>td{border:1px solid black}</style></html>'

4. 打印操作

通过 window.open('_blank') 方法打开了一个新的浏览器窗口,并将之前构造好的HTML字符串写入新窗口的文档中。然后利用 setTimeout 确保所有DOM元素渲染完成之后再调用新窗口的 print() 方法来触发浏览器的打印对话框。最后,关闭打印窗口,避免留下不必要的空白标签页。

const pWin = window.open('_blank')
pWin.document.write(printStr)setTimeout(() => {pWin.print()pWin.close()
}, 300)

5. 数据映射与格式化

在构建表格时,对某些字段进行了映射转换,比如 moduleTypeMapyesOrNoMap,以便将数据库中的数值或代码转换成更具可读性的文本描述。此外,对于可能为空的数据项,使用了空值合并运算符 (??) 来提供默认值,防止出现未定义的情况。

const moduleTypeMap = {1: '小表-计量',2: '小表-MBUS',// ... 其他映射 ...
}const yesOrNoMap = {0: '否',1: '是'
}

6. 延迟执行

在获取数据后,通过 setTimeout 设置了一个短暂的延迟(500毫秒),然后再调用 saleTrackPrint 函数。这可能是为了确保数据完全加载并处理完毕后再进行打印操作,避免因异步操作导致的数据不完整问题。

getTrackPrint(row.id).then(res => {setTimeout(() => {saleTrackPrint({...res.data, track_no: data.track_no_sub, ob_num: data.ob_num,contract_no: row.contract_no}, '生产跟踪单', 0)}, 500)
})

完整代码

import { saleTrackPrint } from '@/utils'getTrackPrint(row.id).then(res => {setTimeout(() => {saleTrackPrint({...res.data, track_no: data.track_no_sub, ob_num: data.ob_num,contract_no: row.contract_no}, '生产跟踪单', 0)}, 500)})

saleTrackPrint 方法是一个用于生成并打印生产跟踪单的JavaScript函数。它接收三个参数:data(包含需要打印的数据对象)、title(文档标题)和type(未在代码中使用)。以下是该方法的工作流程及其实现细节的深入分析:

export function saleTrackPrint(data, title, type) {// 空页面let printStr = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><title>" + title + '</title></head>'let content = ''const div1 = document.createElement('div')const div = document.createElement('div')div.id = 'table'div1.appendChild(div)const moduleTypeMap = {1: '小表-计量',2: '小表-MBUS',3: '大表-计量',4: '大表-MBUS',5: '小表-485',6: '大表-485'}const yesOrNoMap = {0: '否',1: '是'}const table = `<table border="1" width="1000" height="500" align="left" cellpadding="10" cellspacing="0"><tr>
<th colspan="7" style="font-size: 30px">${title}(${data.track_no})</th></tr><tr><td rowspan="5">产品信息</td></tr>
<tr>
<td width="150">订单数量</td><td width="150">${data.product_num ?? ''}</td>
<td width="150">贴片数量</td><td width="150">${data.ob_num}</td>
<td width="150">预交货日期</td><td width="150">${data.delivery_time ?? ''}</td></tr>
<tr>
<td>产品型号</td><td>${data.product_model ?? ''}</td>
<td>程序版本</td><td>${data.soft_version ?? ''}</td>
<td>排针尺寸</td><td>${data.pin_height ?? ''}</td></tr>
<tr>
<td>硬件版本号</td><td style="font-weight:bold">${data.hard_version ?? ''}</td>
<td>模块类型</td><td>${moduleTypeMap[data.module_type] ?? ''}</td>
<td>产品名称</td><td>${data.product_name}</td></tr>
<tr>
<td>客户/厂家</td><td>${data.product_buyer ?? ''}</td>
<td>程序方案</td><td>${data.program_scheme ?? '' ?? ''}</td>
<td>合同号</td><td>${data.contract_no ?? ''}</td></tr>
<tr>
<td>BOM单名称</td><td colspan="6">${data.bom_name ?? ''}</td></tr>
<tr><td>配料</td><td>配料人员</td><td colspan="2"></td><td>配料时间</td><td colspan="2"></td></tr>
<tr><td rowspan="4">贴片</td></tr>
<tr><td>1、器件检查</td><td></td><td>2、炉温</td><td></td><td>3、锡膏</td><td></td></tr>
<tr><td>4、推力</td><td></td><td>5、首件测试</td><td></td><td colspan="2"></td></tr>
<tr><td>贴片人员</td><td colspan="2"></td><td>贴片时间</td><td colspan="2"></td></tr>
<tr><td rowspan="7">测试</td></tr>
<tr>
<td rowspan="2">数据来源路径</td>
<td colspan="2" align="center">测试数据</td>
<td colspan="3" align="center">平台数据</td></tr>
<tr>
<td align="center">工序1</td>
<td align="center">工序2</td>
<td align="center">工序1</td>
<td colspan="2" align="center">工序2</td></tr>
<tr>
<td>检测总数</td><td></td><td></td><td></td><td colspan="2"></td></tr>
<tr>
<td>检测合格数</td><td></td><td></td><td></td><td colspan="2"></td></tr>
<tr>
<td>检测不良数</td><td></td><td></td><td></td><td colspan="2"></td></tr>
<tr><td>测试人员</td><td colspan="2"></td><td>测试时间</td><td colspan="2"></td></tr>
<tr>
<td rowspan="2">割板</td><td>割板合格数</td><td colspan="2"></td><td>割板不良数</td><td colspan="2"></td></tr>
<tr><td>割板人员</td><td colspan="2"></td><td>割板时间</td><td colspan="2"></td></tr>
<tr>
<td rowspan="2">包装</td><td>包装合格数</td><td colspan="2"></td><td>外观不良数</td><td colspan="2"></td></tr>
<tr><td>包装人员</td><td colspan="2"></td><td>包装时间</td><td colspan="2"></td></tr>
<tr>
<td rowspan="2">入库</td><td>入库合格数</td><td colspan="2"></td><td>订单不良数登记(不入库)</td><td colspan="2"></td></tr>
<tr><td>入库人员</td><td colspan="2"></td><td>入库时间</td><td colspan="2"></td></tr>
<td colspan="1">订单备注</td><td colspan="6">${data.remark ?? ''}</td></tr>
<tr>
<td colspan="1">客户备注</td><td colspan="6">${data.customer_remark ?? ''}</td></tr>
</table>`
div.insertAdjacentHTML('afterbegin', table)// 拼接空页面+style样式+dom内容content = content + div1.innerHTML// printStr = printStr + tabStyle + content + '</body></html>'printStr = printStr + content + '</body><style>td{border:1px solid black}</style></html>'// 打开新页面const pWin = window.open('_blank')// 将内容赋值到新页面pWin.document.write(printStr)// 使用setTimeout,等页面dom元素渲染完成后再打印。setTimeout(() => {pWin.print() // 调用打印功能。pWin.close() // 关闭 打印创建的当前页面document.getElementById(div1.id) // .setAttribute('style', 'display: none')}, 300)
}

效果展示

        当用户触发打印功能时,会弹出一个预览窗口,显示带有详细信息的生产跟踪单。用户可以选择直接打印或保存为PDF文件。此方法实现了无需离开当前页面即可快速生成并打印文档的需求,适用于各种内部管理系统的报表输出场景。

7d6441a4f34040b8975319f861825f84.png

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http1.0、1.1、2.0、 3.0

http1.0、1.1、2.0、 3.0 http1.1 引入长连接&#xff0c;在1.0&#xff0c;每次请求都需要建立新的TCP连接&#xff0c;处理请求完毕后立即断开。就导致处理大量图片&#xff0c;链接等资源&#xff0c;需要大量的连接与断开&#xff0c;造成资源浪费和时间延迟。而长连接允许…

跟着问题学15——GRU网络结构详解及代码实战

1 RNN的缺陷——长期依赖的问题 &#xff08;The Problem of Long-Term Dependencies&#xff09; 前面一节我们学习了RNN神经网络&#xff0c;它可以用来处理序列型的数据&#xff0c;比如一段文字&#xff0c;视频等等。RNN网络的基本单元如下图所示&#xff0c;可以将前面的…

pytest中使用conftest做测试前置和参数化

pytest中比较高阶的应用是&#xff0c;使用conftest去做测试前置工作、测试收尾工作和参数化。conftest是pytest的一个组件&#xff0c;用于配置测试环境和参数。通过conftest, 可以创建一个可复用的测试配置文件&#xff0c;以便在多个测试模块之间共享配置信息。即&#xff0…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

mvn test 失败,单独运行单元测试成功

标题mvn test 失败&#xff0c;单独运行单元测试成功 使用junit4进行单元测试时是通过的&#xff0c;但是在执行maven的test与package时测试不通过 报错信息&#xff1a; parse data from Nacos error,dataId:guoyu-new-asset-dev.yml,data: ....... 配置文件内容 ....... o…

android 富文本及展示更多组件

模拟微博 #热贴 和 用户 的这种 富文本形式组件&#xff0c;不说了&#xff0c; 直接上代码 package com.tongtong.feat_watch.viewimport android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater impo…

gitlab 生成并设置 ssh key

一、介绍 &#x1f3af; 本文主要介绍 SSH Key 的生成方法&#xff0c;以及如何在GitLab上添加SSH Key。GitLab 使用SSH协议与Git 进行安全通信。当您使用 SSH密钥 对 GitLab远程服务器进行身份验证时&#xff0c;您不需要每次都提供您的用户名和密码。SSH使用两个密钥&#x…

保姆级教程Docker部署Nacos镜像

目录 1、创建挂载目录 2、拉取 Nacos 镜像 3、临时启动并复制文件 4、创建Nacos表结构 5、修改Nacos配置 6、正式启动 Nacos 7、登录Nacos 1、创建挂载目录 在宿主机上创建一个目录用于配置文件映射&#xff0c;这个目录将作为数据卷挂载到容器内部&#xff0c;使得我…

【北京迅为】iTOP-4412全能版使用手册-第六十七章 USB鼠标驱动详解

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…

Java项目实战II基于微信小程序的旅游社交平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着移动互联网的迅猛发展&#xff0c;旅游已经成为人…

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…

IS-IS二

目录 ISIS建立邻接关系的基本条件&#xff1a; 1、接口链路类型一致 2、广播型链路上&#xff0c;接口类型一致 3、Hello包级别和类型一致 4、L1区域的ID要一致&#xff0c;L2的邻居区域ID不做要求 5、L1-2在区域ID相同下&#xff0c;即建立L1也建立L2区域ID不同只能建立…

️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南20241206

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南 &#x1f4dd; 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能的飞速发展&#xff0c;越来越多的开发者尝试在本地环境中部署大模型进行实验。然而&#xff0c;由于资源需求高、网络限制多…

设计模式の单例工厂原型模式

文章目录 前言一、单例模式1.1、饿汉式静态常量单例1.2、饿汉式静态代码块单例1.3、懒汉式单例&#xff08;线程不安全&#xff09;1.4、懒汉式单例&#xff08;线程安全&#xff0c;同步代码块&#xff09;1.5、懒汉式单例&#xff08;线程不安全&#xff0c;同步代码块&#…

net.sf.jsqlparser.statement.select.SelectItem

今天一启动项目&#xff0c;出现了这个错误&#xff0c;仔细想了想&#xff0c;应该是昨天合并代码&#xff0c;导致的mybatis-plus版本冲突&#xff0c;以及分页PageHelper版本不兼容 可以看见这个我是最下边的Caused by 报错信息&#xff0c;这个地方提示我 net .sf.jsqlpar…

第427场周赛: 转换数组、用点构造面积最大的矩形 Ⅰ、长度可被 K 整除的子数组的最大元素和、用点构造面积最大的矩形 Ⅱ

Q1、转换数组 1、题目描述 给你一个整数数组 nums&#xff0c;它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result &#xff1a; 对于每个下标 i&#xff08;其中 0 < i < nums.length&#xff09;&#xff0c;独立执行以下操作&#xff1a; 如…

CV工程师专用键盘开源项目硬件分析

1、前言 作为一个电子发烧友&#xff0c;你是否有遇到过这样的问题呢。当我们去查看函数定义的时候&#xff0c;需要敲击鼠标右键之后选择go to definition。更高级一些&#xff0c;我们使用键盘的快捷键来查看定义&#xff0c;这时候可以想象一下&#xff0c;你左手按下ALT&a…

SpringBoot3配置文件

一、统一配置管理概述: SpringBoot工程下&#xff0c;进行统一的配置管理&#xff0c;你想设置的任何参数(端口号、项目根路径、数据库连接信息等等)都集中到一个固定位置和命名的配置文件(application.properties或application.yml)中 配置文件应该放置在Spring Boot工程的s…

【机器学习】任务十一:Keras 模块的使用

1.Keras简介 1.1 什么是Keras&#xff1f; Keras 是一个开源的深度学习框架&#xff0c;用 Python 编写&#xff0c;构建于 TensorFlow 之上。它以简单、快速和易于使用为主要设计目标&#xff0c;适合初学者和研究者。 Keras 提供了高层次的 API&#xff0c;帮助用户快速构…