导出的excel中嵌入图片,同时还需要操作多个工作表与表格样式, 看了一些java的插件不太适合,因为我这边的需求是动态表单,字段不固定。后端的插件大部分依赖实体类注解,要不就是操作比较繁琐。又看了一些Vue导出excel的插件。大部分功能不全,不满足手里的需求。
无意中发现了Excel.js这个工具功能还是比较全,我在他的基础上做了二次封装。方便了数据的传入、格式的设置。其实还有很多功能是可以扩展的,后期再完善吧。
目前已实现功能:
1、可以增加工作表
2、可以指定图片列,并嵌入图片
3、指定头部样式
1、先下载依赖: cnpm install exceljs file-saver -S;
2、使用说明:
## 自定义封装的Excel导出,支持增加工作表、嵌入图片 =======@杨华--2023_01_10==========
## 基于exceljs二次封装,支持exceljs的所有接口
## cnpm install exceljs file-saver -S;
<!-- 格式要求 -->
# 标题行
let column = [
{
title: '维修内容',
key: '维修内容',
type: 'text'
},
{
title: '维修图',
key: '维修图',
type: 'image',
width: 200,
height: 250
}
]
# 内容格式 --ps:键需与标题行的key一致
let data = [
{
'维修内容': '2022年维修EPS',
'维修图': 'http://url/name.jpg',
}
]
# 使用教程
1、 import {createWorkBook,exportStatics,downloadWorkBook} from "@/utils/Excel/excel.js";
2、 # 创建工作簿
let workbook = createWorkBook();//初始化基本属性
# 创建工作表,可多次创建
let worksheet = workbook.addWorksheet('自定义工作表名');
workbook = await exportStatics(workbook,worksheet,column,data);
# 下载Excel
downloadWorkBook(workbook,'自定义文件名');
3、封装代码如下:
import Excel from "exceljs";
import * as FileSaver from "file-saver";//用于客户端读写数据
// 传入工作簿、工作表、表头、数据。
export function exportStatics(workbook,worksheet,heard,tableData) {
// 一、创建工作簿
// let workbook = new Excel.Workbook();
// setWorkbook(workbook);//初始化基本属性
// 二、创建工作表
// let worksheet = workbook.addWorksheet("sheet1");
// 表头===================================================================================
handleTitle(worksheet,heard);
// 插入表格内容数据================================================================================
handleContent(worksheet,heard,tableData);
// 处理图片==================================================================================
await handleImage(workbook,worksheet,heard,tableData);
return workbook;
};
// 处理表头===========================
function handleTitle(worksheet,heard){
// const listHearder = Object.keys(heard);
// 按行的格式插入表头
worksheet.insertRow(
1,// 行的位置
heard.map(item =>{ return item.title; })//表头组成的数组
);
// =====设置样式=====
//设置标题行的填充颜色,此处可扩展
worksheet.getRow(1).fill = {
type: 'pattern',
pattern:'darkTrellis',
fgColor:{argb:'EDEDED'},
bgColor:{argb:'EDEDED'}
};
//设置行居中
worksheet.getRow(1).height =25;//设置行高度---下标从1开始;
worksheet.getRow(1).alignment = { vertical: 'middle', horizontal: 'center' };
}
// 处理数据内容=======================
function handleContent(worksheet,heard,tableData){
tableData.forEach((item, index) => {
worksheet.insertRow(
index + 2,//从