首页 > 其他分享 >Vue3实现批量打印二维码与条形码

Vue3实现批量打印二维码与条形码

时间:2023-09-05 18:34:01浏览次数:41  
标签:条形码 vue const 二维码 Vue3 id row

(二维码与条形码在vue3中的使用)

欢迎阅览本篇文章

这篇文章是我在工作途中对批量生成二维码的一些见解,例如vue-qr(二维码)与jsbarcode(条形码)在vxe-table表格中的使用,二维码与条形码的批量生成与打印(打印时一页一个码)等。注意!本篇文章的所有代码均使用setup语法糖与TypeScript,请确保vue版本在vue3.2以上!或自行更改代码后使用。

npm下载相关依赖

  • npm下载vue-qr(二维码)
npm install vue-qr --save
  • 引入vue-qr
import VueQr from 'vue-qr/src/packages/vue-qr.vue'
  • npm下载jsbarcode(条形码)
npm install jsbarcode --save
  • 引入jsbarcode
import JsBarcode from 'jsbarcode'
  • set up语法糖会自动注册引入依赖,此处不需要手动注册,如需要手动注册,请使用以下代码:
export default {
  name:'', 
  components:{
     VueQr,
     JsBarcode 
  }
}

vxe-table表格

vxe-table表格是一个基于 Vue 的表格组件,除了一般表格支持的增删改查、排序、筛选、对比、树形结构、数据分页等,它还支持虚拟滚动、懒加载、打印导出、虚拟列表、虚拟滚动、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等,特别是能支持类似excel表格操作方式。总之相当好用,相比起element-ui更能满足开发的需求。

  • 安装vxe-table
npm install xe-utils vxe-table
  • 全局引入
import Vue from 'vue'
import 'xe-utils'
import VXETable from 'vxe-table'
import 'vxe-table/lib/style.css'
 
Vue.use(VXETable)
  • 具体的表格用法,可以查看官网文档,这里不做过多赘述。

生成二维码

  • 依据表格数据生成二维码
<vxe-column field="mycode" align="center" width="120">
                          <template #default="{ row }">
                            <div ref="qrCodeRef" :id="'qrCode_'+row.id" class="hidden-mycode">
                            <vue-qr
                                :size="110"
                                :margin="0"
                                :auto-color="true"
                                :dot-scale="1"
                                :text="getTableText(row)"
                            />
                            </div>
                          </template>
                        </vxe-column>
  • vue-qr相关属性(常用部分)
属性名 含义
text 编码内容
size 尺寸, 长宽一致, 包含外边距
margin 二维码图像的外边距, 默认 20px
colorDark 实点的颜色
colorLight 空白区的颜色
backgroundColor 背景色
dotScale 数据区域点缩小比例,默认为0.35
autoColor 若为 true, 图像将被二值化处理, 未指定阈值则使用默认值
  • getTableText方法,以JSON格式生成二维码数据
 //二维码生成数据
const getTableText = (row) => {
  const { id, id2, id3, id4} = row;
  const convertedRow = {
    id: String(id),
    id2: String(id2),
    id3: String(id3),
    id4: String(id4),
  };
  return JSON.stringify(convertedRow);
};

生成条形码

条形码的生成使用的是JavaScript的JsBarCode,因为就目前来看vue-barcode只支持vue2使用,而支持vue3使用的vue3-barcode又无法进行批量操作,其在做批量操作时,最后一个条形码会覆盖之前的所有条码,因此使用JsBarCode生成条码,以兼容批量操作。

  • 单独创建一个条码组件,名字随意,自己记得就行
<template>
  <div>
    <svg :id="'barcode'+index"></svg>
  </div>
</template>

<script setup>
import {onMounted, nextTick, defineProps, watch} from 'vue'
import JsBarcode from 'jsbarcode'

const props = defineProps({
  // 数据
  // 当前的值
  value: {
    type: String,
    default: ''
  },
  index: {
    type: Number
  }
});
function draw() {
  JsBarcode('#barcode' + props.index, String(props.value), {
    format: "CODE128",
    width: 1.65,
    height: 50,
    displayValue: true,
    fontSize: 15,
    margin: 15
  });
}

onMounted(() => {
  nextTick(() => {
    draw();
  });
});
</script>

<style scoped>

</style>
  • JsBarCode属性(常用部分)
属性名 含义
format 选择要使用的条形码类型
width 设置条之间的宽度
height 高度
displayValue 是否在条形码下方显示文字
text 覆盖显示的文本
fontOptions 使文字加粗体或变斜体
font 设置文本的字体
textAlign 设置文本的水平对齐方式
textPosition 设置文本的垂直位置
textMargin 设置条形码和文本之间的间距
fontSize 设置文本的大小
background 设置条形码的背景
lineColor 设置条和文本的颜色
margin 设置条形码周围的空白边距
  • 监听表格数据,条码的数据不会随着表格的改动而自动变化,当我们对表格进行增删改查时,条码是不会及时更新的,因此需要监听表格的数据变化,随时重新生成条码
watch(() => props.value, () => {
  nextTick(() => {
    draw();
  });
});
  • 调用条码组件,自己的组件写在哪就在哪里调
import Barcode from "@cesec/views/production/produce-plan/Barcode.vue";
  • vxe表格生成条码数据,注意!一般来说不会在条码里塞太多数据,数据太多会造成条码过长,如果要保存很多数据的话,还是请用二维码存储
 <vxe-column field="myBarCode" align="center" width="120">
                        <template #default="{ row }">
                          <div ref="barCodeRef" :id="'barCode_'+row.id" class="hidden-mybarcode">
                            <Barcode :value="row.planningTasksNo" :index="row.id"></Barcode>
                          </div>
                        </template>
                      </vxe-column>

批量打印二维码与条形码

  • 二维码与条形码的打印通常是通过调用浏览器的打印机功能完成的,以下是获取数据的方式:
//打印二维码
const printEvent = () => {
  const $table = vxeTableRef.value;
  const rows = $table.getCheckboxRecords();

  let qrCodes = '';
  rows.forEach((row) => {
    const qrCodeId = 'qrCode_' + row.id;
    const barCodeId = 'barCode_' + row.id;
    const qrCodeElement = document.getElementById(qrCodeId);
    const barCodeElement = document.getElementById(barCodeId);
    const id= row.id;
    const id2= row.id2;
    const id3= row.id3;
    const id4= row.id4;
    const currentTime = new Date().toLocaleDateString('zh-cn',{dateStyle:'long'});
     qrCodes += `
    <div class="my-list-col">
      <div class="centered-content">${qrCodeElement.innerHTML}</div>
    </div>
    <div class="my-list-col">
      <div class="centered-content">${barCodeElement.innerHTML}</div>
    </div>
`;
  });
  
  if ($table) {
    const printContent = document.createElement('div');
    printContent.innerHTML = qrCodes;

    // 创建一个新的隐藏的iframe元素
    const printFrame = document.createElement('iframe');
    printFrame.style.display = 'none';
    document.body.appendChild(printFrame);

    const printDocument = printFrame.contentWindow.document;
    printDocument.open();
    printDocument.write(`
      <html>
        <body>
          ${printContent.innerHTML}
        </body>
      </html>
    `);
    printDocument.close();

    // 在打印窗口中调用打印功能
    printFrame.contentWindow.print();

    // 移除隐藏的iframe元素
    document.body.removeChild(printFrame);
  }
};

单页打印与码样式调整

以上就完成了二维码与条形码的生成与打印,但很多时候我们不只是单纯的打印出来就好,还需要对二维码进行样式优化,就比如

  • 分页设置,一张纸一个二维码
qrCodes += `
  <div class="my-list-row" style="display: flex; justify-content: center;">
    <div class="my-list-col">
      <div class="centered-content">${qrCodeElement.innerHTML}</div>
    </div>
  </div>
  <div class="my-list-row" style="display: flex; justify-content: center;">
    <div class="my-list-col">
      <div class="centered-content">${barCodeElement.innerHTML}</div>
    </div>
  </div>
  <div class="page-break"></div> <!-- 添加分页符 -->
`;
  • 亦或者需要加一些数据与二维码一起输出
qrCodes += `
  <div class="my-list-row" style="display: flex; justify-content: center;">
   <div class="my-list-col">
      <div class="centered-content">${id}</div>
      <div class="centered-content">${id2}</div>
      <div class="centered-content">${id2}</div>
      <div class="centered-content">${id3}</div>
      <div class="centered-content">${id4}</div>
    </div>
    <div class="my-list-col">
      <div class="centered-content">${qrCodeElement.innerHTML}</div>
    </div>
  </div>
  <div class="my-list-row" style="display: flex; justify-content: center;">
    <div class="my-list-col">
      <div class="centered-content">${barCodeElement.innerHTML}</div>
    </div>
  </div>
  <div class="page-break"></div> <!-- 添加分页符 -->
`;
  • 又或者需要对输出时的页面进行指定
printDocument.write(`
      <html>
        <head>
          <title>Print</title>
          <style>
            @media print {
              .page-break { page-break-after: always; } /* 定义分页符样式 */
              .centered-content { text-align: left; } /* 居中对齐内容 */
              @page { A4 } /* 设置页面尺寸为A4 */
            }
          </style>
        </head>
        <body>
          ${printContent.innerHTML}
        </body>
      </html>
    `);
  • 等等等等,你可以在此基础上的加入更多的样式与功能,我再次就不多说了

完整代码

  • 条码组件
<template>
 <div>
   <svg :id="'barcode'+index"></svg>
 </div>
</template>

<script setup>
import {onMounted, nextTick, defineProps, watch} from 'vue'
import JsBarcode from 'jsbarcode'

const props = defineProps({
 // 数据
 // 当前的值
 value: {
   type: String,
   default: ''
 },
 index: {
   type: Number
 }
});
function draw() {
 JsBarcode('#barcode' + props.index, String(props.value), {
   format: "CODE128",//选择要使用的条形码类型
   width: 1.65,//设置条之间的宽度
   height: 50,//高度
   displayValue: true,//是否在条形码下方显示文字
   fontSize: 15,//设置文本的大小
   margin: 15//设置条形码周围的空白边距
 });
}

onMounted(() => {
 nextTick(() => {
   draw();
 });
});


watch(() => props.value, () => {
 nextTick(() => {
   draw();
 });
});

</script>

<style scoped>

</style>
  • vxe表格生成二维码/条形码
<vxe-column field="myBarCode" align="center" width="120">
                       <template #default="{ row }">
                         <div ref="barCodeRef" :id="'barCode_'+row.id" class="hidden-mybarcode">
                           <Barcode :value="row.value" :index="row.id"></Barcode>
                         </div>
                       </template>
                     </vxe-column>
                       <vxe-column field="mycode" align="center" width="120">
                         <template #default="{ row }">
                           <div ref="qrCodeRef" :id="'qrCode_'+row.id" class="hidden-mycode">
                           <vue-qr
                               :size="110"
                               :margin="0"
                               :auto-color="true"
                               :dot-scale="1"
                               :text="getTableText(row)"
                           />
                           </div>
                         </template>
                       </vxe-column>
  • 二维码数据生成方法
//二维码生成数据
const getTableText = (row) => {
 const { id, id2, id3, id4} = row;
 const convertedRow = {
   id: String(id),
   id2: String(id2),
   id3: String(id3),
   id4: String(id4),
 };
 return JSON.stringify(convertedRow);
};
  • 打印二维码与条形码
//打印二维码
const printEvent = () => {
 const $table = producePlanTableRef.value;
 const rows = $table.getCheckboxRecords();

 let qrCodes = '';
 rows.forEach((row) => {
   const qrCodeId = 'qrCode_' + row.id;
   const barCodeId = 'barCode_' + row.id;
   const qrCodeElement = document.getElementById(qrCodeId);
   const barCodeElement = document.getElementById(barCodeId);
   const id= row.id;
   const id2= row.id2;
   const id3= row.id3;
   const id4= row.id4;
   const currentTime = new Date().toLocaleDateString('zh-cn',{dateStyle:'long'});
   qrCodes += `
 <div class="my-list-row" style="display: flex; justify-content: center;">
  <div class="my-list-col">
     <div class="centered-content">${id}</div>
     <div class="centered-content">${id2}</div>
     <div class="centered-content">${id2}</div>
     <div class="centered-content">${id3}</div>
     <div class="centered-content">${id4}</div>
   </div>
   <div class="my-list-col">
     <div class="centered-content">${qrCodeElement.innerHTML}</div>
   </div>
 </div>
 <div class="my-list-row" style="display: flex; justify-content: center;">
   <div class="my-list-col">
     <div class="centered-content">${barCodeElement.innerHTML}</div>
   </div>
 </div>
 <div class="page-break"></div> <!-- 添加分页符 -->
`;
});
 if ($table) {
   const printContent = document.createElement('div');
   printContent.innerHTML = qrCodes;

   // 创建一个新的隐藏的iframe元素
   const printFrame = document.createElement('iframe');
   printFrame.style.display = 'none';
   document.body.appendChild(printFrame);

   const printDocument = printFrame.contentWindow.document;
   printDocument.open();
   printDocument.write(`
     <html>
       <head>
         <title>Print</title>
         <style>
           @media print {
             .page-break { page-break-after: always; } /* 定义分页符样式 */
             .centered-content { text-align: left; } /* 居中对齐内容 */
             @page { A4 } /* 设置页面尺寸为A4 */
           }
         </style>
       </head>
       <body>
         ${printContent.innerHTML}
       </body>
     </html>
   `);
   printDocument.close();

   // 在打印窗口中调用打印功能
   printFrame.contentWindow.print();

   // 移除隐藏的iframe元素
   document.body.removeChild(printFrame);
 }
};

标签:条形码,vue,const,二维码,Vue3,id,row
From: https://blog.51cto.com/u_16248639/7378092

相关文章

  • vue3如何监听 props 的变化?
    背景实际开发过程中,当需要通过watch 监听传入的props的某个值的变化,来动态改变组件内部的样式,实现方式如下:exportdefault{name:'countdown',props:{showBox:{type:Boolean,required:true,default:false},},setup(prop......
  • vue3.0 el-table 动态合并单元格
    <el-tablev-resize:34style="margin:10px010px":data="tableData":header-cell-style="{background:'#F6F6F6',height:'10px','text-align':'center'}":......
  • antd限制开始时间与结束时间范围是30天,并不能选择当前日期之后的日期 vue3(默认展示近7
    <a-range-picker:value="hackValue||dateArr":disabled-date="disabledDate"style="width:240px"separator="~":allow-cl......
  • Vue3带来的新变化
    Vue3带来的新变化性能提升首次渲染更快diff算法更快内存占用更少打包体积变小更好的Typescript支持CompositionAPI (重点)在使用vue2.x版本开发较复杂的组件时,逻辑难以复用,组合式api的出现可以解决此类问题相关阅读:Vue3中文文档 https://vue3js.cn/docs/zh/......
  • 从零开始一个vue3前端项目day04-头部导航篇
    在实际开发项目中通常会把头部导航栏写成一个通用组件,这里来具体说一下实现思路1:front-header组件就是我们的头部导航栏,路由我们已经配置好了,把每个导航的首页路径,配置成navList(包含name,path),这样就通过遍历navList就能写出一个首页导航组件 2:导航的选中状态实现,不仅仅是切......
  • 从壹开始前后端开发【.Net6+Vue3】(二)前端框架
    项目名称:KeepGoing(继续前进)介绍工作后,学习的脚步一直停停走走,希望可以以此项目为基础,可以不断的迫使自己不断的学习以及成长将以Girvs框架为基础,从壹开始二次开发一个前后端管理框架在这过程中一步步去学习使用到的技术点,也同时会将在此过程中遇到的问题进行分享项目地址......
  • vue3+ts Axios封装—重复请求拦截
    创建好vue3项目1.安装Axios与ElementPlusAxios安装npminstallaxiosElementPlus安装官网入口:https://element-plus.gitee.io/zh-CN/npminstallelement-plus--saveElement主要用到信息提示与全屏加载动画2.在src目录下创建api文件夹和utils文件夹api......
  • vue3+vite使用require引用图片失效问题
    首先,这个问题的原因跟vue无关,是vite引用只支持import,require是隔壁webpack的引用方式,vite用自身的url可以用import.meta.url来拼装项目路径,如下:这个原理只不过是在发布的地址上去找对应图片,而且只会找项目中public文件夹下的图片资源,assets文件夹下的图片资源找不到(原因是publ......
  • vue3 使用vue-router 进行网页跳转以及获取问号后面的参数
    关键代码:constrouter=useRouter()constauthor='myname'router.push({name:'Edit',query:{author}})constroute=useRoute()constvalue=route.query.key详细步骤:0.Initialgitclonehttps://github.com/element-plus/element-plus-v......
  • 利用控件生成二维码
    Sub生成二维码()DimwbAsWorkbookDimshtAsWorksheetSetwb=Application.ThisWorkbookSetsht=wb.Worksheets(1)'RandomizeWithsht'删除旧条码控件.Shapes.SelectAllSelection.DeleteFori=1To......