Excel导入和导出
目录
- 后台代码实现导出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导入和导出相关推荐
- C# Excel导入、导出
C# Excel导入.导出 本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含 ...
- C# Excel导入与导出
Excel的结构 1.Workbook工作簿(也就是文件) 2.Sheet(也就是一个表) 3.Row(也就是一个数据行) 4.Cell(单元格) 5.Valu ...
- 大数据量的Excel导入和导出
大数据量的Excel导入和导出 涉及到的技术 poi:使用SXSSFWorkbook,对数据进行分页且批量写入到磁盘(可以是任何outputsteam),减少数据在内存中的存储 easyExcel:从 ...
- 前端实现 Excel 导入和导出功能
注意:Excel的导入.导出功能一般情况下都是服务端完成,这里只是记录一下前端实现方法,供小众场景使用. 这里的实现要依赖第三方库:xlsx. 兼容性:IE9+ 安装 xlsx npm i -S ht ...
- 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出
场景 使用若依前后端分离版实现Excel的导入和导出. 前端:Vue+ElementUI 后端:SpringBoot+POI+Mysql 注: 博客: https://blog.csdn.net/ba ...
- 使用POI和EasyExcel实现Excel导入和导出功能
需求场景 开发中经常会设计到excel的处理,需求场景如下所示: 1.将用户信息导出为excel表格(导出数据) 2.将Excel表中的信息录入到数据库中(导入数据) 操作Excel目前比较流行的就是 ...
- Java Excel导入和导出(支持xls导入,xlsx导入,图片导出,百万数据量导出)
免费源码下载(提取码:qdhy) 工程结构目录 所需JAR包 <dependencies><!-- JUNIT 测试 --><dependency><grou ...
- ThinkPHP6 的Excel导入与导出
Excel导入导出功能我们经常用到,下面记录自己的实现方法.Helper类PHPExcelHelper 可以直接拿过来使用.在控制器中实现数据组装,model中实现数据验证,最后导入或导出. help ...
- C#Excel导入和导出
Excel导入 一.在WEB中导入Excel的方法 方法1: 通过OleDB方式获取Excel文件的数据到DataSet中,然后将Dataset中的每笔记录插入到SQL Server using Sy ...
- 可以实现一个前端的 Excel 导入和导出功能吗?
点击上方 前端Q,关注公众号 回复加群,加入前端Q技术交流 前言 [**负责人 A]:现在报表部分基于接口的 Excel 的导入和导出功能有点慢,前端这边能不能实现一下这个功能,然后我们在比对看看效果 ...
最新文章
- [zz]lxc使用tc+tbf限制网速
- 要成为一个成熟的软件工程师不容易啊
- iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求
- Python_str 的内部功能介绍
- Navicat Premium 怎么安装比较快
- Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
- pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
- WEB消息推送-comet4j
- 阿里云工程师用机器学习破解雾霾成因
- python 进行一元线性回归并输出相关结果_荐一元线性回归利用最小二乘法求解原理代码及案例...
- jvm初体验:堆溢出处理
- java stream, LIST ,ArrayList常用操作
- SQLMAP安装及使用教程
- 几类常用Case工具介绍(有点老,但还是具有参考性,对应找较新版本就是了)...
- c.cnzz.com core.php,谷歌浏览器下cnzz统计代码报错被拦截
- Android自定义圆角矩形图片ImageView
- PHP微信扫码关注公众号并登录
- 分布式事务框架lcn入门demo
- 残差(residual)
- UE4 AndroidSDK配置