使用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

 

 解析後的數據如下:

至此就大功告成了。

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