package com.inks.hb.utils ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileNotFoundException ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.OutputStream ;
import java.util.ArrayList ;
import java.util.List ;
import org.apache.commons.fileupload.FileItem ;
import org.apache.commons.fileupload.FileItemFactory ;
import org.apache.commons.fileupload.disk.DiskFileItemFactory ;
import org.apache.log4j.Logger ;
import org.apache.log4j.PropertyConfigurator ;
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.web.multipart.MultipartFile ;
import org.springframework.web.multipart.commons.CommonsMultipartFile ;
import com.alibaba.fastjson.JSON ;
import com.google.gson.Gson ;
import com.google.gson.GsonBuilder ;
public class ReadExcelTools {
private static final Logger logger = Logger.getLogger(ReadExcelTools.class) ;
private static final Gson gson = new GsonBuilder().serializeNulls().create() ;
private final static String xls = "xls" ;
private final static String xlsx = "xlsx" ;
/**
* 讀入excel文件,解析後返回
* @param file
* @throws IOException
*/
public static List<ExcelDataVoBean> readExcel(MultipartFile file) throws IOException {
// 檢查文件
checkFile(file) ;
// 獲得Workbook工作薄對象
Workbook workbook = getWorkBook(file) ;
// 創建返回對象,把每行中的值作爲一個數組,所有行作爲一個集合返回
List<ExcelDataVoBean> listExcelDataVoBean = new ArrayList<ExcelDataVoBean>() ;
List<String []> list = new ArrayList<String []>() ;
if (workbook != null) {
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
// 獲得當前sheet工作表
Sheet sheet = workbook.getSheetAt(sheetNum) ;
if (sheet == null) {
continue ;
}
// 獲得當前sheet的開始行
int firstRowNum = sheet.getFirstRowNum() ;
// 獲得當前sheet的結束行
int lastRowNum = sheet.getLastRowNum() ;
Row rowFirst = sheet.getRow(0) ;
// 循環除了第一行的所有行
for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) { // 爲了過濾到第一行因爲我的第一行是數據庫的列
// 獲得當前行
Row row = sheet.getRow(rowNum) ;
if (row == null) {
continue ;
}
// 獲得當前行的開始列
int firstCellNum = row.getFirstCellNum() ;
// 獲得當前行的列數
int lastCellNum = row.getLastCellNum() ;// 爲空列獲取
// int lastCellNum = row.getPhysicalNumberOfCells();//爲空列不獲取
// String[] cells = new
// String[row.getPhysicalNumberOfCells()];
String [] cells = new String [row.getLastCellNum()] ;
// 循環當前行
for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
Cell cell = row.getCell(cellNum) ;
cells[cellNum] = getCellValue(cell) ;
//
if (rowFirst.getCell(cellNum).getStringCellValue().equals("record_id")) {
ExcelDataVoBean excelDataVoBean = new ExcelDataVoBean() ;
excelDataVoBean.setRecord_id(getCellValue(cell)) ;
listExcelDataVoBean.add(excelDataVoBean) ;
}
}
list.add(cells) ;
}
}
}
// logger.info(gson.toJson(list)) ;
return listExcelDataVoBean ;
}
public static void checkFile(MultipartFile file) throws IOException {
// 判斷文件是否存在
if (null == file) { throw new FileNotFoundException("文件不存在!") ; }
// 獲得文件名
String fileName = file.getOriginalFilename() ;
// 判斷文件是否是excel文件
if (!fileName.endsWith(xls) && !fileName.endsWith(xlsx)) { throw new IOException(fileName + "不是excel文件") ; }
}
public static Workbook getWorkBook(MultipartFile file) {
// 獲得文件名
String fileName = file.getOriginalFilename() ;
// 創建Workbook工作薄對象,表示整個excel
Workbook workbook = null ;
try {
// 獲取excel文件的io流
InputStream is = file.getInputStream() ;
// 根據文件後綴名不同(xls和xlsx)獲得不同的Workbook實現類對象
if (fileName.endsWith(xls)) {
// 2003
workbook = new HSSFWorkbook(is) ;
} else if (fileName.endsWith(xlsx)) {
// 2007
workbook = new XSSFWorkbook(is) ;
}
} catch (IOException e) {
logger.info(e.getMessage()) ;
}
return workbook ;
}
public static String getCellValue(Cell cell) {
String cellValue = "" ;
if (cell == null) { return cellValue ; }
// 把數字當成String來讀,避免出現1讀成1.0的情況
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
cell.setCellType(Cell.CELL_TYPE_STRING) ;
}
// 判斷數據的類型
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC: // 數字
cellValue = String.valueOf(cell.getNumericCellValue()) ;
break ;
case Cell.CELL_TYPE_STRING: // 字符串
cellValue = String.valueOf(cell.getStringCellValue()) ;
break ;
case Cell.CELL_TYPE_BOOLEAN: // Boolean
cellValue = String.valueOf(cell.getBooleanCellValue()) ;
break ;
case Cell.CELL_TYPE_FORMULA: // 公式
// cellValue = String.valueOf(cell.getCellFormula());
cellValue = String.valueOf(cell.getStringCellValue()) ;
break ;
case Cell.CELL_TYPE_BLANK: // 空值
cellValue = "" ;
break ;
case Cell.CELL_TYPE_ERROR: // 故障
cellValue = "非法字符" ;
break ;
default:
cellValue = "未知類型" ;
break ;
}
return cellValue ;
}
private static MultipartFile getMulFileByPath(String picPath) {
FileItem fileItem = createFileItem(picPath) ;
MultipartFile mfile = new CommonsMultipartFile(fileItem) ;
return mfile ;
}
private static FileItem createFileItem(String filePath) {
FileItemFactory factory = new DiskFileItemFactory(16, null) ;
String textFieldName = "textField" ;
int num = filePath.lastIndexOf(".") ;
String extFile = filePath.substring(num) ;
FileItem item = factory.createItem(textFieldName, "text/plain", true, "MyFileName" + extFile) ;
File newfile = new File(filePath) ;
int bytesRead = 0 ;
byte [] buffer = new byte [8192] ;
try {
FileInputStream fis = new FileInputStream(newfile) ;
OutputStream os = item.getOutputStream() ;
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead) ;
}
os.close() ;
fis.close() ;
} catch (IOException e) {
e.printStackTrace() ;
}
return item ;
}
public static void main(String [] args) {
PropertyConfigurator.configure("E:\\2018_swing\\hb\\src\\java\\com\\inks\\hb\\utils\\log4j.properties") ;
// logger.info("hello excel") ;
String filePath = "d:\\testexcel1.xlsx" ;
MultipartFile multipartFile = getMulFileByPath(filePath) ;
ReadExcelTools readExcelTools = new ReadExcelTools() ;
try {
List<ExcelDataVoBean> list = readExcelTools.readExcel(multipartFile) ;
logger.info(JSON.toJSONString(list)) ;
} catch (IOException e) {
e.printStackTrace() ;
}
}
}