Apache POI:Excel读写库

时间:2021-09-01 20:26:33

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;
    }