POI导入导出实现(包含级联下拉)

引入上一篇所用到的类

package com.**.**.service.common.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.LinkedMap;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author : wangbin
 * @Description: TODO
 * @date Date : 2019-10-17 16:49
 */
@Service
@Slf4j
public class PreparationExcelServiceImpl implements IPreparationExcelService{


    @Autowired
    private IExcelTemplateService excelTemplateService;

    @Override
    public void exportExcel(Map<String,List<Map<String, Object>>> data, Map<String, LinkedMap<String,String>> tableHeader, String fileName, Long deptId, HttpServletResponse response, HttpServletRequest request) {
        try {
            // 1.准备需要生成excel模板的数据
            List<ExportDefinition> edList = excelTemplateService.getModelData(deptId);

            // 2.生成导出模板
            Workbook wb = new HSSFWorkbook();
            Sheet sheet = excelTemplateService.createExportSheet(edList, wb,deptId);

            // 3.创建数据字典sheet页
            excelTemplateService.createDictSheet(edList, wb);

            // 4.设置数据有效性
            excelTemplateService.setDataValidation(edList, sheet);

            for(String sheetName:data.keySet()){
                LinkedMap<String,String> header = tableHeader.get(sheetName);
                List<Map<String,Object>> sheetData = data.get(sheetName);
                for(Map<String,Object> item:sheetData){
                    int lastRowNum = sheet.getLastRowNum();
                    Row dataRow = sheet.createRow(lastRowNum+1);
                    for(int i=0;i < header.size(); i++){
                        Cell cell = dataRow.createCell(i);
                        cell.setCellValue(String.valueOf(item.get(header.get(i))));
                    }
                }
            }

            String excelFileName = fileName+".xls";
            ServletOutputStream outputStream = response.getOutputStream();

            //根据浏览器判断文件名转码乱码问题
            if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0){
                excelFileName = URLEncoder.encode(excelFileName,"UTF-8");
            }else {
                excelFileName = new String(excelFileName.getBytes("UTF-8"),"ISO8859-1");
            }
            response.setContentType("application/octet-stream");
            //直接下载文件名设置
            response.setHeader("Content-Disposition","attachment;filename="+excelFileName);
            //隐藏数据字典Sheet
            wb.setSheetHidden(1,true);
            wb.write(outputStream);
            wb.close();
        }catch (IOException e){
            log.error("export excel error, fileName is: {},{}",fileName,e);
        }
    }



    @Override
    public Map<String,List<Map<String,String>>> importExcel(MultipartFile file, List<String> titleList) {
        //数据结构一个sheet一个List<Map<String,Object>>
        Map<String,List<Map<String,String>>> result = Maps.newHashMap();
        try {
            //获取文件输入流
            InputStream inputStream = file.getInputStream();
            //获取excel工作簿对象
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            for(Sheet sheet: workbook) {
                String name = sheet.getSheetName();
                if("DICT_SHEET".equals(name)){
                    continue;
                }
                List<Map<String,String>> data = Lists.newArrayList();
                result.put(name,data);
                for(Row row:sheet){
                    if(row.getRowNum() == 0){
                        continue;
                    }
                    Map<String,String> itemData = Maps.newHashMap();
                    for(int i=0; i < row.getLastCellNum(); i++){

                        if(!EmptyUtils.isEmpty(row.getCell(i))){
                            CellType cellType = row.getCell(i).getCellType();
                            String title = titleList.get(i);
                            if(("bronDate".equals(titleList.get(i)) || "militaryRankTime".equals(titleList.get(i))) && "NUMERIC".equals(String.valueOf(cellType))){
                                Date date2 = row.getCell(i).getDateCellValue();
                                SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd");
                                String date1 = dff.format(date2);   //日期转化
                                itemData.put(titleList.get(i), date1);
                            }else{
                                row.getCell(i).setCellType(CellType.STRING);
                                itemData.put(titleList.get(i), String.valueOf(row.getCell(i).getStringCellValue()));
                            }
                        }
                    }
                    data.add(itemData);
                }
            }
            workbook.close();
        }catch (IOException e){
            log.error("import data from excel error!",e);
        }
        return result;
    }


}

 

posted on 2019-11-07 15:00  以启山林  阅读(1131)  评论(0编辑  收藏  举报

导航