Java读取Excel文件详解编程语言

使用poi插件解析Excel文件

 

下载插件poi-bin-3.8

package com; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.nio.charset.Charset; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
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 org.springframework.stereotype.Component; 
import com.csvreader.CsvReader; 
import com.elin.csp.model.shopUser.entity.ShopUser; 
@Component 
public class InputExcelFileService { 
   
 /** 总行数 */ 
 private int totalRows = 0; 
 /** 总列数 */ 
 private int totalCells = 0; 
 /** 错误信息 */ 
 private String errorInfo; 
 /** 构造方法 */ 
 public InputExcelFileService() { 
 } 
 /** 
  *  
  * @描述:得到总行数 
  *  
  * @时间:2011-8-9 下午04:27:34 
  *  
  * @参数:@return 
  *  
  * @返回值:int 
  */ 
 public int getTotalRows() { 
  return totalRows; 
 } 
 /** 
  *  
  * @描述:得到总列数 
  *  
  * @时间:2011-8-9 下午04:27:45 
  *  
  * @参数:@return 
  *  
  * @返回值:int 
  */ 
 public int getTotalCells() { 
  return totalCells; 
 } 
 /** 
  *  
  * @描述:得到错误信息 
  *  
  * @时间:2011-8-9 下午04:28:17 
  *  
  * @参数:@return 
  *  
  * @返回值:String 
  */ 
 public String getErrorInfo() { 
  return errorInfo; 
 } 
 /** 
  *  
  * @描述:验证excel文件 
  *  
  * @时间:2011-8-9 下午04:06:47 
  *  
  * @参数:@param fileName 
  *  
  * @参数:@return 
  *  
  * @返回值:boolean 
  */ 
 public boolean validateExcel(String fileName) { 
  /** 检查文件名是否为空或者是否是Excel格式的文件 */ 
  if (fileName == null 
    || !(WDWUtil.isExcel2003(fileName) || WDWUtil 
      .isExcel2007(fileName))) { 
   errorInfo = "文件名不是excel格式"; 
   return false; 
  } 
  /** 检查文件是否存在 */ 
  File file = new File(fileName); 
  if (file == null || !file.exists()) { 
   errorInfo = "文件不存在"; 
   return false; 
  } 
  return true; 
 } 
 /** 
  *  
  * @描述:根据文件名读取excel文件 
  *  
  * @时间:2011-8-9 下午03:17:45 
  *  
  * @参数:@param fileName 
  *  
  * @参数:@return 
  *  
  * @返回值:List 
  */ 
 public List<List<String>> read(String fileName) { 
  List<List<String>> dataLst = new ArrayList<List<String>>(); 
  InputStream is = null; 
  try { 
   /** 验证文件是否合法 */ 
   if (!validateExcel(fileName)) { 
    System.out.println(errorInfo); 
    return null; 
   } 
   /** 判断文件的类型,是2003还是2007 */ 
   boolean isExcel2003 = true; 
   if (WDWUtil.isExcel2007(fileName)) { 
    isExcel2003 = false; 
   } 
   /** 调用本类提供的根据流读取的方法 */ 
   File file = new File(fileName); 
   is = new FileInputStream(file); 
   dataLst = read(is, isExcel2003); 
   is.close(); 
  } catch (Exception ex) { 
   ex.printStackTrace(); 
  } finally { 
   if (is != null) { 
    try { 
     is.close(); 
    } catch (IOException e) { 
     is = null; 
     e.printStackTrace(); 
    } 
   } 
  } 
  /** 返回最后读取的结果 */ 
  return dataLst; 
 } 
 /** 
  *  
  * @描述:根据流读取Excel文件 
  *  
  * @时间:2011-8-9 下午04:12:41 
  *  
  * @参数:@param inputStream 
  *  
  * @参数:@param isExcel2003 
  *  
  * @参数:@return 
  *  
  * @返回值:List 
  */ 
 public List<List<String>> read(InputStream inputStream, boolean isExcel2003) { 
  List<List<String>> dataLst = null; 
  try { 
   /** 根据版本选择创建Workbook的方式 */ 
   Workbook wb = isExcel2003 ? new HSSFWorkbook(inputStream) 
     : new XSSFWorkbook(inputStream); 
   dataLst = read(wb); 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
  return dataLst; 
 } 
 /** 
  *  
  * @描述:读取数据 
  *  
  * @时间:2011-8-9 下午04:37:25 
  *  
  * @参数:@param wb 
  *  
  * @参数:@return 
  *  
  * @返回值:List<List<String>> 
  */ 
 private List<List<String>> read(Workbook wb) { 
  List<List<String>> dataLst = new ArrayList<List<String>>(); 
  /** 得到第一个shell */ 
  Sheet sheet = wb.getSheetAt(0); 
  /** 得到Excel的行数 */ 
  this.totalRows = sheet.getPhysicalNumberOfRows(); 
  /** 得到Excel的列数 */ 
  if (this.totalRows >= 1 && sheet.getRow(0) != null) { 
   this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells(); 
  } 
  /** 循环Excel的行 */ 
  for (int r = 0; r < this.totalRows; r++) { 
   Row row = sheet.getRow(r); 
   if (row == null) { 
    continue; 
   } 
   List<String> rowLst = new ArrayList<String>(); 
   /** 循环Excel的列 */ 
   for (short c = 0; c < this.getTotalCells(); c++) { 
    Cell cell = row.getCell(c); 
    String cellValue = ""; 
    if (cell == null) { 
     rowLst.add(cellValue); 
     continue; 
    } 
    /** 处理Excel的字符串 */ 
    // cellValue = cell.getStringCellValue(); 
    // rowLst.add(cellValue); 
    switch (cell.getCellType()) { 
    // 假如当前Cell的Type为NUMERIC 
    case HSSFCell.CELL_TYPE_NUMERIC: { 
     // 判定当前的cell是否为Date 
     if (HSSFDateUtil.isCellDateFormatted(cell)) { 
      // 假如是Date类型则,取得该Cell的Date值 
      Date date = cell.getDateCellValue(); 
      // 把Date转换本钱地格式的字符串 
      cellValue = cell.getDateCellValue().toLocaleString(); 
     } 
     // 假如是纯数字 
     else { 
      // 纯数字时,一般为电话号码或手机号,所以以字符串类型保存 
      cell.setCellType(Cell.CELL_TYPE_STRING); 
      cellValue = cell.getStringCellValue(); 
      // // 取得当前Cell的数值 
      // Integer num = new Integer((int) 
      // cell.getNumericCellValue()); 
      // cellValue = String.valueOf(num); 
     } 
     break; 
    } 
    // 假如当前Cell的Type为STRIN 
    case HSSFCell.CELL_TYPE_STRING: 
     // 取得当前的Cell字符串 
     cellValue = cell.getStringCellValue().replaceAll("'", "''"); 
     break; 
    // 默认的Cell值 
    default: 
     cellValue = " "; 
    } 
    rowLst.add(cellValue); 
   } 
   /** 保存第r行的第c列 */ 
   dataLst.add(rowLst); 
  } 
  return dataLst; 
 } 
 /** 
  *  
  * @描述:main测试方法 
  *  
  * @时间:2011-8-9 下午04:31:35 
  *  
  * @参数:@param args 
  *  
  * @参数:@throws Exception 
  *  
  * @返回值:void 
  */ 
 public static void main(String[] args) throws Exception { 
  InputExcelFileService poi = new InputExcelFileService(); 
  // List<List<String>> list = poi.read("d:/aaa.xls"); 
  List<List<String>> list = poi.read("d:/aab.xlsx"); 
  if (list != null) { 
   for (int i = 0, ilen = list.size(); i < ilen; i++) { 
    System.out.println("第" + (i + 1) + "行"); 
    List<String> cellList = list.get(i); 
    for (int j = 0, jlen = cellList.size(); j < jlen; j++) { 
     System.out.print("    第" + (j + 1) + "列值:"); 
     System.out.println(cellList.get(j)); 
    } 
   } 
  } 
 } 
 public List wdwExcelMethod(String path) { 
  InputExcelFileService poi = new InputExcelFileService(); 
  List<List<String>> list = poi.read(path); 
  return list; 
 } 
} 
/** 
 *  
 * @描述:工具类 
 *  
 * @时间:2011-8-9 下午04:28:43 
 */ 
class WDWUtil { 
 /** 
  *  
  * @描述:是否是2003的excel,返回true是2003 
  *  
  * @时间:2011-8-9 下午03:20:49 
  *  
  * @参数:@param fileName 
  *  
  * @参数:@return 
  *  
  * @返回值:boolean 
  */ 
 public static boolean isExcel2003(String fileName) { 
  return fileName.matches("^.+//.(?i)(xls)$"); 
 } 
 /** 
  *  
  * @描述:是否是2007的excel,返回true是2007 
  *  
  * @时间:2011-8-9 下午03:21:37 
  *  
  * @参数:@param fileName 
  *  
  * @参数:@return 
  *  
  * @返回值:boolean 
  */ 
 public static boolean isExcel2007(String fileName) { 
  return fileName.matches("^.+//.(?i)(xlsx)$"); 
 } 
   
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10125.html

(0)
上一篇 2021年7月19日 10:00
下一篇 2021年7月19日 10:00

相关推荐

发表回复

登录后才能评论