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/10125.html

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

相关推荐

发表回复

登录后才能评论