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

ITgirl范范

以上是关于Excel文件导入导出功能的主要内容,如果未能解决你的问题,请参考以下文章

Excel文件导入导出功能

Laravel Excel 实现 Excel-CSV 文件导入导出功能

vue导出+导入功能

laravel框架excel 的导入导出功能

使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

Java后端实现Excel导入导出功能