zoukankan      html  css  js  c++  java
  • Apache POI:Excel读写库

    1)Apache POI 简介

           Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现“。基本功能如下:

      HSSF - 提供读写Microsoft Excel格式档案的功能。

      XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

      OOXML:Offic Open XML,微软以XML为基础并以ZIP格式压塑的电子文件规范,支持文件,表格,备忘录,幻灯片等格式。从Microsoft Offic 2007开始,OOXML已经成为Microsoft Offic默认的文件格式。

      HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。

    2) maven pom.xml配置

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

    3)核心代码

    /** 
     * 下载 
     * @param response 
     * @param list 
     * @param clazz 
     * @param templatePath 
     * @param templateName 
     * @throws Exception 
     */  
    public static void download(HttpServletResponse response, List list, Class clazz, String templatePath, String templateName) throws Exception {  
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/M/d");  
        OutputStream os = response.getOutputStream();  
        try {  
            XSSFWorkbook workbook = ExcelUtil.getExportWorkBook(list, clazz, templatePath);  
            response.setHeader("Content-Disposition", "attachment; filename='" + templateName + "'");  
            response.setContentType("application/vnd.ms-excel");  
            workbook.write(os);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (os != null) {  
                os.close();  
            }  
        }  
    }  
    /** 
     * 获取导出Excel工作薄 
     * 
     * @param list         数据源 
     * @param clazz        类 
     * @param templatePath 模板路径 
     * @return 
     * @throws Exception 
     */  
    public static XSSFWorkbook getExportWorkBook(List list, Class clazz, String templatePath) throws Exception {  
        //获取导入模板  
        InputStream in = ExcelUtil.class.getResourceAsStream(templatePath);  
        XSSFWorkbook wb = new XSSFWorkbook(in);  
        XSSFSheet sheet = wb.getSheetAt(0);  
        //写入数据  
        writeDate(sheet, clazz, list);  
        return wb;  
    } 
    /** 
     * 写入数据 
     * 
     * @param sheet    表格 
     * @param clazz    类 
     * @param list     数据源 
     * @throws Exception 
     */  
    public static void writeDate( XSSFSheet sheet, Class clazz, List list) throws Exception {  
        int propertyRowNum = 2;  
        XSSFRow propertyRow = sheet.getRow(propertyRowNum);//获取属性行  
        int columnCount = propertyRow.getLastCellNum();//获取属性行的列数  
        //循环赋值  
        for (int i = 0; i < list.size(); i++) {  
            Row dataRow = sheet.createRow(propertyRowNum + 1 + i);  
            //循环为每列赋值  
            for (int j = 0; j < columnCount; j++) {  
                String propertyString = propertyRow.getCell(j).getStringCellValue();  
                if (StringUtil.isEmpty(propertyString)) {  
                    continue;  
                }  
                Method getMethod = getGetMethod(clazz, propertyString);//使用反射来获取方法和赋值  
                if (getMethod != null) {  
                    Cell cell = dataRow.createCell(j);  
                    CellStyle cellStyle = propertyRow.getCell(j).getCellStyle();  
                    cell.setCellStyle(cellStyle);  
                    setCell(list.get(i), getMethod, cell);  
                } else {  
                    dataRow.createCell(j).setCellValue("");  
                }  
            }  
        }  
    	if(propertyRowNum == sheet.getLastRowNum()){
    		sheet.removeRow(propertyRow);//没有数据,清空属性行
    	}else {
    		sheet.shiftRows(propertyRowNum + 1, sheet.getLastRowNum(), -1);//有数据,清空属性行,全部数据行上移一行(该函数从起始行,到结束行,上移一行)
    	}
    }  
    /** 
     * 根据关键词查找对应的get方法 
     * 
     * @param objectClass 
     * @param fieldName 
     * @return 
     */  
    public static Method getGetMethod(Class objectClass, String fieldName) {  
        StringBuffer sb = new StringBuffer();  
        sb.append("get");  
        sb.append(fieldName.substring(0, 1).toUpperCase());  
        sb.append(fieldName.substring(1));  
        try {  
            return objectClass.getMethod(sb.toString());  
        } catch (Exception e) {  
        }  
        return null;  
    }
     /**
         * 设置单元格的值
         *
         * @param object
         * @param method
         * @param cell
         * @return
         * @throws Exception
         */
        private static Cell setCell(Object object, Method method, Cell cell) throws Exception {
            String returnType = method.getReturnType().getName();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
            switch (returnType) {
                case "java.util.Date": {
                    java.util.Date cellValue = (java.util.Date) method.invoke(object);
                    if (cellValue != null) {
                        cell.setCellValue(sdf.format(cellValue));
                    }
                }
                break;
                case "java.lang.Float": {
                    Float cellValue = (java.lang.Float) method.invoke(object);
                    if (cellValue != null) {
                        cell.setCellValue(Double.valueOf(cellValue.toString()));
                    }
                }
                break;
                case "java.lang.Double": {
                    Double cellValue = (java.lang.Double) method.invoke(object);
                    if (cellValue != null) {
                        cell.setCellValue(cellValue);
                    }
                }
                break;
                case "java.lang.String": {
                    String cellValue = (java.lang.String) method.invoke(object);
                    if (StringUtil.isNotEmpty(cellValue)) {
                        cell.setCellValue(cellValue);
                    }
                }
                case "java.lang.Integer":{
                    Integer cellValue = (java.lang.Integer) method.invoke(object);
                    if (cellValue != null) {
                        cell.setCellValue(cellValue);
                    }
                }
                default:
                    break;
            }
            return cell;
        }
    

      

      

  • 相关阅读:
    一些python练习题
    爬取某房源网数据
    练习1:定义 is_Even 函数,传一 int 参数,判断是否是偶数,return True;不是,return False
    pycharm中tkinter 不显示窗口
    保护眼睛颜色的RGB数值
    Python study----------class的实例化
    HTML----------STUDY
    Python study----------字典 popitem()
    Python study----------Python搜索路径
    Python study----------第三方module-----chardet(识别编码)
  • 原文地址:https://www.cnblogs.com/knsbyoo/p/9032607.html
Copyright © 2011-2022 走看看