zoukankan      html  css  js  c++  java
  • java导入导出Excel文件

    package poi.excel;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.log4j.Logger;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;
    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.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.xssf.usermodel.XSSFWorkbook;
    
    
    
    /** 
    * @ClassName: ExcelUtil 
    * @Description: Excel导入导出工具类
    * @author 周宣
    * @date 2016-11-8 下午7:16:11 
    *  
    */
    public class ExcelUtil {
        private static final Logger logger = Logger.getLogger(ExcelUtil.class);
        
        /** 
        * @Title: createWorkbook 
        * @Description: 判断excel文件后缀名,生成不同的workbook 
        * @param @param is
        * @param @param excelFileName
        * @param @return
        * @param @throws IOException
        * @return Workbook
        * @throws 
        */
        public Workbook createWorkbook(InputStream is,String excelFileName) throws IOException{
            if (excelFileName.endsWith(".xls")) {
                return new HSSFWorkbook(is);
            }else if (excelFileName.endsWith(".xlsx")) {
                return new XSSFWorkbook(is);
            }
            return null;
        }
    
        /** 
        * @Title: getSheet 
        * @Description: 根据sheet索引号获取对应的sheet
        * @param @param workbook
        * @param @param sheetIndex
        * @param @return
        * @return Sheet
        * @throws 
        */
        public Sheet getSheet(Workbook workbook,int sheetIndex){
            return workbook.getSheetAt(0);        
        }
        
        /** 
        * @Title: importDataFromExcel 
        * @Description: 将sheet中的数据保存到list中,
        * 1、调用此方法时,vo的属性个数必须和excel文件每行数据的列数相同且一一对应,vo的所有属性都为String
        * 2、在action调用此方法时,需声明 
        *     private File excelFile;上传的文件
        *     private String excelFileName;原始文件的文件名
        * 3、页面的file控件name需对应File的文件名
        * @param @param vo javaBean
        * @param @param is 输入流
        * @param @param excelFileName
        * @param @return
        * @return List<Object>
        * @throws 
        */
        public List<Object> importDataFromExcel(Object vo,InputStream is,String excelFileName){
            List<Object> list = new ArrayList<Object>();
            try {
                //创建工作簿
                Workbook workbook = this.createWorkbook(is, excelFileName);
                //创建工作表sheet
                Sheet sheet = this.getSheet(workbook, 0);
                //获取sheet中数据的行数
                int rows = sheet.getPhysicalNumberOfRows();
                //获取表头单元格个数
                int cells = sheet.getRow(0).getPhysicalNumberOfCells();
                //利用反射,给JavaBean的属性进行赋值
                Field[] fields = vo.getClass().getDeclaredFields();
                for (int i = 1; i < rows; i++) {//第一行为标题栏,从第二行开始取数据
                    Row row = sheet.getRow(i);
                    int index = 0;
                    while (index < cells) {
                        Cell cell = row.getCell(index);
                        if (null == cell) {
                            cell = row.createCell(index);
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String value = null == cell.getStringCellValue()?"":cell.getStringCellValue();
                        
                        Field field = fields[index];
                        String fieldName = field.getName();
                        String methodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                        Method setMethod = vo.getClass().getMethod(methodName, new Class[]{String.class});
                        setMethod.invoke(vo, new Object[]{value});
                        index++;
                    }
                    if (isHasValues(vo)) {//判断对象属性是否有值
                        list.add(vo);
                        vo.getClass().getConstructor(new Class[]{}).newInstance(new Object[]{});//重新创建一个vo对象
                    }
                    
                }
            } catch (Exception e) {
                logger.error(e);
            }finally{
                try {
                    is.close();//关闭流
                } catch (Exception e2) {
                    logger.error(e2);
                }
            }
            return list;
            
        }
        
        /** 
        * @Title: isHasValues 
        * @Description: 判断一个对象所有属性是否有值,如果一个属性有值(分空),则返回true
        * @param @param object
        * @param @return
        * @return boolean
        * @throws 
        */
        public boolean isHasValues(Object object){
            Field[] fields = object.getClass().getDeclaredFields();
            boolean flag = false;
            for (int i = 0; i < fields.length; i++) {
                String fieldName = fields[i].getName();
                String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
                Method getMethod;
                try {
                    getMethod = object.getClass().getMethod(methodName);
                    Object obj = getMethod.invoke(object);
                    if (null != obj && "".equals(obj)) {
                        flag = true;
                        break;
                    }
                } catch (Exception e) {
                    logger.error(e);
                }
                
            }
            return flag;
            
        }
        
        public <T> void exportDataToExcel(List<T> list,String[] headers,String title,OutputStream os){
            HSSFWorkbook workbook = new HSSFWorkbook();
            //生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            //设置表格默认列宽15个字节
            sheet.setDefaultColumnWidth(15);
            //生成一个样式
            HSSFCellStyle style = this.getCellStyle(workbook);
            //生成一个字体
            HSSFFont font = this.getFont(workbook);
            //把字体应用到当前样式
            style.setFont(font);
            
            //生成表格标题
            HSSFRow row = sheet.createRow(0);
            row.setHeight((short)300);
            HSSFCell cell = null;
            
            for (int i = 0; i < headers.length; i++) {        
                cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
            
            //将数据放入sheet中
            for (int i = 0; i < list.size(); i++) {
                row = sheet.createRow(i+1);
                T t = list.get(i);
                //利用反射,根据JavaBean属性的先后顺序,动态调用get方法得到属性的值
                Field[] fields = t.getClass().getFields();
                try {
                    for (int j = 0; j < fields.length; j++) {
                        cell = row.createCell(j);
                        Field field = fields[j];
                        String fieldName = field.getName();
                        String methodName = "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
                        Method getMethod = t.getClass().getMethod(methodName,new Class[]{});
                        Object value = getMethod.invoke(t, new Object[]{});
                        
                        if(null == value)
                            value ="";
                        cell.setCellValue(value.toString());
                        
                    }
                } catch (Exception e) {
                    logger.error(e);
                }
            }
            
            try {
                workbook.write(os);
            } catch (Exception e) {
                logger.error(e);
            }finally{
                try {
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    logger.error(e);
                }
            }
            
        }
        
        /** 
        * @Title: getCellStyle 
        * @Description: 获取单元格格式
        * @param @param workbook
        * @param @return
        * @return HSSFCellStyle
        * @throws 
        */
        public HSSFCellStyle getCellStyle(HSSFWorkbook workbook){
            HSSFCellStyle style = workbook.createCellStyle();
            style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
            style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setLeftBorderColor(HSSFCellStyle.BORDER_THIN);
            style.setRightBorderColor(HSSFCellStyle.BORDER_THIN);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            
            return style;
        }
    
        /** 
        * @Title: getFont 
        * @Description: 生成字体样式
        * @param @param workbook
        * @param @return
        * @return HSSFFont
        * @throws 
        */
        public HSSFFont getFont(HSSFWorkbook workbook){
            HSSFFont font = workbook.createFont();
            font.setColor(HSSFColor.WHITE.index);
            font.setFontHeightInPoints((short)12);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            return font;
        }
        
        public boolean isIE(HttpServletRequest request){
            return request.getHeader("USER-AGENT").toLowerCase().indexOf("msie")>0?true:false;    
        }
    }
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/cc-java/p/7443925.html
Copyright © 2011-2022 走看看