java

Java 读取Excel文件(xlsx/xls/csv)

2020-09-10  本文已影响0人  HachiLin

1. 读取xlsx

private static FormulaEvaluator evaluator;
String static void readXlsx(String path) {
       try{
            // 读取的时候可以使用流,也可以直接使用文件名
            FileInputStream is =  new FileInputStream(path);
            Workbook xwb = new XSSFWorkbook(is);
            // 循环工作表sheet
            for(int numSheet = 0; numSheet < xwb.getNumberOfSheets(); numSheet++) {
                Sheet sheet = xwb.getSheetAt(numSheet);
                if(sheet == null) {
                    continue;
                }
               // 循环row,如果第一行是字段,则 numRow = 1
              for(int numRow = 0; numRow <= sheet.getLastRowNum(); numRow++) {
                  Row row = sheet.getRow(numRow);
                  if(row == null) {
                    continue;
                  }
                  // 循环cell
                 for(int numCell = 0; numCell < row.getLastCellNum(); numCell++) {
                    Cell cell = row.getCell(numCell);
                    if(cell == null) {
                        continue;
                        }
                    // 打印数据
                    System.out.println("xlsx表格中读取的数据" + getValue(cell));
                 }
              }
            }            
      }catch(Exception e) {
          e.printStackTrace();
      }
}
public static String getValue(Cell cell) {
      String val = null;
      switch(cell.getCellType()) {
            case FORMULA:  //公式类型
                 // 先计算表达式 
                 val = String.valueOf(evaluator.evaluate(cell).getNumericCellValue());
                 break;
            case BOOLEAN:  //布尔类型
                 val = String.valueOf(cell.getBooleanCellValue()); 
                 break; 
            case STRING:   // 字符串类型
                 val = cell.getStringCellValue().trim();
                 break;
            case NUMERIC:  // 数值类型
                 // 日期格式
                 if(DateUtil.isCellDateFormatted(cell)) {
                    val =   Date2Str(cell.getDateCellValue(), "yyyy-MM-dd HH:mm:ss");
                 }else {
                    // 四舍五入
                    val = new DecimalFormat("#.####").format(cell.getNumericCellValue())
                 }
                 break;
            default: //其它类型
                 break;
        }
        return val;                 
      }
}
public static String Date2Str(Date date, String format){
    // Date -> LocalDateTime -> String
    DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
    ZoneId zone = ZoneId.systemDefault();
    LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(),zone);
    return df.format(localDateTime);
}

这里值得注意的是:

// 最后一行行标,比行数小1,行数使用getPhysicalNumberOfRows()获取
sheet.getLastRowNum();
// 获取列数,比最后一列列标大1,等价于getPhysicalNumberOfCells(),空的cell不计算
sheet.getRow(k).getLastCellNum();

2. 读取xls

String static void readXls(String path) {
       try{
            // 读取的时候可以使用流,也可以直接使用文件名
            FileInputStream is =  new FileInputStream(path);
            Workbook hwb = new HSSFWorkbook(is);
            // 循环工作表sheet
            for(int numSheet = 0; numSheet < hwb.getNumberOfSheets(); numSheet++) {
                Sheet sheet = hwb.getSheetAt(numSheet);
                if(sheet == null) {
                    continue;
                }
               // 循环row,如果第一行是字段,则 numRow = 1
              for(int numRow = 0; numRow <= sheet.getLastRowNum(); numRow++) {
                  Row row = sheet.getRow(numRow);
                  if(row == null) {
                    continue;
                  }
                  // 循环cell
                 for(int numCell = 0; numCell < row.getLastCellNum(); numCell++) {
                    Cell cell = row.getCell(numCell);
                    if(cell == null) {
                        continue;
                        }
                    // 打印数据
                    System.out.println("xls表格中读取的数据" + getValue(cell));
                 }
              }
            }            
      }catch(Exception e) {
          e.printStackTrace();
      }
}

里面的通用方法都在读取xlsx文件中已经定义,这里不再写了。

3. 读写csv

Java读取xls和xlsx都是通过poi实现的,csv比较特别,可以通过opencsv或javacsv读取。

3.1 读csv

public static List<String[]> readCSV(String filePath) throws Exception {
        CsvReader reader = null;
        List<String[]> dataList = new ArrayList<String[]>();
        try {
            //如果生产文件乱码,windows下用gbk,linux用UTF-8
            reader = new CsvReader(filePath, separator, Charset.forName("GBK"));

            // 读取表头
            reader.readHeaders();
            String[] headArray = reader.getHeaders();//获取标题
            System.out.println(headArray[0] + headArray[1] + headArray[2]);

            // 逐条读取记录,直至读完
            while (reader.readRecord()) {
                dataList.add(reader.getValues());
                // 读一整行
                System.out.println(reader.getRawRecord());
                // 读这行的第二列
                System.out.println(reader.get(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != reader) {
                reader.close();
            }
        }
        return dataList;
    }

3.2 写csv

public static boolean createCSV(List<String[]> dataList, String filePath) throws Exception {
        boolean isSuccess = false;
        CsvWriter writer = null;
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(filePath, true);
            //如果生产文件乱码,windows下用gbk,linux用UTF-8
            writer = new CsvWriter(out, separator, Charset.forName("GBK"));
            for (String[] strs : dataList) {
                writer.writeRecord(strs);
            }
            isSuccess = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != writer) {
                writer.close();
            }
            if (null != out) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return isSuccess;
    }

参考文献

上一篇下一篇

猜你喜欢

热点阅读