excel 导入工具类

我很抱歉的说,这个工具类同样不是我写的,公司大神的作品,拿过老以作借鉴。

下面是代码

package ;

import com.opencsv.CSVReader;

import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;

public class ResolveImportObjFile {
    /**
     *
     * @param file 文件
     * @param fileName 文件名
     * @return 返回表中的数据
     */
    public static List<List<String>> getListFromFile(File file, String fileName){
        List<List<String>> mapList = new ArrayList<>();
        try {
            /** 如果是excel格式调用ImportTxtFile方法,直接返回结果 */
            mapList = importExcelFile(file,fileName);
        }catch (IOException e) {
            e.printStackTrace();
        }
        
        return mapList;
    }
    /**
     *
     * @param file 文件
     * @param fileName 文件名
     * @return 返回表中的数据
     */
    public static List<Map<String,Object>> getMapFromFile(File file, String fileName){
        List<Map<String, Object>> mapList = new ArrayList<>();
        try {
            /** 如果是excel格式调用ImportTxtFile方法,直接返回结果 */
            mapList = importExcelFileReturnMapList(file,fileName);
        }catch (IOException e) {
            e.printStackTrace();
        }
        
        return mapList;
    }
    
    /**
     * 读取Excel的内容,第一维数组存储的是多少行,二维数组存储的每一行是多少列。
 
     * 兼容Excel 2003(后缀名:xls)及 2007(后缀名:xlsx)的文件,同时还支持读取csv格式的文件
     *
     * @param file
     *            文件
     * @return 这里返回的是List<List<String>> 格式
     * @throws Exception
     */
    private static List<List<String>> importExcelFile(File file,String fileName) throws IOException {
        List<List<String>> list = new ArrayList<>();
        String[][] returnArray;
        /** 如果是CSV格式调用ImportCsvFile方法,直接返回结果 */
        if (isCsv(fileName)) {
            returnArray = importCsvFile(file,fileName,0);
        }else{
            returnArray = importXlsAndXlsxFile(file,fileName,0);
        }
        
        if(null!=returnArray && returnArray.length>0){
            for (int i = 0; i < returnArray.length; i++) {
                String[] newStr=Arrays.copyOf(returnArray[i], returnArray[i].length-1);
                list.add(Arrays.asList(newStr));
            }
        }
        return list;
    }
    
    /**
     * 读取Excel的内容,第一维数组存储的是多少行,二维数组存储的每一行是多少列。
 
     * 兼容Excel 2003(后缀名:xls)及 2007(后缀名:xlsx)的文件,同时还支持读取csv格式的文件
     *
     * @param file
     *            文件
     * @return  这里返回的是List<Map<String,Object>> 格式
     * @throws Exception
     */
    private static List<Map<String,Object>> importExcelFileReturnMapList(File file,String fileName) throws IOException {
        List<Map<String,Object>> mapList = new ArrayList<>();
        String[][] returnArray;
        /** 如果是CSV格式调用ImportCsvFile方法,直接返回结果 */
        if (isCsv(fileName)) {
            returnArray = importCsvFile(file,fileName,0);
        }else{
            returnArray = importXlsAndXlsxFile(file,fileName,0);
        }
        
        if(null!=returnArray && returnArray.length>0){

          //从一开始,0是excel表头,我导入的excel一般是只有一行表头
            for (int i = 1; i < returnArray.length; i++) {
                String[] newStr=Arrays.copyOf(returnArray[i], returnArray[i].length-1);
                Map<String,Object> map = new HashedMap();
                for(int j=0;j<returnArray[i].length;j++){
                    map.put(returnArray[0][j], returnArray[i][j]);
                }
                mapList.add(map);
            }
        }
        return mapList;
    }
    
    /**
     * csv格式的文件,第一维数组存储的是多少行,二维数组存储的每一行是多少列。
     *
     * @param file
     *            文件
     * @param ignoreRows
     *            读取数据忽略的行数,例:行头不需要读入,忽略的行数为1,那么将ignoreRows设为1即可
     * @return
     * @throws Exception
     */
    public static String[][] importCsvFile(File file, String fileName, int ignoreRows) throws IOException {
 
        /** 验证文件是否合法 */
        if (!isCsv(fileName)) {
            throw new RuntimeException("不是csv格式的文件");
        }
        InputStreamReader inputStream = null;
        CSVReader reader = null;
        List<String[]> result = new ArrayList<String[]>();
        int rowSize = 0;
        try {
            inputStream = new InputStreamReader(new FileInputStream(file), "GBK");
            reader = new CSVReader(inputStream);
            String[] nextRow = null;
            int i = 0;
            while ((nextRow = reader.readNext()) != null) {
                ++i;
                if (i <= ignoreRows) {
                    continue;
                }
                if (nextRow == null || nextRow.length <= 0) {
                    continue;
                }
                int tempRowSize = nextRow.length;
                if (tempRowSize > rowSize) {
                    rowSize = tempRowSize;
                }
                result.add(nextRow);
            }
 
            reader.close();
            inputStream.close();
        } catch (IOException e) {
            throw e;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    inputStream = null;
                    e.printStackTrace();
                }
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    reader = null;
                    e.printStackTrace();
                }
            }
        }
 
        String[][] returnArray = new String[result.size()][rowSize];
        for (int i = 0; i < returnArray.length; i++) {
            returnArray[i] = result.get(i);
        }
        return returnArray;
    }
    
    /**
     * xls、xlsx格式的文件,第一维数组存储的是多少行,二维数组存储的每一行是多少列。
     *
     * @param file
     *            文件
     * @param ignoreRows
     *            读取数据忽略的行数,例:行头不需要读入,忽略的行数为1,那么将ignoreRows设为1即可
     * @return
     * @throws Exception
     */
    public static String[][] importXlsAndXlsxFile(File file, String fileName, int ignoreRows) throws IOException {
        List<String[]> result = new ArrayList<String[]>();
        
        Workbook workbook = null;
        InputStream inputStream = null;
        int rowSize = 0;
 
        try {
            inputStream = new FileInputStream(file);
            if (isExcel2003(fileName)) {
                workbook = new HSSFWorkbook(inputStream);
            } else {
                workbook = new XSSFWorkbook(inputStream);
            }
 
            for (int sheetIndex = 0; sheetIndex < workbook.getNumberOfSheets(); sheetIndex++) {
                Sheet sheet = workbook.getSheetAt(sheetIndex);
                for (int rowIndex = ignoreRows; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                    Row row = sheet.getRow(rowIndex);
                    if (row == null||isEmpty(row)) {
                        continue;
                    }

                  //这里有个加一,会导致结果最后一列会用空列,我不知道为什么要加一,我尝试着去掉,然后会报错。                                      // 所以,最后处理结果集的时候,我选择直接删去最后一列
                    int tempRowSize = row.getLastCellNum() + 1;
                    if (tempRowSize > rowSize) {
                        rowSize = tempRowSize;
                    }
                    String[] values = new String[rowSize];
                    Arrays.fill(values, "");
                    boolean hasValue = false;
                    for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
                        String value = "";
                        Cell cell = row.getCell(columnIndex);
                        if (cell != null) {
                            cell.setCellType(1);
                            switch (cell.getCellType()) {
                            case HSSFCell.CELL_TYPE_STRING:
                                value = cell.getStringCellValue();
                                break;
                            case HSSFCell.CELL_TYPE_NUMERIC:
                                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                    Date date = cell.getDateCellValue();
                                    if (date != null) {
                                        value = new SimpleDateFormat("yyyy-MM-dd").format(date);
                                    } else {
                                        value = "";
                                    }
                                } else {
//                                    value = new DecimalFormat("0").format(cell.getNumericCellValue());
                                    value = cell.getNumericCellValue() + "";
                                }
                                break;
                            case HSSFCell.CELL_TYPE_FORMULA:
                                // 导入时如果为公式生成的数据则无值
                                if (!cell.getStringCellValue().equals("")) {
                                    value = cell.getStringCellValue();
                                } else {
                                    value = cell.getNumericCellValue() + "";
                                }
                                break;
                            case HSSFCell.CELL_TYPE_BLANK:
                                break;
                            case HSSFCell.CELL_TYPE_ERROR:
                                value = "";
                                break;
                            case HSSFCell.CELL_TYPE_BOOLEAN:
                                value = (cell.getBooleanCellValue() == true ? "Y" : "N");
                                break;
                            default:
                                value = "";
                            }
                        }
                        if (columnIndex == 0 && value.trim().equals("")) {
                            continue;
                        }
                        values[columnIndex] = rightTrim(value);
                        hasValue = true;
                    }
 
                    if (hasValue) {
                        result.add(values);
                    }
                }
            }
 
            inputStream.close();

// opencsv 这个jar包低版本会有close方法,高版本没有
//            workbook.close();
        } catch (IOException e) {
            throw e;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    inputStream = null;
                    e.printStackTrace();
                }
            }

// opencsv 这个jar包低版本会有close方法,高版本没有
//            if (workbook != null) {
//                try {
//                    workbook.close();
//                } catch (IOException e) {
//                    workbook = null;
//                    e.printStackTrace();
//                }
//            }
        }
 
        String[][] returnArray = new String[result.size()][rowSize];
        for (int i = 0; i < returnArray.length; i++) {
            returnArray[i] = result.get(i);
        }
        return returnArray;
    }
    
    private static boolean isEmpty(Row row) {
        Iterator<Cell> iterator = row.cellIterator();
        while(iterator.hasNext()){
            Cell cell = iterator.next();
            cell.setCellType(1);
            if(!StringUtils.isBlank(cell.getStringCellValue())){
                return false;
            }
        }
        return true;
    }

    /**
     * 验证excel文件
     *
     * @param fileName
          *            文件名称
     * @return boolean
     */
    public static boolean validateExcel(String fileName) {
        /** 检查文件名是否为空或者是否是Excel格式的文件 */
        return fileName != null && isExcel2003(fileName) || isExcel2007(fileName);
    }
 
 
    /**
     * 是否是2003的excel,返回true是2003
     *
     * @param fileName
     *            文件名称
     * @return boolean
     */
    public static boolean isExcel2003(String fileName) {
        return fileName.matches("^.+\\.(?i)(xls)$");
    }
 
    /**
     * 是否是2007的excel,返回true是2007
     *
     * @param fileName
     *            文件名称
     * @return boolean
     */
    public static boolean isExcel2007(String fileName) {
        return fileName.matches("^.+\\.(?i)(xlsx)$");
    }
    
    /**
     * 是否是csv格式的文件,返回true是csv格式
     *
     * @param fileName
     *            文件名称
     * @return boolean
     */
    public static boolean isCsv(String fileName) {
        return fileName.matches("^.+\\.(?i)(csv)$");
    }
 
    /**
     * 去掉字符串右边的空格
     *
     * @param str
     *            要处理的字符串
     * @return 处理后的字符串
     */
    private static String rightTrim(String str) {
        if (str == null) {
            return "";
        }
        int length = str.length();
        for (int i = length - 1; i >= 0; i--) {
            if (str.charAt(i) != 0x20) {
                break;
            }
            length--;
        }
        return str.substring(0, length);
    }
}

  需要引入的jar包

    <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>版本号</version>
        </dependency>

导入的excel 我自己也写过,由于没有对excel空值的处理,导致数据库存了许多的 null 字符串,StringUtil.isNotBlank()方法没有判断出来,debug才发现excel的空值转换成了字符串 "null"

猜你喜欢

转载自blog.csdn.net/Peter_S/article/details/84951249