閱讀189 返回首頁    go iPhone_iPad_Mac_apple


Java spring mvc jsp excel 導入

pom文件添加

<!-- poi jar 解析excel -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.12</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    artifactId>commons-fileupload</artifactId>
</dependency>

spring配置

    <!-- 文件上傳表單的視圖解析器 -->
    <bean 
        >
    </bean>

jsp頁麵代碼

<button name="importBtn"  type="button"><i ></i> 批量導入</button>
......
<!-- excel上傳 -->
<form  method="post" enctype="multipart/form-data">
    <input type="file" name="uploadFile" />
</form>

js代碼

$(".addExcelBtn").unbind('click');
    $(".addExcelBtn").click(function() {
        $(".import").unbind('click');
        $(".import").click(function() {
            $('input[type="file"][name="uploadFile"]').click();
        });

        $('input[type="file"]').unbind("change");
        $('input[type="file"]').change(function () {
            uploadFile();
            $('input[type="file"][name="uploadFile"]').val("");
        });
    });


function uploadFile() {
    var fileName = $('input[type="file"][name="uploadFile"]').val();
    if (fileName === '') {
        frameModal.hitModal("請選擇文件");
        return;
    }
    var fileType = (fileName.substring(fileName
            .lastIndexOf(".") + 1, fileName.length))
            .toLowerCase();
    if (fileType !== 'xls' && fileType !== 'xlsx') {
        frameModal.hitModal("文件格式不正確,excel文件!");
        return;
    }

    $(".fileForm").ajaxSubmit({
        dataType : "json",
        data: {'1': 1},
        type: "POST",
        url: 'url',
        success : function(data, textStatus) {
            console.log(data);
        },
        error: function () {
            frameModal.hitModal('操作失敗');
        }
    });
};

controller代碼

@RequestMapping(value = "/uploadExcel.action", method = RequestMethod.POST)
    @ResponseBody
    public ResponseVo uploadExcel(HttpServletRequest request) {
        // 創建一個通用的多部分解析器
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 判斷 request 是否有文件上傳,即多部分請求
        if (multipartResolver.isMultipart(request)) {
            // 轉換成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            MultipartFile file = multiRequest.getFile("uploadFile");
            try {
                //excelUtil工具類
                List<String[]> res = ExcelUtil.readExcel(file);
                if (res != null && res.size() > 0) {
                    //存庫或者其他處理邏輯
                }
            } catch (IOException e) {

            }
        }

        return null;
    }

excelUtil工具類

import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStream;  
import java.text.DecimalFormat;
import java.util.ArrayList;  
import java.util.List;  

import org.apache.log4j.Logger;  
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; 

/** 
* @ClassName: ExcelUtil 
* @Description: Excel導入導出工具類
*/
public class ExcelUtil {

    private static Logger logger  = Logger.getLogger(ExcelUtil.class);  
    private final static String xls = "xls";  
    private final static String xlsx = "xlsx";  

    /** 
     * 讀入excel文件,解析後返回 
     * @param file 
     * @throws IOException  
     */  
    public static List<String[]> readExcel(MultipartFile file) throws IOException{  
        //檢查文件  
        checkFile(file);  
        //獲得Workbook工作薄對象  
        Workbook workbook = getWorkBook(file);  
        //創建返回對象,把每行中的值作為一個數組,所有行作為一個集合返回  
        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();  
                //循環除了第一行的所有行  
                //for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){  
                int firstColumn = 0;
                for(int rowNum = firstRowNum;rowNum <= lastRowNum;rowNum++){  
                    //獲得當前行  
                    Row row = sheet.getRow(rowNum);  
                    if(row == null){  
                        continue;  
                    }  
                    //獲得當前行的開始列  
                    //int firstCellNum = row.getFirstCellNum();  
                    int firstCellNum =  0;
                    //獲得當前行的列數  
                    int lastCellNum = row.getPhysicalNumberOfCells();
                    if (rowNum == firstRowNum) {
                        firstColumn = lastCellNum;
                    }
                    String[] cells = new String[firstColumn];  
                    //循環當前行  
                    for(int cellNum = firstCellNum; cellNum < firstColumn;cellNum++){  
                        Cell cell = row.getCell(cellNum);  
                        cells[cellNum] = getCellValue(cell);  
                    }  
                    list.add(cells);  
                }  
            }  
            workbook.close();  
        }  
        return list;  
    }  
    public static void checkFile(MultipartFile file) throws IOException{  
        //判斷文件是否存在  
        if(null == file){  
            logger.error("文件不存在!");  
            throw new FileNotFoundException("文件不存在!");  
        }  
        //獲得文件名  
        String fileName = file.getOriginalFilename();  
        //判斷文件是否是excel文件  
        if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){  
            logger.error(fileName + "不是excel文件");  
            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){ 
        DecimalFormat df = new DecimalFormat("#"); 
        String cellValue = "";  
        if(cell == null){  
            return "";  
        }  
        //把數字當成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());  
                //double c = cell.getNumericCellValue();
                //cellValue = df.format(c);
                //BigDecimal big = new BigDecimal(cell.getNumericCellValue());
                double c = cell.getNumericCellValue();
                cellValue = df.format(c);
                break;  
            case Cell.CELL_TYPE_STRING: //字符串  
                //cellValue = String.valueOf(cell.getStringCellValue());  
                cellValue = cell.getStringCellValue().toString();
                break;  
            case Cell.CELL_TYPE_BOOLEAN: //Boolean  
                cellValue = String.valueOf(cell.getBooleanCellValue());  
                break;  
            case Cell.CELL_TYPE_FORMULA: //公式  
                cellValue = String.valueOf(cell.getCellFormula());  
                break;  
            case Cell.CELL_TYPE_BLANK: //空值   
                cellValue = "";  
                break;  
            case Cell.CELL_TYPE_ERROR: //故障  
                cellValue = "非法字符";  
                break;  
            default:  
                cellValue = "未知類型";  
                break;  
        }  
        return cellValue;  
    }  
}

注意:
1.excel中如果有長數字如果在getCellValue時不把類型轉換為字符串類型,可能會導致數字損失精度
2.工具類原方法中解析excel是根據每行中的列數去獲取,修改了工具類,如果列獲取不到數值,就返回空。

最後更新:2017-07-26 11:33:25

  上一篇:go  觀點/正確判讀大數據 物聯網命脈
  下一篇:go  搶物聯網商機 中國三大電信商掀戰火