excel解析xls,xlsx

第一步:拿到上传文件的后缀,通过判断后缀来选择 工作簿 Workbook 类型

  private Workbook wb;
 String fileType = filepath.substring(filepath.lastIndexOf("."));
        try {
            InputStream is = new FileInputStream(filepath);
            if (".xls".equals(fileType)) {
                wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(fileType)) {
                wb = new XSSFWorkbook(is);
            } else {
                wb = null;
            }

第二步:创建一个list 模板,用于数据的填装

	ReadExcelUtils excelReader = new ReadExcelUtils(filePath);
			List<String> columnsList = new ArrayList<String>();
		
			columnsList.add("x2");
			columnsList.add("x3");
			columnsList.add("x4");

第三步:获取工作簿的行数, 单元格数,进行遍历读取添加数据

   List<Map> content = new ArrayList<Map>();

        sheet = wb.getSheetAt(0);
        int rowNum = sheet.getLastRowNum();// 得到总行数
        row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells(); //每行列数
        //
        Map<String, Object> cellValue = null;             
            // 根据自己需求确定正文从第几行开始 
           int  stars =2;
            for (int i = stars; i <= rowNum; i++) {
                row = sheet.getRow(i);
                int j = 0;
                cellValue = new HashMap<String, Object>();

                while (j < colNum) {
                    Object obj = getCellFormatValue(row.getCell(j)); //这是处理数据类型的方
          法
                    cellValue.put(columnsList.get(j), obj.toString());
                    j++;
                }
                content.add(cellValue);
 
    /**
     * 
     * 根据Cell类型设置数据
     * 此方法根据自己需求改变
     * @param cell
     * @return
     * @author zengwendong
     */
    private Object getCellFormatValue(Cell cell) {
        Object cellvalue = "";
        // 非空
        if (null != cell && (!"".equals(cell.toString()))) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC:// 如果当前Cell的Type为NUMERIC
            case Cell.CELL_TYPE_FORMULA: {
                // 判断当前的cell是否为Date
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date类型则,转化为Data格式
                    // data格式是带时分秒的:2013-7-10 0:00:00
                    // cellvalue = cell.getDateCellValue().toLocaleString();
                    // data格式是不带带时分秒的:2013-7-10
                    Date date = cell.getDateCellValue();
                    cellvalue = date;
                } else {// 如果是纯数字

                    // 取得当前Cell的数值
               
                	DecimalFormat df = new DecimalFormat("0");  
                	cellvalue=df.format(cell.getNumericCellValue());
                 //   cellvalue = String.valueOf(cell.getNumericCellValue());//有小数点
                }
                break;
            }
            case Cell.CELL_TYPE_STRING:// 如果当前Cell的Type为STRING
                // 取得当前的Cell字符串
                cellvalue = cell.getRichStringCellValue().getString();
                break;
            default:// 默认的Cell值
                cellvalue = "";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }

代码连起来:

  private Workbook wb;
 String fileType = filepath.substring(filepath.lastIndexOf("."));
        try {
            InputStream is = new FileInputStream(filepath);
            if (".xls".equals(fileType)) {
                wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(fileType)) {
                wb = new XSSFWorkbook(is);
            } else {
                wb = null;
            }
		
		ReadExcelUtils excelReader = new ReadExcelUtils(filePath);
			List<String> columnsList = new ArrayList<String>();
		
			columnsList.add("x2");
			columnsList.add("x3");
			columnsList.add("x4");		
			
			   List<Map> content = new ArrayList<Map>();

        sheet = wb.getSheetAt(0);
        int rowNum = sheet.getLastRowNum();// 得到总行数
        row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells(); //每行列数
        //
        Map<String, Object> cellValue = null;             
            // 根据自己需求确定正文从第几行开始 
           int  stars =2;
            for (int i = stars; i <= rowNum; i++) {
                row = sheet.getRow(i);
                int j = 0;
                cellValue = new HashMap<String, Object>();

                while (j < colNum) {
                    Object obj = getCellFormatValue(row.getCell(j)); //这是处理数据类型的方
          法
                    cellValue.put(columnsList.get(j), obj.toString());
                    j++;
                }
                content.add(cellValue);
 --------------------------------------------------------------
       最后得到一个list<map>集合,数据拿到了,爱干啥干啥
------------------------------------------------------------------
------ 其中一个处理情况: 数据拆分        ----------------
    //数据切割,最大值max:插入字段数*列数不能大于1000
            int insertSize = 50;

            // 大于insertSize条数据
            if (content.size() > insertSize) {
                // 将大集合拆分成:每insertSize条数据组成的小集合
                List<List<Map>> parentList = this.splitList(scheduleList, insertSize);

                List<Map> childList = new ArrayList<Map>();
                for (Iterator iterator = parentList.iterator(); iterator.hasNext();) {
                    // insertSize条数据
                    childList = (List<Map>) iterator.next();
                    daoCONSULT_SCHEDULE.insertCONSULT_SCHEDULE_batch(childList);
                }





    /**
     * 
     * 根据Cell类型设置数据
     * 此方法根据自己需求改变
     * @param cell
     * @return
     * @author zengwendong
     */
    private Object getCellFormatValue(Cell cell) {
        Object cellvalue = "";
        // 非空
        if (null != cell && (!"".equals(cell.toString()))) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC:// 如果当前Cell的Type为NUMERIC
            case Cell.CELL_TYPE_FORMULA: {
                // 判断当前的cell是否为Date
                if (DateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date类型则,转化为Data格式
                    // data格式是带时分秒的:2013-7-10 0:00:00
                    // cellvalue = cell.getDateCellValue().toLocaleString();
                    // data格式是不带带时分秒的:2013-7-10
                    Date date = cell.getDateCellValue();
                    cellvalue = date;
                } else {// 如果是纯数字

                    // 取得当前Cell的数值
               
                	DecimalFormat df = new DecimalFormat("0");  
                	cellvalue=df.format(cell.getNumericCellValue());
                 //   cellvalue = String.valueOf(cell.getNumericCellValue());//有小数点
                }
                break;
            }
            case Cell.CELL_TYPE_STRING:// 如果当前Cell的Type为STRING
                // 取得当前的Cell字符串
                cellvalue = cell.getRichStringCellValue().getString();
                break;
            default:// 默认的Cell值
                cellvalue = "";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }



/**
     * 拆分集合
     * @param <T>
     * @param resList
     *            要拆分的集合
     * @param count
     *            每个集合的元素个数
     * @return 返回拆分后的各个集合
     */
    private <T> List<List<T>> splitList(List<T> resList, int count) {

        if (resList == null || count < 1)
            return null;
        List<List<T>> ret = new ArrayList<List<T>>();
        int size = resList.size();
        if (size <= count) { // 数据量不足count指定的大小
            ret.add(resList);
        } else {
            int pre = size / count;
            int last = size % count;
            // 前面pre个集合,每个大小都是count个元素
            for (int i = 0; i < pre; i++) {
                List<T> itemList = new ArrayList<T>();
                for (int j = 0; j < count; j++) {
                    itemList.add(resList.get(i * count + j));
                }
                ret.add(itemList);
            }
            // last的进行处理
            if (last > 0) {
                List<T> itemList = new ArrayList<T>();
                for (int i = 0; i < last; i++) {
                    itemList.add(resList.get(pre * count + i));
                }
                ret.add(itemList);
            }
        }
        return ret;

    }

猜你喜欢

转载自blog.csdn.net/smalltree_001/article/details/82109172