导出excel 的方法及示例

一、基本知识

1.Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

2. HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

3.POI 文档结构类

       HSSFWorkbook excel文档对象

            HSSFSheet excel的sheet HSSFRow excel的行

            HSSFCell excel的单元格 HSSFFont excel字体

            HSSFName 名称 HSSFDataFormat 日期格式

            HSSFHeader sheet头

            HSSFFooter sheet尾

            HSSFCellStyle cell样式

            HSSFDateUtil 日期

            HSSFPrintSetup 打印

            HSSFErrorConstants 错误信息表

二、使用逻辑:

1.前端页面发起请求

2.控制器接收,并调用sql 语句查询需要导出的条件

3.调用导出excel模块工具类

1.页面请求

<script type="text/javascript">
        $(function(){
        //导出数据执行方法
        $("#btn_print").click(function() {
         location.href = "../baseExcelExport/export" 
        });
    })
</script>     

2.调用控制器

public void getExportFile(RedirectAttributes redirectAttributes,HttpServletResponse resp){
        
        List<BaseAssetsEquipment> list = baseAssestsEquipmentService.getExcelList();
        
         Map<String,String> titleMap = new LinkedHashMap<String,String>();
            titleMap.put("paymentNo", "设备编号");
            titleMap.put("customerNo", "设备名称");
          
            
            String sheetName = "标题名";
          ExportExcelUtils.excelExport(list, titleMap, sheetName, response);
    }
    

3.导出工具类

public class ExportExcelUtils {

    /***
     * 构造方法
     */
    private ExportExcelUtils() {

    }

    /***
     * 工作簿
     */
    private static HSSFWorkbook workbook;

    /***
     * sheet
     */
    private static HSSFSheet sheet;
    /***
     * 标题行开始位置
     */
    private static final int TITLE_START_POSITION = 0;

    /***
     * 时间行开始位置
     */
    private static final int DATEHEAD_START_POSITION = 1;

    /***
     * 表头行开始位置
     */
    private static final int HEAD_START_POSITION = 2;

    /***
     * 文本行开始位置
     */
    private static final int CONTENT_START_POSITION = 3;

    /**
     * 
     * @param dataList
     *            对象集合
     * @param titleMap
     *            表头信息(对象属性名称->要显示的标题值)[按顺序添加]
     * @param sheetName
     *            sheet名称和表头值
     */
    public static void excelExport(List<?> dataList,Map<String, String> titleMap, String sheetName,HttpServletResponse resp) {

        try {
            String fileName = sheetName+".xls";
            fileName = URLEncoder.encode(fileName, "UTF-8");
            resp.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 初始化workbook
            initHSSFWorkbook(sheetName);
            // 标题行
            createTitleRow(titleMap, sheetName);
            // 时间行
            createDateHeadRow(titleMap);
            // 表头行
            createHeadRow(titleMap);
            // 文本行
            createContentRow(dataList, titleMap);
            // 设置自动伸缩
            // autoSizeColumn(titleMap.size());
            OutputStream out = resp.getOutputStream();
            workbook.write(out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

    /***
     * 
     * @param sheetName
     *            sheetName
     */
    private static void initHSSFWorkbook(String sheetName) {
        workbook = new HSSFWorkbook();
        sheet = workbook.createSheet(sheetName);
    }

    /**
     * 生成标题(第零行创建)
     * 
     * @param titleMap
     *            对象属性名称->表头显示名称
     * @param sheetName
     *            sheet名称
     */
    private static void createTitleRow(Map<String, String> titleMap,
            String sheetName) {
        CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0,
                titleMap.size() - 1);
        sheet.addMergedRegion(titleRange);
        HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION);
        HSSFCell titleCell = titleRow.createCell(0);
        titleCell.setCellValue(sheetName);
    }

    /**
     * 创建时间行(第一行创建)
     * 
     * @param titleMap
     *            对象属性名称->表头显示名称
     */
    private static void createDateHeadRow(Map<String, String> titleMap) {
        CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0,
                titleMap.size() - 1);
        sheet.addMergedRegion(dateRange);
        HSSFRow dateRow = sheet.createRow(DATEHEAD_START_POSITION);
        HSSFCell dateCell = dateRow.createCell(0);
        dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日")
                .format(new Date()));
    }

    /**
     * 创建表头行(第二行创建)
     * 
     * @param titleMap
     *            对象属性名称->表头显示名称
     */
    private static void createHeadRow(Map<String, String> titleMap) {
        // 第1行创建
        HSSFRow headRow = sheet.createRow(HEAD_START_POSITION);
        int i = 0;
        for (String entry : titleMap.keySet()) {
            HSSFCell headCell = headRow.createCell(i);
            headCell.setCellValue(titleMap.get(entry));
            i++;
        }
    }

    /**
     * 
     * @param dataList
     *            对象数据集合
     * @param titleMap
     *            表头信息
     */
    private static void createContentRow(List<?> dataList,Map<String, String> titleMap) {
        try {
            int i = 0;
            for (Object obj : dataList) {
                HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i);
                int j = 0;
                for (String entry : titleMap.keySet()) {
                    
                    String method = "get" + entry.substring(0, 1).toUpperCase()+ entry.substring(1);
                    
                    Method m = obj.getClass().getMethod(method, null);
                    
                    String value = "";
                    
                    if (m.invoke(obj, null)!=null) {
                        
                        value = m.invoke(obj, null).toString();
                        
                        if( m.getReturnType().toString().contains("Date")){
                            value = DateUtils.getStringByDatefindStr(value,"EEE MMM dd HH:mm:ss Z yyyy","yyyy-MM-dd hh:mm:ss");
                        }
                    }
                    
                    HSSFCell textcell = textRow.createCell(j);
                    textcell.setCellValue(value);
                    j++;
                }
                i++;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 自动伸缩列(如非必要,请勿打开此方法,耗内存)
     * 
     * @param size
     *            列数
     */
    private static void autoSizeColumn(Integer size) {
        for (int j = 0; j < size; j++) {
            sheet.autoSizeColumn(j);
        }
    }


}

完美。

欢迎关注:一只阿木木

原文地址:https://www.cnblogs.com/yizhiamumu/p/7092940.html