element Table定制化导出Excel(特定行/列导出)

需求是特定行列表格数据导出为excel,既然需求来了,那就奥利给,干就完了!
因为实现过程较曲折,遂记以便日后查看。

最后实现大概这个样子
在这里插入图片描述
网上各种查阅
有个方法时这种(需要额外的安装script-loader):
table导出选中项

我项目是 vue+ts,我看到需要额外的引入两个文件,这两个文件里面我看var还在用,还有各种类型报错,肯定要大改,我是个懒人。。。。

进而找到了这个方法:表格数据导出Excel
思路很新奇:把选中的数据再用一个看不见的表格展示出来,最后导出!
如果你导出的地方较多,这样会产生较多的节点,用哪个方法你自己斟酌


正文
我参考的是后面的方法
首先要安装两个包:

yarn add xlsx file-saver -D

我有两个地方用到就把公用的方法提出来了utils/index.ts:

import FileSaver from "file-saver";
import XLSX from "xlsx";

// 导出excel文件
export function exportExcelSelf(id: string, filename: string = "表格数据"){
  /* 从表生成工作簿对象 */
  const wb: any = XLSX.utils.table_to_book(
    document.querySelector(`#${id}`)
  );
  /* 获取二进制字符串作为输出 */
  const wbout = XLSX.write(wb, {
    bookType: "xlsx",
    bookSST: true,
    type: "array"
  });
  try {
    FileSaver.saveAs(
      //Blob 对象表示一个不可变、原始数据的类文件对象。
      //Blob 表示的不一定是JavaScript原生格式的数据。
      //File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
      //返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
      new Blob([wbout], { type: "application/octet-stream" }),
      //设置导出文件名称
      `${filename}.xlsx`
    );
  } catch (e) {
    Message.error(e.toString());
  }
  return wbout;
}

新建一个组件:exportExcel.vue

<template>
  <transition name="fadeIn">
    <div v-show="false">
      <el-table :id="etData.id" :data="epData">
        <template v-for="(item, key, index) in etData.theader">
          <el-table-column :label="item[0]" :key="index">
            <template slot-scope="scope">
              <span>{{
                item[1] ? item[1][scope.row[key]] : scope.row[key]
              }}</span>
            </template>
          </el-table-column>
        </template>
      </el-table>
    </div>
  </transition>
</template>
<script lang="ts">
import { Vue, Component, Watch, Prop } from "vue-property-decorator";
import { arrayData, objectData } from "../types";
import { exportExcelSelf } from "../untils/index";
@Component
export default class ExportExcel extends Vue {
  @Prop({ required: true }) exportData!: arrayData;
  @Prop({ default: { id: String, tHeaders: Object }, required: true })
   extraData!: objectData;

  private epData = this.exportData;
  private etData = this.extraData;

  @Watch("exportData", { deep: true })
  exportDataChaneg(data: arrayData) {
    this.epData = [...data];
  }

  private exportExcelSelf() {
    exportExcelSelf(this.extraData.id, "工单详情");
  }
}
</script>

父组件(只贴关键代码):

//template
<el-table
    :data="approvalTableData"
    id="approval-table"
    @selection-change="handleSelectionChange"
>
	<el-table-column type="selection" width="55"> </el-table-column>
	<!-- 其它代码 -->
</table>

<export-excel
  :exportData="selectedListArr"
  :extra-data="exportHeaders"
  ref="selectedApprovals"
></export-excel>

//js
import { exportExcelSelf } from "../../../untils/index";
import exportExcel from "../../../components/exportExcel.vue";

@Component({
  components: {
    exportExcel
  }
})
export default class ApprovalCenter extends Vue {
	//Data:
	// 导出数据
	private selectedListArr: arrayData = [];
	// 下面id是子组件里面的id,至于tHeader的键,对应着table-column的prop(对应着你想导出的列)
	//键值数组里第一个表示表头,第二个元素是过滤功能,是一个对象{1: "值1", 2: “值2”}
	private exportHeaders: objectData = {
	  id: "approval-ept",
	  theader: {
	    type: ["审批类型", this.APPROVAL_TYPE],
	    ask: ["申请原因"],
	    requester_name: ["创建人"],
	    create_time: ["创建时间"]
	  }
	};
	 
	//Methods
	// table选择框改变事件
	private handleSelectionChange(val: arrayData): void {
	  this.selectedListArr = [...val];
	}
	private exportApproval(): void {
	  if (this.selectedListArr.length === 0) {
		  setTimeout(() => {
			exportExcelSelf("approval-table", "工单详情");
		  }, 0);
	  } else {
		  setTimeout(() => {
			(this.$refs["selectedApprovals"] as any).exportExcelSelf();
		  }, 0);
	  }
	}
}

注意点:
1.当表格数据过长或者小时会丢失(我的截图就是)需要这样做

const wb: any = XLSX.utils.table_to_book(
    document.querySelector(`#${id}`),
    {raw: true}
  );
//row作用是js-xlsx取消自动加工

2.如果你用的element,且固定了列(使用了fix),会遇到导出表格数据重复的问题,这是因为该表格下有两个表格体(查看元素可知)。如何破?要么去除固定,要么参考下面方法(js去除多余表格):
解决表格导出重复问题

最后我是成功了的!!大家放心去试

在HTML页面中实现带有滚动条的element table导出为PDF,可以通过结合使用CSS样式、JavaScript以及PDF生成库来完成。下面是一个基本的实现思路: 1. **HTML结构**:首先需要创建一个table元素,并为其添加滚动条。可以通过设置CSS样式`overflow-y: scroll;`来实现垂直滚动条。 2. **样式设置**:通过CSS对表格进样式设计,确保在生成PDF时表格的样式能够被正确保留。 3. **JavaScript实现滚动**:可以使用JavaScript或jQuery来控制滚动条的为,如自动滚动到特定。 4. **导出为PDF**:使用JavaScript的PDF生成库(如jsPDF或pdfMake)来将带有滚动条的table导出为PDF文件。这个过程通常包括以下步骤: - 创建PDF文档实例。 - 使用库提供的方法将table渲染到PDF上。 - 最终生成并下载PDF文件。 这里提供一个简的代码示例,展示如何使用jsPDF库将table导出为PDF(假设已经有一个带滚动条的table): ```javascript // 引入jsPDF库 var jsPDF = require('jspdf'); // 创建PDF实例 var doc = new jsPDF(); // 获取table的DOM元素 var table = document.getElementById('your-table-id'); // 设置PDF的初始宽度和高度,以适应表格内容 var specialElementHandlers = { '#editor': function (element, renderer) { return true; } }; // 将table添加到PDF中 doc.fromHTML(table.outerHTML, 15, 15, { 'width': 190, 'elementHandlers': specialElementHandlers }); // 保存PDF文件 doc.save('table.pdf'); ``` 注意事项: - 确保在页面加载完成后执导出操作,以便table已经渲染到DOM中。 - 生成PDF时可能需要处理一些布局问题,比如调整字体大小或表格宽度以适应页面尺寸。 - 在实际应用中,可能需要进一步处理以确保PDF中的内容完整性和样式一致性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值