带样式的文本、表格、echarts图导出到word中整理思路梳理

年前一个需求扔了过来,需要把页面展示的文本、表格、echats图、等等,按照页面展示的样子导出到word中,还要纯前端玩,不能走后端返回。需求就是圣旨无奈的开始了各种百度+api的尝试。

一、首先尝试jquery+FileSaver+wordexport的方案

参考demo:wordExport 导出页面word文档格式 - 简书

按照demo操作,可以导出页面上的文字和表格,echarts图无法显示,样式还必须写在行内,否则无法生效。

二、 html-docx-js + raw-loader + raw-loader 方案

安装相关的组件

npm install --save html-docx-js  组装html结构 

npm install --save file-saver 导出到word

npm install --save raw-loader 解决样式引入问题,

参考demo:html导出docx文件_100斤的狗的博客-CSDN博客_html-docx

引入需要的组件

import htmlDocx from 'html-docx-js/dist/html-docx';

import saveAs from 'file-saver';

import reportCss from "raw-loader!./toWord.css.txt";需要创建一个存放css的txt文件(文件中每个容器的class只能有一个,多个class测试时不支持)

实际操作完整代码如下:

<template>
  <div class="creat-dom">
    <div v-for="(item, index) in listDatas" :key="index">
      <div
        v-if="item.type == 0" >
        {{ item.html }}
      </div>
      <!-- 表格 -->
      <div v-if="item.type == 1" class="table-div">
        <p class="headers">表头</p>
        <table border="1" class="table-div">
          <tr>
            <th>表头</th>
            <th>表头</th>
          </tr>
          <tr>
            <td>内容</td>
            <td>内容</td>
          </tr>
        </table>
      </div>
      <!-- echarts图 -->
      <div v-if="item.type == 2 ">
        <img :src="item.url" />
      </div>
      <!-- 图片 -->
      <div v-if="item.type == 3">
        <img :src="item.image" />
      </div>
    </div>
  </div>
</template>
import htmlDocx from "html-docx-js/dist/html-docx";
import saveAs from "file-saver";
import reportCss from "raw-loader!./toWord.css.txt"; // 解决word中的样式

export default {
  name: "webTextToWord",
  props: {
    domDatas: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      listDatas: [],
    };
  },
  methods: {
    /* 点击“导出”进行下载
     */
    async toWordHandle() {
      this.listDatas = JSON.parse(JSON.stringify(this.domDatas));

      let flagment = document.getElementById("toWordRef").innerHTML;

      var page = `<!DOCTYPE html>
                    <html>
                      <head>
                      <meta charset="UTF-8">
                      <style>${reportCss}</style>
                      </head>
                      <body>
                        <div class="web-text-to-word">
                        ${flagment}
                        </div>
                      </body>
                    </html>`;

      var converted = htmlDocx.asBlob(page);
      saveAs(converted, "test.docx");

      this.$emit("downloadFinish");
    },
  },

导出时文字和表格能正常导出,把echarts图转为base64后仍然卡死,不能显示。

陷入沉思……

经提醒,发现导出时echarts图还没有渲染完成!翻阅echartsAPI,使用on来监听渲染情况。开始使用了render,可以导出图片到word中,但是echarts会被执行多次,换成finished后终于成功导出了带样式的word文档。

render和finished的区别可以参数:echarts图表渲染后执行某一个方法_weixin_33953249的博客-CSDN博客

this.$nextTick(() => {
  this.chartDom = this.$refs.echarts;
  this.myChart = this.$echarts.init(this.chartDom);
  this.option && this.myChart.setOption(this.option);

  this.myChart.on("finished", () => {
     this.base64URL = this.myChart.getDataURL();
     this.$emit("base64UrlFa", this.base64URL);
   });
});

到此导出的需求终于完美实现了!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将前端echarts导出到后端java代码的excel表格,你需要使用Java Excel API,以下是一些示例代码: 1. 首先,你需要在pom.xml文件添加以下依赖项: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建一个Excel工作簿,并在其创建一个工作表: ``` Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); ``` 3. 创建标题行并设置单元格样式: ``` Row headerRow = sheet.createRow(0); CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setAlignment(HorizontalAlignment.CENTER); headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); headerCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); headerCellStyle.setBorderBottom(BorderStyle.THIN); headerCellStyle.setBorderLeft(BorderStyle.THIN); headerCellStyle.setBorderRight(BorderStyle.THIN); headerCellStyle.setBorderTop(BorderStyle.THIN); Font headerFont = workbook.createFont(); headerFont.setBold(true); headerCellStyle.setFont(headerFont); Cell headerCell = headerRow.createCell(0); headerCell.setCellValue("标题"); headerCell.setCellStyle(headerCellStyle); ``` 4. 创建数据行并设置单元格样式: ``` Row dataRow = sheet.createRow(1); CellStyle dataCellStyle = workbook.createCellStyle(); dataCellStyle.setAlignment(HorizontalAlignment.CENTER); dataCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); dataCellStyle.setBorderBottom(BorderStyle.THIN); dataCellStyle.setBorderLeft(BorderStyle.THIN); dataCellStyle.setBorderRight(BorderStyle.THIN); dataCellStyle.setBorderTop(BorderStyle.THIN); Cell dataCell = dataRow.createCell(0); dataCell.setCellValue("数据"); dataCell.setCellStyle(dataCellStyle); ``` 5. 将工作簿写入文件: ``` FileOutputStream outputStream = new FileOutputStream("example.xlsx"); workbook.write(outputStream); outputStream.close(); workbook.close(); ``` 以上就是一个简单的将echarts导出到Excel表格的示例代码,你可以根据自己的需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值