目录

  • 后台代码实现导出excel文件到指定目录(导出)
  • 后台代码实现读指定目录的excel文件(导入)
  • 前端vue实现在浏览器导出excel(导出)
  • 后端代码实现在浏览器导出excel(导出)

首先在pom文件引入依赖

    <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency></dependencies>

后台代码实现导出excel文件到指定目录(导出)

先建一个dog类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog {//    index 表示这个属性是在excel的第几列(从0开始),value 表示在当前列的表头名称@ExcelProperty("狗编号")private Integer dogNo;@ExcelProperty("狗名称")private String dogName;@ExcelProperty("狗年龄")private Integer dogAge;}

然后测试类

import com.alibaba.excel.EasyExcel;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Client {public static void main(String[] args) {//写入的路径String fileName = "D:\\Dog.xlsx";EasyExcel.write(fileName,Dog.class).sheet("狗").doWrite(getLists());}//模仿从后台拿到一个Dog对象的集合 (我生成了5个一样的dog狗)public static List<Dog> getLists(){return Stream.generate(()->new Dog(2,"阿花",28)).limit(5).collect(Collectors.toList());}
}

运行之后会看到路径下有个Dog.xlsx文件,效果如下:

后台代码实现读指定目录的excel文件(导入)

创建EasyListener类

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.Map;public class EasyListener extends AnalysisEventListener<Dog> {//一行一行读取excel内容@Overridepublic void invoke(Dog dog, AnalysisContext analysisContext) {System.out.println("数据"+dog);}//读取表头内容@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {System.out.println("表头:"+headMap);}//读取完之后@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("我读完了");}}

测试类代码:


public class Client {public static void main(String[] args) {//写入的路径String fileName = "D:\\Dog.xlsx";
//        EasyExcel.write(fileName,Dog.class).sheet("狗").doWrite(getLists());EasyExcel.read(fileName,Dog.class,new EasyListener()).sheet("狗").doRead();}//模仿从后台拿到一个Dog对象的集合 (我生成了5个一样的dog狗)public static List<Dog> getLists(){return Stream.generate(()->new Dog(2,"阿花",28)).limit(5).collect(Collectors.toList());}
}

输出结果如下:

前端vue实现在浏览器导出excel(导出)

npm 下载 file-saver 和 xlsx 这两个依赖文件

npm install file-saver@1.3.8 xlsx@0.14.1 --save

导出js文件代码存放在这

Export2Excel.js代码整理好了,copy过去即可

/* eslint-disable */
import { saveAs } from 'file-saver'
import XLSX from 'xlsx'function generateArray(table) {var out = [];var rows = table.querySelectorAll('tr');var ranges = [];for (var R = 0; R < rows.length; ++R) {var outRow = [];var row = rows[R];var columns = row.querySelectorAll('td');for (var C = 0; C < columns.length; ++C) {var cell = columns[C];var colspan = cell.getAttribute('colspan');var rowspan = cell.getAttribute('rowspan');cell.setAttribute('mso-number-format','\@');//mso-number-format:'\@';var cellValue = cell.innerText;if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;//Skip rangesranges.forEach(function (range) {if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);}});//Handle Row Spanif (rowspan || colspan) {rowspan = rowspan || 1;colspan = colspan || 1;ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});};//Handle ValueoutRow.push(cellValue !== "" ? cellValue : null);//Handle Colspanif (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);}out.push(outRow);}return [out, ranges];
};function datenum(v, date1904) {if (date1904) v += 1462;var epoch = Date.parse(v);return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}function sheet_from_array_of_arrays(data, opts) {var ws = {};var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};for (var R = 0; R != data.length; ++R) {for (var C = 0; C != data[R].length; ++C) {if (range.s.r > R) range.s.r = R;if (range.s.c > C) range.s.c = C;if (range.e.r < R) range.e.r = R;if (range.e.c < C) range.e.c = C;var cell = {v: data[R][C]};if (cell.v == null) continue;var cell_ref = XLSX.utils.encode_cell({c: C, r: R});if (typeof cell.v === 'number') cell.t = 'n';else if (typeof cell.v === 'boolean') cell.t = 'b';else if (cell.v instanceof Date) {cell.t = 'n';cell.z = XLSX.SSF._table[14];cell.v = datenum(cell.v);}else cell.t = 's';ws[cell_ref] = cell;}}if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);return ws;
}function Workbook() {if (!(this instanceof Workbook)) return new Workbook();this.SheetNames = [];this.Sheets = {};
}function s2ab(s) {var buf = new ArrayBuffer(s.length);var view = new Uint8Array(buf);for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;return buf;
}export function export_table_to_excel(id) {var theTable = document.getElementById(id);var oo = generateArray(theTable);var ranges = oo[1];/* original data */var data = oo[0];var ws_name = "SheetJS";var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);/* add ranges to worksheet */// ws['!cols'] = ['apple', 'banan'];ws['!merges'] = ranges;/* add worksheet to workbook */wb.SheetNames.push(ws_name);wb.Sheets[ws_name] = ws;var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}export function export_json_to_excel({header, data, filename='excel-list', autoWidth=true}={}) {/* original data */data=[...data]data.unshift(header);var ws_name = "SheetJS";var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);if(autoWidth){/*设置worksheet每列的最大宽度*/const colWidth = data.map(row => row.map(val => {/*先判断是否为null/undefined*/if (val == null) {return {'wch': 10};}/*再判断是否为中文*/else if (val.toString().charCodeAt(0) > 255) {return {'wch': val.toString().length * 2};} else {return {'wch': val.toString().length};}}))/*以第一行为初始值*/let result = colWidth[0];for (let i = 1; i < colWidth.length; i++) {for (let j = 0; j < colWidth[i].length; j++) {if (result[j]['wch'] < colWidth[i][j]['wch']) {result[j]['wch'] = colWidth[i][j]['wch'];}}}ws['!cols'] = result;}/* add worksheet to workbook */wb.SheetNames.push(ws_name);wb.Sheets[ws_name] = ws;var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), filename + ".xlsx");
}

在utils下建一个公共的导出js,代码也整理好了

/*
* @method 表格数据导出excel
* @param {object} option 参数配置
*   @params {array} tHeader 表头文字 默认 []
*   @params {array} filterVal 对应字段名 默认 []
*   @params {array} table 表格数据 默认 []
*   @params {string} fileName 导出excel文件名 默认 excel-file
* @param {function} 导出成功回调
* */const formatJson = (filterVal, jsonData) => {return jsonData.map(v => filterVal.map(j => v[j]))
}export const exportFile = (option = {}, cb) => {import('@/vendor/Export2Excel').then(excel => {const tHeader = option.tHeader || [] // 对应表格输出的titleconsole.log(tHeader);const filterVal = option.filterVal || []const table = option.table || []const data = formatJson(filterVal, table)// const autoWidth = option.autoWidth || true //列宽是否自适应const autoWidth = option.autoWidth == undefined ? true : option.autoWidth //列宽是否自适应excel.export_json_to_excel({header: tHeader,data,filename: option.fileName || 'excel-file',autoWidth:autoWidth})cb && cb()})
}

然后在vue页面加导出按钮

<el-button size="mini" icon="el-icon-download" type="primary" @click="exportData" :loading="exportLoading">导出</el-button>

引入

  import { exportFile } from "@/utils/exportExcel"; //导出import moment from 'moment';

在data加

exportLoading:false

在methods里

//导出exportData(){this.exportLoading = truelet list = [{dogNo:2,dogName:"阿花",dogAge:28},{dogNo:3,dogName:"阿花1",dogAge:3},{dogNo:4,dogName:"阿花2",dogAge:5},{dogNo:5,dogName:"阿花3",dogAge:9},]console.log(list)this.exportExcel(list)},exportExcel(table) {  //导出模板和参数列名const option = {tHeader: ["狗编号","狗名称","狗年龄",],filterVal: ["dogNo","dogName","dogAge",],table: table,fileName: "狗" + moment().format('YYYY-MM-DD HH_mm_ss')};exportFile(option, () => {this.exportLoading = false;});},

浏览器效果:

后端代码实现在浏览器导出excel(导出)

新建一个springboot项目,用mybatisplus先搭好框架。
然后添加依赖

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.6</version></dependency>

这里我把核心代码都放到controller上写,其它的都是spring boot + mybatisPlus的简单的搭建

package com.cjw.cjwExport.contoller;import com.cjw.cjwExport.model.Student;
import com.cjw.cjwExport.service.ExportService;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;@RestController
@RequestMapping("/Export")
public class ExportController {@Autowiredprivate ExportService exportService;@RequestMapping("/test01")@GetMappingpublic void exportTest01(HttpServletResponse response){exportService.exportTest01();System.out.println("=====export====");List<Student> list = exportService.list();   //做一个简单的查询// Excel标题String[] title = {"id", "课程id", "标题", "课本","时间"};// Excel文件名String fileName =  "测试.xls";// sheet名String sheetName = "测试1";// 将数据放到数组中String[][] content = new String[list.size()][title.length];for (int i = 0; i < list.size(); i++) {Date date = new Date();SimpleDateFormat dateFormat = new SimpleDateFormat("y-M-d H:m:s");String format = dateFormat.format(date);Student monthReportModel = list.get(i);content[i][0] = monthReportModel.getId();content[i][1] = monthReportModel.getCourseId();content[i][2] = monthReportModel.getTitle();content[i][3] = monthReportModel.getSort().toString();content[i][4] = format;}// 导出Exceltry {HSSFWorkbook hssfWorkbook = getHSSFWorkbook(sheetName, title, content, null);fileName = new String(fileName.getBytes(), "ISO8859-1");response.setContentType("application/octet-stream;charset=ISO8859-1");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);response.addHeader("Pargam", "no-cache");response.addHeader("Cache-Control", "no-cache");OutputStream outputStream = response.getOutputStream();hssfWorkbook.write(outputStream);outputStream.flush();outputStream.close();} catch (Exception e) {e.printStackTrace();}}public HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook workbook) {// 创建一个HSSFWorkbook,对应一个Excel文件if (workbook == null) {workbook = new HSSFWorkbook();}// 在workbook中添加一个sheet,对应Excel文件中的sheetHSSFSheet sheet = workbook.createSheet(sheetName);// 在sheet中添加表头第0行HSSFRow row = sheet.createRow(0);// 创建单元格,并设置值表头 设置表头居中HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 声明列对象HSSFCell cell = null;// 创建标题for (int i = 0; i < title.length; i++) {cell = row.createCell(i);cell.setCellValue(title[i]);cell.setCellStyle(cellStyle);}// 创建内容for (int i = 0; i < values.length; i++) {row = sheet.createRow(i + 1);for (int j = 0; j < values[i].length; j++) {// 将内容按顺序赋给对应的列对象row.createCell(j).setCellValue(values[i][j]);}}return workbook;}}

在浏览器输入地址测试:

结果:

Excel导入和导出相关推荐

  1. C# Excel导入、导出

    C# Excel导入.导出 本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含 ...

  2. C# Excel导入与导出

    Excel的结构     1.Workbook工作簿(也就是文件)     2.Sheet(也就是一个表)     3.Row(也就是一个数据行)     4.Cell(单元格)     5.Valu ...

  3. 大数据量的Excel导入和导出

    大数据量的Excel导入和导出 涉及到的技术 poi:使用SXSSFWorkbook,对数据进行分页且批量写入到磁盘(可以是任何outputsteam),减少数据在内存中的存储 easyExcel:从 ...

  4. 前端实现 Excel 导入和导出功能

    注意:Excel的导入.导出功能一般情况下都是服务端完成,这里只是记录一下前端实现方法,供小众场景使用. 这里的实现要依赖第三方库:xlsx. 兼容性:IE9+ 安装 xlsx npm i -S ht ...

  5. 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出

    场景 使用若依前后端分离版实现Excel的导入和导出. 前端:Vue+ElementUI 后端:SpringBoot+POI+Mysql 注: 博客: https://blog.csdn.net/ba ...

  6. 使用POI和EasyExcel实现Excel导入和导出功能

    需求场景 开发中经常会设计到excel的处理,需求场景如下所示: 1.将用户信息导出为excel表格(导出数据) 2.将Excel表中的信息录入到数据库中(导入数据) 操作Excel目前比较流行的就是 ...

  7. Java Excel导入和导出(支持xls导入,xlsx导入,图片导出,百万数据量导出)

    免费源码下载(提取码:qdhy) 工程结构目录 所需JAR包 <dependencies><!-- JUNIT 测试 --><dependency><grou ...

  8. ThinkPHP6 的Excel导入与导出

    Excel导入导出功能我们经常用到,下面记录自己的实现方法.Helper类PHPExcelHelper 可以直接拿过来使用.在控制器中实现数据组装,model中实现数据验证,最后导入或导出. help ...

  9. C#Excel导入和导出

    Excel导入 一.在WEB中导入Excel的方法 方法1: 通过OleDB方式获取Excel文件的数据到DataSet中,然后将Dataset中的每笔记录插入到SQL Server using Sy ...

  10. 可以实现一个前端的 Excel 导入和导出功能吗?

    点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流 前言 [**负责人 A]:现在报表部分基于接口的 Excel 的导入和导出功能有点慢,前端这边能不能实现一下这个功能,然后我们在比对看看效果 ...

最新文章

  1. [zz]lxc使用tc+tbf限制网速
  2. 要成为一个成熟的软件工程师不容易啊
  3. iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求
  4. Python_str 的内部功能介绍
  5. Navicat Premium 怎么安装比较快
  6. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
  7. pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
  8. WEB消息推送-comet4j
  9. 阿里云工程师用机器学习破解雾霾成因
  10. python 进行一元线性回归并输出相关结果_荐一元线性回归利用最小二乘法求解原理代码及案例...
  11. jvm初体验:堆溢出处理
  12. java stream, LIST ,ArrayList常用操作
  13. SQLMAP安装及使用教程
  14. 几类常用Case工具介绍(有点老,但还是具有参考性,对应找较新版本就是了)...
  15. c.cnzz.com core.php,谷歌浏览器下cnzz统计代码报错被拦截
  16. Android自定义圆角矩形图片ImageView
  17. PHP微信扫码关注公众号并登录
  18. 分布式事务框架lcn入门demo
  19. 残差(residual)
  20. UE4 AndroidSDK配置

热门文章

  1. 前端重新部署如何通知用户刷新网页?
  2. 在字节跳动工作是一种什么样的体验?
  3. display:flex垂直居中
  4. 宾语从句it做形式主语的句子
  5. iOS Core Image 复杂的滤镜
  6. 在线教育大数据营销平台实战(四):CRM线索生命周期及用户画像构建
  7. 手机测试陨石软件,不用仪器检测,肉眼就能教你辨别你手上的陨石!
  8. 微信小程序—史上最全78种炫到爆的自定义动画
  9. WebSocket实现消息推送
  10. spring webmvc原理