前端预览含表格文件

需求内容是后台生成包含表格文件后,前端要支持下载与在线预览

首页后台返回的是文件下载链接,直接使用a标签会直接跳转下载

1、使用xhr数据请求方式

2、借助mammoth获取文件内容

3、展示使用div标签即可<div v-html="vhtml"></div>

var vm = this;
var xhr = new XMLHttpRequest();
xhr.open("get", fileUr, true);
xhr.responseType = "arraybuffer";
xhr.onload = function () {
   if (xhr.status == 200) {
       mammoth
         .convertToHtml({ arrayBuffer: new Uint8Array(xhr.response) })
         .then(function (resultObject) {
            vm.$nextTick(() => {//获取文章内容
              console.log(resultObject.value)//展示用的html
              vm.wordVisible = true;
              vm.vHtml = resultObject.value
            });
         });
   }
};
xhr.send();

处理其中的表格数据,添加样式,与空白列头的合并

let html = resultObject.value;
let newHtmlArr = [];
let changeIndex = -1;
html.split("<tr>").forEach((line, index) => {
  // 表头加边框与背景色
  line = line.replaceAll(
    "<table>",
    "<table style='margin:auto;width:80%;'>"
  );
  line = line.replaceAll(
    "<th>",
    "<th style='border:1px solid #333;background:#aaa;'>"
  );

  if (line.indexOf("<strong>安全层面</strong>") != -1) {
    // 非正规表头判断,添加边框与背景色
    if (
      line.indexOf('rowspan="') != -1 &&
      line.indexOf("rowspan=") <
        line.indexOf("<strong>序号</strong>")
    ) {
      //判断有多行表头
      let num = line.split('rowspan="')[1].split('"')[0];
      changeIndex = index + (num - 1);
    }
    if (line.indexOf("<td></td>") != -1) {
      //有空白列
      let lineArr = line.split("<td>"); //按列分割
      let tmpArr = []; //保存修改后的内容
      lineArr.forEach((element, index) => {
        //遍历每个列
        if (element.length && index > 0) {
          //判断有元素
          if (element.startsWith("</td>")) {
            //前部是结束标签则是空元素
            element = element.replace("</td>", "");
            let changeItem = tmpArr[tmpArr.length - 1]; //找到空列前边的列
            if (changeItem.indexOf('colspan="') != -1) {
              //有合并列
              let num = changeItem
                .split('colspan="')[1]
                .split('"')[0];
              num = parseInt(num) + 1; //多加一个需要合并的列
              changeItem =
                changeItem.split('colspan="')[0] +
                'colspan="' +
                num +
                '"' +
                changeItem
                  .split('colspan="')[1]
                  .split('"')[1];
              tmpArr[tmpArr.length - 1] = changeItem;
            } else {
              changeItem = changeItem.replace(
                "<td>",
                '<td colspan="2">'
              );
              tmpArr[tmpArr.length - 1] = changeItem;
            }
          } else {
            element = "<td>" + element;
          }
        }
        if (element.length) {
          //有元素,加入数组
          tmpArr.push(element);
        }
      });
      line = tmpArr.join("");
    }
    line = line.replaceAll(
      "<td",
      "<td style='border:1px solid #333;background:#96D466;'"
    );
  } else if (changeIndex >= index) {
    // 有多行表头
    line = line.replaceAll(
      "<td",
      "<td style='border:1px solid #333;background:#aaa;'"
    );
    if (changeIndex == index) {
      //清空表头记录
      changeIndex = -1;
    }
  } else if (
    line.indexOf("<strong>安全控制点</strong>") != -1
  ) {
    line = line.replaceAll(
      "<td",
      "<td style='border:1px solid #333;background:#889DAD;'"
    );
  } else if (
    line.indexOf("<strong>测评人员签字</strong>") != -1
  ) {
    line = line.replaceAll("<td></td>", "嘟嘟");
    line = line.replaceAll(
      "<td",
      "<td style='border:1px solid #333;background:#FA6B1A;'"
    );
    line = line.replaceAll(
      "嘟嘟",
      "<td style='border:1px solid #333;'></td>"
    );
  } else {
    // 表格项添加边框
    line = line.replaceAll(
      "<td",
      "<td style='border:1px solid #333;'"
    );
  }
  newHtmlArr.push(line);
});

html = newHtmlArr.join("<tr>");

vm.wordVisible = true;
vm.vHtml = html;

 

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值