使用easypoi 最原始的代码进行导出Excel

首先,产品有需求,我们苦逼的程序员就得把需求实现。那么今天咱就把产品提的导出Excel的需求给他搞定。他的需求是这样的,很简单的Excel导出。样式如图所示:
其实我们项目中的ExcelUtils工具类不适应这种动态的问题和题干的导出。稍后我会吧此工具类的发放粘贴到文档中供大家参考和学习。那么项目中的不适应,我就自己手写最原始的进行导出,废话不多说开搞~
首先我们是从别的服务获取到数据,那么这个数据是个List集合。
代码如下
`@ApiOperation(value = "查看答卷数据--->导出功能")
@GetMapping("/{questionId}/export")
public void export(@PathVariable("questionId") String questionId, AnswerExportQueryModel queryModel, HttpServletResponse response) throws IOException {

  //aggregateResultDto  自定义的返回值  里面包含header头 和List<?> 泛型,在这里不做解释。

AggregateResultDto aggregateResultDto = questionnaireManager.exportAnswerById(questionId, queryModel);
    List<AnswerListResource> list = (List<AnswerListResource>) aggregateResultDto.getList();
    //获取到List集合中的数据,接下来咱们进行手写导出Excel。
    //说明一下: 导出的Excel的格式有两种 一个是xlsx 一个是 xls。需要自己创建不同的WorkBook实现类,在这里我踩坑了望大家不要再次踩坑。
    //1 正常导出xlsx格式  

    //创建工作薄的时候,用Workbook workbook = new XSSFWorkbook();   这样可以正常导出xlsx格式

    ` response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
       response.addHeader("Content-Disposition", "attachment;filename=fileName" + ".xlsx");`
    //2   正常导出xls格式 Workbook workbook = new HSSFWorkbook();

    ` response.setContentType("application/vnd.ms-excel");
      response.addHeader("Content-Disposition", "attachment;filename=fileName"+".xls");`   

    //3 如果创建xlsx工作薄的时候,用 Workbook workbook = new HSSFWorkbook();   生成的excel将无法打开,并有如下提示:  
      ![](https://img2020.cnblogs.com/blog/2494928/202110/2494928-20211013164248296-1390307100.png)



 //创建HSSFWorkbook对象(excel的文档对象)
    Workbook wb = new XSSFWorkbook();
    //建立新的sheet对象(excel的表单)
    Sheet sheet = wb.createSheet("问卷答案数据");
    //在sheet里创建第1行 (标题)
    Row rowTitle = sheet.createRow(0);
    //创建单元格并设置单元格内容
    rowTitle.createCell(0).setCellValue("大鹏号");
    rowTitle.createCell(1).setCellValue("学管师");
    rowTitle.createCell(2).setCellValue("联系方式");
    rowTitle.createCell(3).setCellValue("用户昵称");
    rowTitle.createCell(4).setCellValue("提交时间");
    rowTitle.createCell(5).setCellValue("你的性别");
    rowTitle.createCell(6).setCellValue("您的出生日期");

    for (int i = 0; i < list.size(); i++) {
        AnswerListResource answerListExportResource = list.get(i);
        int rownum = i + 1;
        //在sheet里创建数据行
        Row rowData = sheet.createRow(rownum);
        // 固定列
        rowData.createCell(0).setCellValue(answerListExportResource.getDpAccount());
        rowData.createCell(1).setCellValue(answerListExportResource.getTeacherName());
        rowData.createCell(2).setCellValue(answerListExportResource.getLearnManagerStudentPhone());
        rowData.createCell(3).setCellValue(answerListExportResource.getNickName());
        rowData.createCell(4).setCellValue(answerListExportResource.getSubTime());
        rowData.createCell(5).setCellValue(getSexType(answerListExportResource.getGender()));
        rowData.createCell(6).setCellValue(answerListExportResource.getBirthday());

        // 设置动态列
        List<AnswerListResource.Question> questions = answerListExportResource.getQuestions();
        Map<String, AnswerListResource.Question> questionMap = questions.stream().collect(Collectors.toMap(AnswerListResource.Question::getQuestion, Function.identity(), (key1, key2) -> key2));
        questions.stream().forEach(question -> {
            AnswerListResource.Question questionTemp = questionMap.get(question.getQuestion());
            if (questionTemp.getQuestion().equals(question.getQuestion())) {
                // 第一次循环时 创建出 列的标题(问卷的问题列)
                if (rownum == 1) {
                    rowTitle.createCell(rowTitle.getLastCellNum()).setCellValue(question.getQuestion());
                }
                // 设置答案
                rowData.createCell(rowData.getLastCellNum()).setCellValue(question.getAnswer());
            }
        });
    }
    // 下载
    ExcelUtils.downLoadExcel("问卷答案导出",response,wb);

}`

附:ExcelUtils 代码
`public class ExcelUtils {

/**
 * excel 导出
 *
 * @param list           数据
 * @param title          标题
 * @param sheetName      sheet名称
 * @param pojoClass      pojo类型
 * @param fileName       文件名称
 * @param isCreateHeader 是否创建表头
 * @param response
 */
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,
                               boolean isCreateHeader, HttpServletResponse response) throws IOException {
    ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
    exportParams.setCreateHeadRows(isCreateHeader);
    defaultExport(list, pojoClass, fileName, response, exportParams);
}

/**
 * excel 导出
 *
 * @param list      数据
 * @param title     标题
 * @param sheetName sheet名称
 * @param pojoClass pojo类型
 * @param fileName  文件名称
 * @param response
 */
public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,
                               HttpServletResponse response) throws IOException {
    defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));
}

/**
 * excel 导出
 *
 * @param list         数据
 * @param pojoClass    pojo类型
 * @param fileName     文件名称
 * @param response
 * @param exportParams 导出参数
 */
public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams,
                               HttpServletResponse response) throws IOException {
    defaultExport(list, pojoClass, fileName, response, exportParams);
}
/**
 * excel 导出
 *
 * @param list         数据
 * @param pojoClass    pojo类型
 * @param fileName     文件名称
 * @param response
 */
public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {
    defaultExport(list, pojoClass, fileName, response, new ExportParams());
}


/**
 * excel 导出
 *
 * @param list     数据
 * @param fileName 文件名称
 * @param response
 */
public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response)
        throws IOException {
    defaultExport(list, fileName, response);
}

/**
 * 默认的 excel 导出
 *
 * @param list         数据
 * @param pojoClass    pojo类型
 * @param fileName     文件名称
 * @param response
 * @param exportParams 导出参数
 */
private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response,
                                  ExportParams exportParams) throws IOException {
    exportParams.setType(ExcelType.XSSF);
    Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
    downLoadExcel(fileName, response, workbook);
}

/**
 * 默认的 excel 导出
 *
 * @param list     数据
 * @param fileName 文件名称
 * @param response
 */
private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response)
        throws IOException {
    Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
    downLoadExcel(fileName, response, workbook);
}

/**
 * 下载
 *
 * @param fileName 文件名称
 * @param response
 * @param workbook excel数据
 */
public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook)
        throws IOException {
    try {
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-Type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename="
                + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));
        workbook.write(response.getOutputStream());
    } catch (Exception e) {
        throw new IOException(e.getMessage());
    }
}

/**
 * excel 导入
 *
 * @param filePath   excel文件路径
 * @param titleRows  标题行
 * @param headerRows 表头行
 * @param pojoClass  pojo类型
 * @param <T>
 * @return
 */
public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass)
        throws IOException {
    if (StringUtils.isBlank(filePath)) {
        return null;
    }
    ImportParams params = new ImportParams();
    params.setTitleRows(titleRows);
    params.setHeadRows(headerRows);
    params.setNeedSave(true);
    params.setSaveUrl("/excel/");
    try {
        return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
    } catch (NoSuchElementException e) {
        throw new IOException("模板不能为空");
    } catch (Exception e) {
        throw new IOException(e.getMessage());
    }
}

/**
 * excel 导入
 *
 * @param file      excel文件
 * @param pojoClass pojo类型
 * @param <T>
 * @return
 */
public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {
    return importExcel(file, 1, 1, pojoClass);
}


public static <T> List<T> importExcelNoTitle(MultipartFile file, Class<T> pojoClass) throws IOException {
return importExcel(file,0,1,pojoClass);
}

/**
 * excel 导入
 *
 * @param file       excel文件
 * @param titleRows  标题行
 * @param headerRows 表头行
 * @param pojoClass  pojo类型
 * @param <T>
 * @return
 */
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)
        throws IOException {
    return importExcel(file, titleRows, headerRows, false, pojoClass);
}

/**
 * excel 导入
 *
 * @param file       上传的文件
 * @param titleRows  标题行
 * @param headerRows 表头行
 * @param needVerfiy 是否检验excel内容
 * @param pojoClass  pojo类型
 * @param <T>
 * @return
 */
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy,
                                      Class<T> pojoClass) throws IOException {
    if (file == null) {
        return null;
    }
    try {
        return importExcel(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);
    } catch (Exception e) {
        throw new BusinessException(e.getMessage());
    }
}

/**
 * excel 导入
 *
 * @param inputStream 文件输入流
 * @param titleRows   标题行
 * @param headerRows  表头行
 * @param needVerify  是否检验excel内容
 * @param pojoClass   pojo类型
 * @param <T>
 * @return
 */
public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows,
                                      boolean needVerify, Class<T> pojoClass) throws IOException {
    if (inputStream == null) {
        return null;
    }
    ImportParams params = new ImportParams();
    params.setTitleRows(titleRows);
    params.setHeadRows(headerRows);
    params.setSaveUrl("/excel/");
    params.setNeedSave(true);
    params.setNeedVerfiy(needVerify);
    try {
        return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
    } catch (NoSuchElementException e) {
        throw new IOException("excel文件不能为空");
    } catch (Exception e) {
        throw new IOException(e.getMessage());
    }
}

/**
 * Excel 类型枚举
 */
enum ExcelTypeEnum {
    XLS("xls"), XLSX("xlsx");
    private String value;

    ExcelTypeEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

}`

posted @   烫手的山芋  阅读(732)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示