Poi讀取xlsx文件

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() ;
        }
        
    }
    
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章