• 导出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);
            }
        }
    
    
    }

    完美。

    欢迎关注:一只阿木木

  • 相关阅读:
    Android Studio学习笔记(1)
    2019全国大学生电子设计大赛总结
    包与常用模块
    模块
    迭代器、生成器与递归调用
    叠加多个装饰器与有参数的装饰器。
    装饰器
    控制指针的移动、函数
    字符编码
    python 数据类型之列表、元组、字典、集合
  • 原文地址:https://www.cnblogs.com/yizhiamumu/p/7092940.html
Copyright © 2020-2023  润新知