JAVA下载和导出文件到excel中等操作。

补充ps:此篇博文不建议参考,只建议学习思想,当今处理excel导出报表多用模板导出,此种风格过于久远,是老系统写法,理解思想即可

这条推文推荐入门级阅读,笔者自己研究了一遍别人的代码,理解了一下导出数据的思想,大致思路如下:

1.分别建立一个LinkedHashMap来保存表头和表的内容数据,而内容数据可能会有多条,所以也需要使用一个List集合将装有表数据的LinkedHashMap集合包装起来。

注:LinkedHashMap继承于HashMap,有助于快速插数据和删除数据,当然,此处使用主要为了有序插入数据。

2.建立输出流(OutputStream ),用来写导出的数据;

3.使用SXSSFWorkbook的API导入数据到Excel中,这里提两句,HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;XSSFWorkbook和SXSSFWorkbook:都是操作Excel2007后的版本,扩展名是.xlsx;具体的区别笔者就不详细展开了,感兴趣的可以百度或者在CSDN搜索起来.....

4.用XSSFCellStyle 处理导出的单元格格式,可以设置

5.循环拼接单元格,逐个写入数据

@RequestMapping("/XXXXXX")
 public String doExportStore(HttpServletResponse response, @RequestParam String oid)
 {
        // 用于前端传值的,可以不用理会
        String id = "ediStoreListPl";
        
        //需要导出的数据(包括表头和数据)
        List<LinkedHashMap<String, Object>> list = new ArrayList<LinkedHashMap<String,Object>>();
        // 导出数据
        LinkedHashMap<String, Object> dataMap = new LinkedHashMap<String, Object>();
        // 导出表头
        LinkedHashMap<String, String> titleMap = new LinkedHashMap<String, String>();
        
        OutputStream out = null;

        // 记载导出时间的,用于调性能之类,可以不用理会
        long startTime = System.currentTimeMillis();
        Date curDate = DateUtil.getCurrentDate();
        String curDateStr = DateUtils.formatDateTime4FileName(curDate);
        Integer scpGuideBatchOid = Integer.valueOf(oid);
        
        SXSSFWorkbook sxssfWorkbook = null;
        
        try
        {
            // 处理前端的数据,不用理会
            PagedList<RopEdiStore> pl = exportPagedList(id, RopEdiStore.class);
            QueryObject qo = pl.getQo();
            String storeName = (String)qo.get("storeName");
            qo.put("storeName", StringTools.getLikeStr(storeName));
            qo.put("scpGuideBatchOid", scpGuideBatchOid);
            pl.setQo(qo);
            
            // 从数据库中读出需要下载的数据,具体的sql笔者不罗列了,这和你需要下载的数据有关
            List<RopEdiStore> ropEdiStoreList = autoService.getRopEdiStoreListForExport(pl);
            
            if(CollectionUtils.isNotEmpty(ropEdiStoreList))
            {
                // 处理查询出来的数据
                for(RopEdiStore ropEdiStore : ropEdiStoreList)
                {
                    
                    dataMap = new LinkedHashMap<String, Object>();
                    dataMap.put("0", ropEdiStore.getMarketId());
                    dataMap.put("1", ropEdiStore.getStoreId());
                    dataMap.put("2", ropEdiStore.getStoreName());
                    dataMap.put("3", null == ropEdiStore.getOpenDate() ? "" : DateUtils.formatDate(ropEdiStore.getOpenDate(), "yyyy-MM-dd"));
                    dataMap.put("4", null == ropEdiStore.getCloseDate() ? "" : DateUtils.formatDate(ropEdiStore.getCloseDate(), "yyyy-MM-dd"));
                    dataMap.put("5", ropEdiStore.getStatus());
                    dataMap.put("6", ropEdiStore.getProvince());
                    dataMap.put("7",ropEdiStore.getCity());
                    dataMap.put("8", ropEdiStore.getStoreCate());
                    list.add(dataMap);
                }
            }
            
            // excel数据头部分
            titleMap.put("0", "Market ID");
            titleMap.put("1", "Store ID");
            titleMap.put("2", "Store Name");
            titleMap.put("3", "Open Date");
            titleMap.put("4", "Close Date");
            titleMap.put("5", "Status");
            titleMap.put("6", "Province");
            titleMap.put("7", "City");
            titleMap.put("8", "Store Category");
            
            String sheetName = "sheet1";
            
            // 执行导出操作,见下面另一段代码
            sxssfWorkbook = autoService.exportStoreData(titleMap, list, sheetName);
            
            Sheet sheet = sxssfWorkbook.getSheet(sheetName);

            setStoreSheet(sheet);
            
            String charCoding = "UTF-8";
            String fileName = "ria_store_"+curDateStr+".xlsx";
            response.setContentType("application/octet-stream;charset="+charCoding);
            response.setHeader("Content-Disposition", "attachment;fileName="+fileName); 
            
            out = response.getOutputStream();
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            sxssfWorkbook.write(bos);
            bos.writeTo(out);
            out.flush();
            
        }
        catch (Exception e)
        {
            logger.error("export excel failed:",e);
        }
        finally
        {
            try 
            {
                if(sxssfWorkbook != null) 
                {
                    // SXSSFWorkbook导出excel时,产生的临时文件
                    sxssfWorkbook.dispose();
                }
                
                if(out != null) 
                {
                    out.close();
                }
            } 
            catch (IOException e2) 
            {
                logger.error("close io error", e2);
            }
        }
        
        return null;
    }

具体的导出逻辑:

public SXSSFWorkbook exportStoreData(
            LinkedHashMap<String, String> titleMap,
            List<LinkedHashMap<String, Object>> list, String sheetName) 
    {
        SXSSFWorkbook sxssfWorkbook = null;
        
        try 
        {
            // get SXSSFWorkbook
            sxssfWorkbook = new SXSSFWorkbook();
            Sheet sheet = sxssfWorkbook.createSheet(sheetName);
            Font font= sxssfWorkbook.createFont();
            // 语言,处理国际化的,可以不用理会
            String cnFont = ConfigManager.getConfig().getString("ria.font-zh_CN");
            String usFont = ConfigManager.getConfig().getString("ria.font-en_US");
            String lang = AuthedUser.get().getVars().getLang();
            
            if("en_US".equalsIgnoreCase(lang))
            {
                font.setFontName(usFont);
            }
            else
            {
                font.setFontName(cnFont);
            }
            // 冻结最左边的两列、冻结最上面的一行
            // 即:滚动横向滚动条时,左边的第一、二列固定不动;滚动纵向滚动条时,上面的第一行固定不动。
//            sheet.createFreezePane(2, 1);
            // 设置并获取到需要的样式
            XSSFCellStyle xssfCellStyleHeader = getAndSetXSSFCellStyleHeader(sxssfWorkbook);
            XSSFCellStyle xssfCellStyle = (XSSFCellStyle) sxssfWorkbook.createCellStyle();
            // 创建第一行,作为header表头
            if(null != titleMap && !titleMap.isEmpty())
            {
                Row header = sheet.createRow(0);
                // 循环创建header单元格(根据实际情况灵活创建即可)
                int cellnum = 0;
                for(Map.Entry<String, String> entry: titleMap.entrySet())
                {
                    Cell cell = header.createCell(cellnum);
                    xssfCellStyleHeader.setFont(font);
                    cell.setCellStyle(xssfCellStyleHeader);
                    cell.setCellValue(entry.getValue());
                    sheet.setColumnWidth(0, 32 * 100);
                    
                    cellnum++;
                }
            }
 
            if(null != list && !list.isEmpty())
            {
                // 遍历创建行,导出数据
                for (int rownum = 1; rownum <= list.size(); rownum++) 
                {
                    Map<String, Object> dataMap = list.get(rownum-1);
                    if(null == dataMap || dataMap.isEmpty())
                    {
                        continue;
                    }
                    Row row = sheet.createRow(rownum);
                    // 循环创建单元格
                    int cellCount = 0;
                    // 根据单元格所属,录入相应内容
                    for(Map.Entry<String, Object> entry: dataMap.entrySet())
                    {
                        Cell cell = row.createCell(cellCount);
                        
                        if(cellCount == 3 || cellCount == 4)
                        {
                            xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);
                        }
                        
                        xssfCellStyle.setFont(font);
                        cell.setCellStyle(xssfCellStyle);
                        
                        if(null != entry.getValue())
                        {
                            cell.setCellValue(entry.getValue().toString());
                        }
                        else
                        {
                            cell.setCellValue("");
                        }
                        
                        cellCount++;
                    }
                }
            }
        } 
        catch (Exception e) 
        {
            logger.error("cause error", e);
            throw new SysException(e);
        } 
        
        return sxssfWorkbook;
    }