使用POI解析Excel中的数据

前言:

三月的风没有吹散雾霾,那么就让四月的阳光洒满大地吧,忘记过往,展望未来。三月再见,四月你好。

最近在使用POI 将Excel中的数据导入到数据库中,接下来我将介绍一下如何使用POI。

概念:

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

步骤:

  • (1)在pom.xml 中导入jar 包。
  <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
  • (2)前端页面。

    <template>
    <div class="root">
     
            <el-upload class="zh-upload"  :before-upload="beforeExportExcel" :show-file-list=false  :action="UploadUrl()" :on-success="exportExcel" :file-list="fileList">
                <el-button type="primary" size="mini"  >导入模板</el-button>
            </el-upload>
    </div>
</template>

<script>
  export default {
      name: "Register",
      data() {
          return {
              fileList:[],
              Register: {
                  phone: '',
                  sendcode: '',
              },
              disabled: false,
              time: 0,
              btntxt: "重新发送",
              timeToggle:false,
              dataTable:{
                pid:"11",
                mie:'dasdasdasd'
              }
          }
      },
      created() {
        const {pid} = this.dataTable
        console.log(pid)
      },
      methods: {
        //导入
        importClick() {

        },
        UploadUrl () {
          return '/api/readExcelData'
        },
        // 导出
        beforeExportExcel(file) {
          console.log(file)
            const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';

            if (!isXLSX) {
                this.$message.error('上传模板只能是 XLSX 格式!');
            }
            return isXLSX ;
        },
        exportExcel (file, fileList) {

          if (file.result="true") {
              this.$message({
                  message: file.message,
                  type: 'success'
              });
          }else {
              this.$message({
                  message: file.message,
                  type: 'error'
              });
          }
        },
      }
  }
</script>




  • (3)后台接口。 

  接口:readExcelData

  /**
     * 导入excel
     *
     * @param
     * @return
     */
    @PostMapping(value = "/readExcelData")
    public ResultData readExcel(MultipartFile file, HttpSession session) {
        ResultData result = new ResultData();
        if (!file.isEmpty()) {
            try {
                //取得文件原名
                String filename = file.getOriginalFilename();
                //取得文件后缀名
                Integer indexStar = filename.lastIndexOf(".") + 1;
                //取得文件后缀名
                String excelTypeName = filename.substring(indexStar);
                //当前登录用户
                BosUserModel userModel = (BosUserModel) session.getAttribute("user");
                //解析Excel中的数据
                result = poiExcelService.readExcelToCustomer(file.getInputStream(), excelTypeName, userModel.getName());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
  • (4)PoiExcelService 类中的信息:
 public static final String EXCEL_TYPE_2007 = "xlsx";
/**
     * 读取Excel中的数据到客户表中
     * @param inputStream
     * @param excelTypeName
     * @param name
     */
    @Override
    public ResultData readExcelToCustomer(InputStream inputStream, String excelTypeName, String name) {
        ResultData resultData = new ResultData();
        Workbook wb = null;
        try {
            if (EXCEL_TYPE_2007.equals(excelTypeName)) {
                wb = new XSSFWorkbook(inputStream);
            } else {
                wb = new HSSFWorkbook(inputStream);
            }
            //获得excel中第一个表格
            Sheet sheet = wb.getSheetAt(0);
            boolean flag = true;
            for (Row cells : sheet) {
                //跳过第一行
                if (flag == true) {
                    flag = false;
                    continue;
                }

                System.out.println("第1个字段:----"+toStringValue(cells.getCell(0)));
                System.out.println("第2个字段:----"+toStringValue(cells.getCell(1)));
                System.out.println("第3个字段:----"+toStringValue(cells.getCell(2)));
                System.out.println("第4个字段:----"+toStringValue(cells.getCell(3)));
                System.out.println("第5个字段:----"+toStringValue(cells.getCell(4)));
                System.out.println("第6个字段:----"+toStringValue(cells.getCell(5)));

            }
            resultData.setResult("true");
            resultData.setMessage("导入客户数据成功");
        } catch (Exception e) {
            resultData.setResult("false");
            resultData.setMessage("导入客户数据失败");
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            logger.error("导入数据到商机表单中失败",e);
        }
        return resultData;
    }

其实我这篇文章读取Excel 中的数据的时候,有一个问题,就是 toStringValue() 我将读取到的值全都转换成了String ,如果Excel 中有一行字段是时间类型的值,解析出来的数据就有问题。我用了下面这个方法就没问题了。我参考的是这篇文章

 public static String getCellStringValue(Cell cell) {
        String cellValue = "";
        if (cell != null) {
            // cell.getCellTypeEnum(),获取单元格类型,case不同类型进行不同处理
            switch (cell.getCellTypeEnum()) {
                case _NONE: // 未知类型,用于表示初始化前的状态或缺少具体类型。仅供内部使用。
                    break;
                case NUMERIC: // 数字类型 小数,整数,日期

                    // 如果是数字类型的话,判断是不是日期类型
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        Date d = cell.getDateCellValue();
                        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                        cellValue = formatter.format(d);
                    } else if(cell.getCellStyle().getDataFormat() == 57) {
                        Date d = cell.getDateCellValue();
                        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
                        cellValue = formatter.format(d);
                    } else {
                        DecimalFormat df = new DecimalFormat("0");
                        cellValue = df.format(cell.getNumericCellValue());
                    }

                    break;
                case STRING: // 字符串类型
                    cellValue = cell.getStringCellValue();
                    break;
                case FORMULA: // 公式类型
                    cellValue = String.valueOf(cell.getNumericCellValue());
                    break;
                case BLANK: // 空白的单元格
                    break;
                case BOOLEAN: // 布尔类型
                    break;
                case ERROR: // 错误类型
                    break;
                default:
                    break;
            }
        }
        return cellValue;
    }
  • (5)其他类中的信息:
   public static String toStringValue(Cell cell) {
        if (cell != null) {
            cell.setCellType(Cell.CELL_TYPE_STRING);
            return cell.toString();
        } else {
            return "";
        }
    }
  • (6)测试整个功能:

准备一个Excel

 

 解析后的数据如下:

至此就大功告成了。

发布了73 篇原创文章 · 获赞 59 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/105230422