java 使用poi实现excel解析

注意:前台可使用layui获取和限制上传文本(https://www.layui.com/demo/upload.html 官方api)

JSP页面: 

<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8">

  <title>layui</title>

  <meta name="renderer" content="webkit">

  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <link rel="stylesheet" href="//res.layui.com/layui/dist/css/layui.css"  media="all">

</head>

<body> 

  <div class="layui-upload">

    <button class="layui-btn layui-btn-normal" id="test8" type="button">选择文件</button>

    <button class="layui-btn" id="test9" type="button">开始上传</button>

 </div>

</body>

<script src="//res.layui.com/layui/dist/layui.js" charset="utf-8"></script>

<script>

layui.use('upload', function(){

  var $ = layui.jquery  ,upload = layui.upload;

//选完文件后不自动上传

  upload.render({

    elem: '#test8'

    ,url: '/upload/'

    ,auto: false

    ,accept: 'file' //普通文件

    ,exts: 'zip|rar|7z' //只允许上传压缩文件

    ,multiple: true//设置MultipartFile(此类型为mvc需再spring中设置 后台获取的input name为‘file’)

    ,bindAction: '#test9'

    ,done: function(res){

   //res 为返回结果

       console.log(res)

    } 

});(res){});

</script>

</html>

java代码:

package com.ws;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

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;

 

/**

 *

 * excel读写工具类 Excel 导入到mysql

 *

 **/

public class PoiUtils {

 

 private static Logger logger = Logger.getLogger(POIUtil.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++) {

   // 获得当前行

     Row row = sheet.getRow(rowNum);

     if (row == null) {

       continue;

     }

    // 获得当前行的开始列

     int firstCellNum = row.getFirstCellNum();

    // 获得当前行的列数

     int lastCellNum = row.getPhysicalNumberOfCells();

     String[] cells = new String[row.getPhysicalNumberOfCells()];

    // 循环当前行

     for (int cellNum = firstCellNum; cellNum < lastCellNum; 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 及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());

   break;

  case Cell.CELL_TYPE_BLANK:

  // 空值

   cellValue = "";

   break;

  case Cell.CELL_TYPE_ERROR:

// 故障

   cellValue = "非法字符";

   break;

  default:

   cellValue = "未知类型";

   break;

  }

  return cellValue;

 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值