下载模板Excel 上传Excel导入数据库

/**
* @author
* @create
* @desc 下载值班人员模板Excel
**/
@GetMapping("/downDutyTemplate")
@AnonymousAccess
public void downDutyTemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
String templatePath = "templates" + File.separator + "duty.xls";//templates是resources下文件夹名称 duty.xls是此文件夹下的文件 如下图

      

        InputStream is = this.getClass().getClassLoader().getResourceAsStream(templatePath);
String fileName = URLEncoder.encode("duty.xls", StandardCharsets.UTF_8.toString());
FileUtil.setHeader(request,response,fileName);
FileUtil.downloadFile(response,is);
}



/**
* @author
* @create 2021/12/17 14:25
* @desc 上传值班人员模板Excel
**/
@PostMapping("/importDutyTemplate")
@AnonymousAccess
public Object importDutyTemplate(@RequestParam("file") MultipartFile file) throws Exception {
List<DutyTemplateDto> list = new ArrayList<>();
Map<String,Object> map = new HashMap<>();
try {
InputStream is = file.getInputStream();
list = EasyExcelUtil.readExcelWithModel(is, DutyTemplateDto.class, ExcelTypeEnum.XLS,1,1);//文档内容转为list
if(list != null && list.size() > 0){
dutyService.addDutyList(list);//插入数据库操作
}
} catch (Exception e) {
map.put("code",500);
map.put("msg","上传失败");
return map;
}
map.put("code",200);
map.put("msg","上传成功");
return map;
}


下面为EasyExcelUtil工具类的内容
package cn.aicas.bigscreen.common;

/**
* @author
* @create 2019/5/6 15:33
**/

import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.Table;
import com.alibaba.excel.support.ExcelTypeEnum;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
* @version V1.0
* @author: lin_shen
* @date: 2018/9/26
* @Description: TODO
*/
public class EasyExcelUtil {

/**
* StringList 解析监听器
*/
private static class StringExcelListener extends AnalysisEventListener {
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<List<String>> datas = new ArrayList<>();

/**
* 每解析一行都会回调invoke()方法
*
* @param object
*/
@Override
public void invoke(Object object, AnalysisContext analysisContext) {
List<String> stringList = (List<String>) object;
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(stringList);
//根据自己业务做处理
}

@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//解析结束销毁不用的资源
//注意不要调用datas.clear(),否则getDatas为null
}

public List<List<String>> getDatas() {
return datas;
}

public void setDatas(List<List<String>> datas) {
this.datas = datas;
}
}

/**
* 使用 StringList 来读取Excel
*
* @param inputStream Excel的输入流
* @param excelTypeEnum Excel的格式(XLS或XLSX)
* @return 返回 StringList 的列表
*/
public static List<List<String>> readExcelWithStringList(InputStream inputStream, ExcelTypeEnum excelTypeEnum) {
StringExcelListener listener = new StringExcelListener();
ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
excelReader.read();
return listener.getDatas();
}

/**
* 使用 StringList 来写入Excel
*
* @param outputStream Excel的输出流
* @param data 要写入的以StringList为单位的数据
* @param table 配置Excel的表的属性
* @param excelTypeEnum Excel的格式(XLS或XLSX)
*/
public static void writeExcelWithStringList(OutputStream outputStream, List<List<String>> data, Table table, ExcelTypeEnum excelTypeEnum) {
//这里指定不需要表头,因为String通常表头已被包含在data里
ExcelWriter writer = new ExcelWriter(outputStream, excelTypeEnum, false);
//写第一个sheet, sheet1 数据全是List<String> 无模型映射关系,无表头
Sheet sheet1 = new Sheet(0, 0);
writer.write0(data, sheet1, table);
writer.finish();
}

/**
* 模型 解析监听器
*/
private static class ModelExcelListener extends AnalysisEventListener {

private List<Object> datas = new ArrayList<>();

@Override
public void invoke(Object object, AnalysisContext context) {
datas.add(object);
}

@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}

public List<Object> getDatas() {
return datas;
}

public void setDatas(List<Object> datas) {
this.datas = datas;
}
}

/**
* 模型 泛型解析监听器
*/
private static class ModelExcelListenerT<T> extends AnalysisEventListener {

private List<T> datas = new ArrayList<>();

@Override
public void invoke(Object object, AnalysisContext context) {
datas.add((T)object);
}



@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}

public List<T> getDatas() {
return datas;
}

public void setDatas(List<T> datas) {
this.datas = datas;
}
}


/**
* 使用 模型 来读取Excel
*
* @param inputStream Excel的输入流
* @param clazz 模型的类
* @param excelTypeEnum Excel的格式(XLS或XLSX)
* @return 返回 模型 的列表(为object列表,需强转)
*/
public static List<Object> readExcelWithModel(InputStream inputStream, Class<? extends BaseRowModel> clazz, ExcelTypeEnum excelTypeEnum) throws IOException {
// isExcel2003(inputStream);
// 解析每行结果在listener中处理
ModelExcelListener listener = new ModelExcelListener();
ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
//默认只有一列表头
excelReader.read(new Sheet(1, 1, clazz));
return listener.getDatas();

}

/**
* 使用 模型 来读取Excel
*
* @param inputStream Excel的输入流
* @param clazz 模型的类
* @param excelTypeEnum Excel的格式(XLS或XLSX)
* @param sheetNo 读取的sheet页码
* @param headLineNum 读取的列表起始行数
* @return 返回 模型 的列表(为object列表,需强转)
* @throws IOException
*/
public static <T> List<T> readExcelWithModel(InputStream inputStream, Class<? extends BaseRowModel> clazz, ExcelTypeEnum excelTypeEnum, int sheetNo, int headLineNum) throws IOException {
// isExcel2003(inputStream);
// 解析每行结果在listener中处理
ModelExcelListenerT<T> listener = new ModelExcelListenerT<T>();
ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
//默认只有一列表头
excelReader.read(new Sheet(sheetNo, headLineNum, clazz));
return listener.getDatas();
}

/**
* 使用 模型 来写入Excel
*
* @param outputStream Excel的输出流
* @param data 要写入的以 模型 为单位的数据
* @param table 配置Excel的表的属性
* @param clazz 模型的类
* @param excelTypeEnum Excel的格式(XLS或XLSX)
*/
public static void writeExcelWithModel(OutputStream outputStream, List<? extends BaseRowModel> data, Table table, Class<? extends BaseRowModel> clazz, ExcelTypeEnum excelTypeEnum) {
//这里指定需要表头,因为model通常包含表头信息
ExcelWriter writer = new ExcelWriter(outputStream, excelTypeEnum, true);
//写第一个sheet, sheet1 数据全是List<String> 无模型映射关系
Sheet sheet1 = new Sheet(1, 0, clazz);
writer.write(data, sheet1, table);
writer.finish();
}

/** !!!与读取Excel方法使用会报InvalidFormatException: Package should contain a content type part [M1.13]
* 判断excel版本不能通过文件后缀名来区分,如果将.xlsx文件直接改名是.xls,java后台读取文件时是根据流的信息头来判断版本的不是后缀名
* 当excel是2003时
* is是文件的InputStream
* @param is excel数据流
* @return
*/
/*public static ExcelTypeEnum isExcel2003(InputStream is) throws IOException {
ExcelTypeEnum isExcel2003 = null;
if(!is.markSupported()) {
is = new PushbackInputStream(is, 8);
}
if(POIFSFileSystem.hasPOIFSHeader(is)) {
isExcel2003 = ExcelTypeEnum.XLS;
System.out.println("2003及以下");
}
if(POIXMLDocument.hasOOXMLHeader(is)) {
isExcel2003 = ExcelTypeEnum.XLSX;
System.out.println("2007及以上");
}
return isExcel2003;
}*/

}
posted @ 2021-12-20 09:57  老婆爱榴莲  阅读(225)  评论(0)    收藏  举报