使用POI插件,提取导出excel的工具类

来源:互联网 发布:php培训出来的 编辑:程序博客网 时间:2024/05/22 09:04

在网站的不同的模块都需要使用到导入导出excel的功能,我们就需要写一个通用的工具类ExcelUtil。

  1. 我的思路:
    首先,导入和导出的Excel的文件格式固定:主标题,二级标题,数据行(姑且就这么叫),详细的见下图:

    分析这张图发现在不同的模块场景使用时,这三大部分都是不同的,他们三者的样式也是不同的,所以需要在ExcelUtil类里面对这三大部分写不同的方法

其次是导入可能和导出的数据不同,所以二级标题,数据行的显示列数,和内容需要有用户指定,而不是javabean有多少字段就输出多少,何况在User这个javabean里面有两个

特殊的字段(//状态
    public static String USER_STATE_VALID="1";
    public static String USER_STATE_INVILID="2";)

因为他们既不存在数据库也不存在Excel,所以导入导出就不要和他们扯上半毛钱的关系。

另外在ExcelUtil里面对单元格的读取也被提取出来了做一个方法,

需要指出的是:由于不想维护User中关于性别的字段,我直接使用了String的类型,原因就在于我在Excel输出可不想显示true、false,为了单个Excel的某一字段的显示,我要修改我的通用ExcelUtil,而且改动的非常复杂(不失去通用性也不影响其他模块使用,要知道可能就仅仅这里我要转换一下true:男,false:女),就直接改javabean,收工搞定

不多说,上代码:

复制代码
package com.itcast.core.utils;import java.io.File;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.TimeZone;import net.sf.ehcache.hibernate.management.impl.BeanUtils;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFName;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFCellUtil;import org.apache.poi.hssf.util.HSSFColor;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.ss.usermodel.WorkbookFactory;import org.apache.poi.ss.util.CellRangeAddress;public class ExcelUtil {    private ExcelUtil() {    }    /**     * 导出excel头部标题     * @param title     * @param cellRangeAddressLength     * @return     */    public static HSSFWorkbook makeExcelHead(String title, int cellRangeAddressLength){        HSSFWorkbook workbook = new HSSFWorkbook();        HSSFCellStyle styleTitle = createStyle(workbook, (short)16);        HSSFSheet sheet = workbook.createSheet(title);        sheet.setDefaultColumnWidth(25);        CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, cellRangeAddressLength);        sheet.addMergedRegion(cellRangeAddress);        HSSFRow rowTitle = sheet.createRow(0);        HSSFCell cellTitle = rowTitle.createCell(0);        // 为标题设置背景颜色        styleTitle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);        styleTitle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);        cellTitle.setCellValue(title);        cellTitle.setCellStyle(styleTitle);        return workbook;    }    /**     * 设定二级标题     * @param workbook     * @param secondTitles     * @return     */    public static HSSFWorkbook makeSecondHead(HSSFWorkbook workbook, String[] secondTitles){        // 创建用户属性栏        HSSFSheet sheet = workbook.getSheetAt(0);        HSSFRow rowField = sheet.createRow(1);        HSSFCellStyle styleField = createStyle(workbook, (short)13);                for (int i = 0; i < secondTitles.length; i++) {            HSSFCell cell = rowField.createCell(i);            cell.setCellValue(secondTitles[i]);            cell.setCellStyle(styleField);                    }        return workbook;    }    /**     * 插入数据     * @param workbook     * @param dataList     * @param beanPropertys     * @return     */    public static <T> HSSFWorkbook exportExcelData(HSSFWorkbook workbook, List<T> dataList, String[] beanPropertys) {        HSSFSheet sheet = workbook.getSheetAt(0);        // 填充数据        HSSFCellStyle styleData = workbook.createCellStyle();        styleData.setAlignment(HSSFCellStyle.ALIGN_CENTER);        styleData.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        for (int j = 0; j < dataList.size(); j++) {            HSSFRow rowData = sheet.createRow(j + 2);            T t = dataList.get(j);            for(int k=0; k<beanPropertys.length; k++){                Object value = BeanUtils.getBeanProperty(t, beanPropertys[k]);                HSSFCell cellData = rowData.createCell(k);                                cellData.setCellValue(value.toString());                                            cellData.setCellStyle(styleData);            }                    }        return workbook;    }/** * 使用批量导入方法时,请注意需要导入的Bean的字段和excel的列一一对应 * @param clazz * @param file * @param beanPropertys * @return */    public static <T> List<T> parserExcel(Class<T> clazz, File file, String[] beanPropertys) {        // 得到workbook        List<T> list = new ArrayList<T>();        try {            Workbook workbook = WorkbookFactory.create(file);            Sheet sheet = workbook.getSheetAt(0);            // 直接从第三行开始获取数据            int rowSize = sheet.getPhysicalNumberOfRows();            if(rowSize > 2){                                for (int i = 2; i < rowSize; i++) {                    T t = clazz.newInstance();                    Row row = sheet.getRow(i);                    int cellSize = row.getPhysicalNumberOfCells();                    for(int j=0; j<cellSize; j++){                                                Object cellValue = getCellValue(row.getCell(j));                        org.apache.commons.beanutils.BeanUtils.copyProperty(t, beanPropertys[j], cellValue);                        }                                                                                list.add(t);                }            }                    } catch (Exception e) {            e.printStackTrace();        }        return list;    }    /**     * 通用的读取excel单元格的处理方法     * @param cell     * @return     */    private static Object getCellValue(Cell cell) {        Object result = null;        if (cell != null) {            switch (cell.getCellType()) {            case Cell.CELL_TYPE_STRING:                result = cell.getStringCellValue();                break;            case Cell.CELL_TYPE_NUMERIC:                //对日期进行判断和解析                if(HSSFDateUtil.isCellDateFormatted(cell)){                    double cellValue = cell.getNumericCellValue();                    result = HSSFDateUtil.getJavaDate(cellValue);                }                                break;            case Cell.CELL_TYPE_BOOLEAN:                result = cell.getBooleanCellValue();                break;            case Cell.CELL_TYPE_FORMULA:                result = cell.getCellFormula();                break;            case Cell.CELL_TYPE_ERROR:                result = cell.getErrorCellValue();                break;            case Cell.CELL_TYPE_BLANK:                break;            default:                break;            }        }        return result;    }    /**     * 提取公共的样式     * @param workbook     * @param fontSize     * @return     */    private static HSSFCellStyle createStyle(HSSFWorkbook workbook, short fontSize){        HSSFCellStyle style = workbook.createCellStyle();                style.setAlignment(HSSFCellStyle.ALIGN_CENTER);        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        // 创建一个字体样式        HSSFFont font = workbook.createFont();        font.setFontHeightInPoints(fontSize);        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);        style.setFont(font);        return style;    }    }如何调用:
复制代码
    @Override    public void exportExcel(ServletOutputStream outputStream,            List<User> userList) {        try {            HSSFWorkbook workbook1 = ExcelUtil.makeExcelHead("用户列表", 4);            String[] secondTitles = {"用户名", "账号", "所属部门", "性别", "电子邮箱"};            HSSFWorkbook workbook2 = ExcelUtil.makeSecondHead(workbook1, secondTitles);                        String[] beanProperty = {"name","account","dept", "gender", "email"};                        HSSFWorkbook workbook = ExcelUtil.exportExcelData(workbook2, userList, beanProperty);            workbook.write(outputStream);        } catch (IOException e) {            e.printStackTrace();        }            }    @Override    public void importExcel(File file) {        String[] beanProperty = {"name","account","dept", "gender", "mobile", "email", "birthday"};        List<User> list = ExcelUtil.parserExcel(User.class, file, beanProperty);        if(list.size() > 0){            for(User user : list){                user.setPassword("123456");                user.setState(User.USER_STATE_VALID);                add(user);            }        }            }
复制代码

 

 
复制代码

 

0 0
原创粉丝点击