Excel文件导入导出功能
Posted 张亮java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Excel文件导入导出功能相关的知识,希望对你有一定的参考价值。
package org.jeecg.common.util; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DatePattern; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.WriteTable; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.PropertyUtils; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.Workbook; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; import org.jeecgframework.poi.excel.ExcelExportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.enmus.ExcelType; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * 导出返回信息 */ @Slf4j @RefreshScope public class EasyExcelUtils public static <T> ModelAndView exportXlsByData(HttpServletRequest request, List<T> pageList, Class<T> clazz, String title) // Step.1 组装查询条件 LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); // Step.2 获取导出数据 List<T> exportList = pageList; // 过滤选中数据 String selections = request.getParameter("selections"); if (oConvertUtils.isNotEmpty(selections)) List<String> selectionList = Arrays.asList(selections.split(",")); if(Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getName().equals("id")).collect(Collectors.toList()).size()>0) exportList = pageList.stream().filter(item -> selectionList.contains(getId(item))).collect(Collectors.toList()); else exportList = pageList; else exportList = pageList; // Step.3 AutoPoi 导出Excel ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); mv.addObject(NormalExcelConstants.FILE_NAME, title); //此处设置的filename无效 ,前端会重更新设置一下 mv.addObject(NormalExcelConstants.CLASS, clazz); //update-begin--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置-------------------- ExportParams exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title); //update-end--Author:liusq Date:20210126 for:图片导出报错,ImageBasePath未设置---------------------- mv.addObject(NormalExcelConstants.PARAMS,exportParams); mv.addObject(NormalExcelConstants.DATA_LIST, exportList); return mv; private static <T> String getId(T item) try return PropertyUtils.getProperty(item, "id").toString(); catch (Exception e) e.printStackTrace(); return null; public <T> void exportXlsByData(HttpServletResponse response, String tableName, List<T> list, Class<T> clazz) String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern(DatePattern.PURE_DATETIME_PATTERN)); String excelName = tableName + "-" + dateStr + ".xlsx"; try (OutputStream outputStream = response.getOutputStream()) response.setContentType("application/octet-stream;charset=UTF-8"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(excelName, "UTF-8")); response.addHeader("Pragma", "no-cache"); response.addHeader("Cache-Control", "no-cache"); EasyExcel.write(outputStream, clazz) // 设置单元格宽度自适应 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 设置单元格高度和字体 //.registerWriteHandler(getHeightAndFontStrategy()) .sheet(excelName) .doWrite(list); outputStream.flush(); log.info("下载条记录到文件", list.size(), excelName); catch (IOException e) log.warn("导出"+tableName+"表格失败", e); public static <T> void createExcelData(List<T> list, Class<T> clazz, String fileName,String ctxPath) //指定文件 //多个map,对应了多个sheet List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>(); Date start = new Date(); if(oConvertUtils.listIsNotEmpty(list))// 存在vulnerabilityList的情况 Map<String, Object> map = new HashMap<String, Object>(); ExportParams exportParams=new ExportParams( "报表", "导出人:系统管理员" , "报表"); exportParams.setType(ExcelType.XSSF); map.put("title",exportParams);//表格Title map.put(NormalExcelConstants.PARAMS,exportParams);//表格Title map.put(NormalExcelConstants.CLASS,clazz);//表格对应实体 map.put(NormalExcelConstants.DATA_LIST, list);//数据集合 listMap.add(map); File file = new File(ctxPath + File.separator + "excel" + File.separator ); try String os = System.getProperty("os.name"); if (!file.exists()) if(os.contains("Windows")) file.createNewFile(); else file.setWritable(true, false); file.mkdirs(); String savePath = file.getPath() + File.separator + fileName; File saveFile = new File(savePath); Workbook workbook = ExcelExportUtil.exportExcel(listMap,ExcelType.XSSF); FileOutputStream out = new FileOutputStream(saveFile); workbook.write(out);//保存Excel文件 out.close();//关闭文件流 workbook.close(); catch (IOException e) e.printStackTrace(); log.info("创建了excel+++++++++++++++++++++++++++++++++++++"+fileName); public static void createExcelData(String filename, Map<String, Object> map) Date start = new Date(); Random random=new Random(); String fileName = "D:/opt/upFiles/excel/alibaba.test"+random.nextInt()+".xlsx"; //指定文件 ExcelWriter excelWriter = EasyExcel.write(fileName).build(); int i = 0; for (String sheetName : map.keySet()) List<T> list = (List<T>) Convert.toList(map.get(sheetName)); //构建表1 WriteSheet sheet = EasyExcel.writerSheet(i, sheetName).build(); WriteTable table = EasyExcel.writerTable(i).head(T.class).needHead(true).build(); excelWriter.write(list, sheet, table); i++; list.clear(); /// 千万别忘记finish 会帮忙关闭流 excelWriter.finish(); System.out.println("生成预警数据完成时间:"+(new Date().getTime() - start.getTime()));
excel 导入导出测试点
目前,为方便操作,很多系统都会增加批量导入导出的功能。文件导入导出一般格式都是excel。由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel导入导出功能测试起来都较为繁杂。现将常用设计用例总结如下。
批量导入
一、模板检查测试
一般excel导入功能,都会提供模板下载功能。
1、模板只有一个文件
模板只有一个文件时,比较简单,检查一下模板和预期是否一致即可。
2、模板是一个压缩包
模板是压缩包时,需要检查一下压缩包中文件是否齐全,每一个文件和预期是否一致。
注意:如果产品制作压缩包或者模板时,使用的是mac,请注意在Windows机器上检查一下文件,是否有多余。【因为解析原因,容易多一个无用的文件】
3、文件打开格式
excel打开目前支持excel和wps两种打开方式,需要确认这两种方式打开excel模板显示要一致。
二、内容校验
1、必填项检查
包括必填项不填,必填项部分不填,必填项全部填写几种情况。
2、选择项
包括不选择、选择其中一个、新增一个选项、尝试输入其他字符等。
3、填写内容格式检查
如要求整数、要求数字、要求字符、选择项、字符长度检查等。
4、内容为空检查
包含excel文件有很多行数据,其中某一行全部为空,某几行为空;某一行中间某个字段为空;excel文件只有表头;excel文件无任何数据。
5、新增一行数据,然后将数据删除【如果开发判断方法有误,会认为删除的这条数据也存在】
6、excel数据量检查
excel文件中数据量可以接受最大值是多少。如果数据量较大时,后台处理时,页面如何显示?后台的处理是单线程还是多线程?处理时间较长时,是否会影响系统其他功能?对数据库造成的压力会有多大?这些问题都需要和开发确认,至少开发应该考虑到这种极限情况,进行相应的处理。
三、文件导入
1、错误提示
如果excel中某一行或者某一字段格式不对或者数据为空,则需要和策划确认是否提示到具体的字段。最终需要保证提示文案友好。
2、导入其他格式的文件
系统应判断出格式不对,根据具体要求提示相应文案,例如文件格式不对等。
3、重复导入相同的文件
需确认是否允许导入?如果允许数据将如何处理?比如覆盖或者忽略?
4、excel用excel和wps两种软件编辑后导入
如果开发使用的方法不对,会识别不了wps编辑的excel文件,需确认是否支持wps软件的编辑。
5、不使用下载的模板,自己新建excel导入
自己手动新建excel或者对其他excel进行修改,使excel格式和模板一致,这种情况下数据填写正确的话,应可以正确的导入系统。
6、表头检查:包括去掉、修改、新增列、列之间切换等
批量导出
一、导出excel格式检查
1、导出的excel格式是否符合预期
2、excel中各字段是否正确。
3、导出的excel文件名是否有要求。如果有要求,是否正确。
4、不同浏览器导出的excel文件是否一致。
二、数据检查
1、选择数据为空时是否可以导出。
2、数据量较少时的导出检查。
3、excel导出时数据的分页检查。【一般数据量较大时,开发都会分批次去取数据,分页时容易出现问题】
4、数据量很大时,系统是否会出现问题,导出的时间检查,以及对系统其他功能的影响。
来自:http://www.51testing.com/?1510488
以上是关于Excel文件导入导出功能的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Excel 实现 Excel-CSV 文件导入导出功能