Vue3 打印,合并单元格

一、npm i vue3-print-nb

 1、按钮:
      <el-button type="danger" v-print="printObj" icon="Star">交接并打印</el-button>
2、打印区域外边添加div
    <div ref="printContent" id="printContent" class="print">
     <!--打印区域 -->
    </div>
3、参数
 let printObj = reactive({
  id:"printContent",// 绑定打印区域id
  popTitle:"标签",// 内容标签
  zIndex:20002,
  // 打印成功之后执行其他方法
  openCallback(){
    handleSubmit()
  }
 })
4、集合中包含某个参数(true,false)
  let obj =setNames.value.includes(s.setName) 
5、合并单元格
   // 合并的字段名
    const colFields=['dispatchTaskType','customerName','branchName']
    // 表格数据,表格字段
    setTableRowSpan(tableData.value,colFields)
 6、设置合并的行和列
 const setTableRowSpan = (tableData:any,colFields:any) =>{
  let lastItem:any = []
  // 循环需要合并的列
  colFields.forEach((field:any, index:any) =>{
    tableData.forEach((item:any) =>{
      // 存值,把合并字段存入行,为了合并单元格时检索列是否含有该字段
      item.mergeCell = colFields
      // 合并的字段出现的次数
      const rowSpan = `rowspan_${field}`
      // 比较上一次的存值和该轮的合并字段,判断是否合并到上个单元格
      if( colFields.slice(0,index + 1).every(e =>lastItem[e] === item[e] )){
          // 如果是,合并行;
          item[rowSpan] = 0 // 该轮合并字段数量存0
          // 上轮合并字段数量+1
          lastItem[rowSpan] +=1
      }else{
          //初始化进入&& 如果不是,完成一次同类合并,lastItem重新赋值,进入下一次计算
          item[rowSpan] = 1 // 该轮合并字段第一次出现,数量存1
          // 改变比较对象,重新赋值,进行下一次计算
          lastItem = item
      }
    })
  })
}
7、合并单元格
const objectSpanMethod = ({row, column, rowIndex, columnIndex}) => {
  let cell = row.mergeCell
  if(cell !=null){
    if(cell.includes(column.property)){
      const rowspan = row[`rowspan_${column.property}`]
      if(rowspan){
        return { rowspan:rowspan, colspan:1}
      }else {
        return { rowspan:0, colspan:0}
      }
    }
  }
}
8、多个集合合并
 let box = [...JSON.parse(JSON.stringify(existObj[0].firstBox)),...JSON.parse(JSON.stringify(existObj[0].secondBox)),...JSON.parse(JSON.stringify(existObj[0].thirdBox))]
9、集合分三份
    const firstPart = box.filter((num) =>{
        let  index =box.indexOf(num)
          return index % 3 === 0});
        const secondPart = box.filter((num) =>{
        let  index =box.indexOf(num)
          return index % 3 === 1});
        const thirdPart = box.filter((num) =>{
        let  index =box.indexOf(num)
          return index % 3 === 2});
        existObj[0].firstBox = firstPart
        existObj[0].secondBox = secondPart
        existObj[0].thirdBox = thirdPart
        existObj[0].boxCount ++
   // 下标
        let index = tableData.value.indexOf(existObj[0]);
        // 先删除再添加
        tableData.value.splice(index,1);
        tableData.value.splice(index,0,existObj[0]);
10、选择集合中符合条件的数据
     let obj = arr.filter((i:any) =>{return i.taskType == commonStore.dispatchTaskType.lateTask})
11、删除单个数据
 @confirm="handleDelete(item,scope.row,scope.column)"
// 款箱删除,后台直接删除
const handleDelete = (item:any,data:any,column:any) => {
 let col = column.property;
  if(col === "firstBox"){
   // 是否存在
    let index =  data.firstBox.indexOf(item);
    if(index !== -1){
  // 删除
       data.firstBox.splice(index,1);
       data.boxCount--
       personInfo.value.totalCount--
    }
  } else if(col === "secondBox"){
    let index =  data.secondBox.indexOf(item);
    if(index !== -1){
       data.secondBox.splice(index,1);
       data.boxCount--
       personInfo.value.totalCount--
    }
  }else if(col === "thirdBox"){
    let index =  data.thirdBox.indexOf(item);
    if(index !== -1){
       data.thirdBox.splice(index,1);
       data.boxCount--
       personInfo.value.totalCount--
    }
  }
  let box =[...JSON.parse(JSON.stringify(data.firstBox)),...JSON.parse(JSON.stringify(data.secondBox)),...JSON.parse(JSON.stringify(data.thirdBox))]
  let count = box.length;
  // 没有数据直接删除当前行
  if(count === 0){
    let dataIndex =  tableData.value.indexOf(data);
    tableData.value.splice(dataIndex,1);
  }        
  ElMessage.success("删除成功")
}
       
 
 
posted @ 2023-11-03 11:33  flyComeOn  阅读(136)  评论(0编辑  收藏  举报