美文网首页
Springboot使用Apache poi Excel 实现E

Springboot使用Apache poi Excel 实现E

作者: 小宋_ed76 | 来源:发表于2019-12-19 13:51 被阅读0次

    使用Apache poi Excel实现Excel导出数据的工具类
    1、添加maven依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.16</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.16</version>
    </dependency>
    

    2、Excel导出工具类,支持07版Excel导出格式为“xlsx”

    package com.linksfield.topup.utils;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.xssf.streaming.SXSSFSheet;
    import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.OutputStream;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author: songgt
     * @date: 2019-12-19 10:11
     */
    public class ExcelUtil {
    
        /**
         * 根据resultList生成Excel,但是只是生成xlsx为后缀格式的Excel,只能Excel 2007以上的版本可以打开
         * 可生成多个工作表,每个工作表最多60000行数据,可以将缓存中的数据先存放到硬盘里再清理缓存
         * @param response
         * @param fileName
         * @param nameArray
         * @param rtnList
         * @throws Exception
         */
        public static void exportExcel2007(HttpServletResponse response,
                                           String fileName, String[] nameArray, String[] keyArray,
                                           List<Map<String, Object>> rtnList) {
            int maxRow = 60000;
            try{
                OutputStream os = response.getOutputStream();
                response.setHeader("Content-disposition", "attachment; filename="
                        + new String(fileName.getBytes("gb2312"), "ISO8859-1") + ".xlsx");
                response.setContentType("application/msexcel");
                // 内存中缓存记录行数
                int rowAccess = 100;
                SXSSFWorkbook wb = new SXSSFWorkbook(rowAccess);
                int listSize = rtnList.size();
                // 总工作表
                int sheetNum = listSize / 60000 + 1;
                // 总列数
                int cellTotal = nameArray.length;
                // 数据list的取值下标
                int listNum = 0;
                for (int i = 0; i < sheetNum; i++) {
                    Sheet sh = wb.createSheet(fileName + "sheet" + String.valueOf(i));
                    // 每个SHEET有60000ROW
                    for (int rowNum = 0; rowNum <= maxRow; rowNum++) {
                        Row row = sh.createRow(rowNum);
                        // 每行有cellTotal个CELL
                        if (rowNum == 0){
                            for (int cellNum = 0; cellNum < cellTotal; cellNum++) {
                                Cell cell = row.createCell(cellNum);
                                cell.setCellValue(nameArray[cellNum]);
                            }
                        }else {
                            // 判断是否已取完数据
                            if (listNum < listSize) {
                                Map<String, Object> map = rtnList.get(listNum);
                                listNum++;
                                for (int cellNum = 0; cellNum < cellTotal; cellNum++) {
                                    Cell cell = row.createCell(cellNum);
                                    String key = keyArray[cellNum];
                                    String value = map.get(key) != null ? map.get(key).toString() : "";
                                    cell.setCellValue(value);
                                }
                            } else {
                                break;
                            }
                        }
                        // 每当行数达到设置的值就刷新数据到硬盘,以清理内存
                        if (rowNum % rowAccess == 0) {
                            ((SXSSFSheet) sh).flushRows();
                        }
                    }
                }
                wb.write(os);
                os.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    3、编写测试Controller

    /**
     * @author: songgt
     * @date: 2019-12-19 10:20
     */
    @RestController
    public class ExcelExportController {
    
        @ApiOperation(value = "试用用户-导出excel")
        @GetMapping(path = "/exportTrialUserList")
        public void exportTrialUserList(HttpServletResponse response,@RequestHeader(name = "x-access-token", required = false) String token){
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("a",1);
            map.put("b",2);
            map.put("c",3);
            map.put("d",4);
            List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
            list.add(map);
            String[] names = {"字段1","字段2","字段3","字段4"};
            String[] keys = map.keySet().toArray(new String[map.size()]);
            String fileName = "测试Excel";
            ExcelUtil.exportExcel2007(response,fileName,names,keys,list);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Springboot使用Apache poi Excel 实现E

          本文链接:https://www.haomeiwen.com/subject/tvjmnctx.html