Excel文件校驗

来源:https://www.cnblogs.com/lunyu/archive/2022/06/29/16425192.html
-Advertisement-
Play Games

昨晚我正在床上睡得著著的,突然來了一條簡訊。 啥,線上MySQL死鎖了,我趕緊登錄線上系統,查看業務日誌。 ...


excel文件校驗

工作中,經常存在excel文件的導入導出的相關工作,因此正確的文件格式校驗成為必須。
不合適的文件校驗方式會導致非法文件跳過校驗,從而產生不必要的麻煩。
比如,通過文件尾碼名的方式進行校驗,這種方式其實是存在問題的,因為尾碼名可自定義。
正確的校驗方式,則應該根據文件流相關屬性進行判斷。

下麵,根據個人工作和參考其他人的經驗,逐一進行說明。

一、excel文件兩種格式

正常excel存在兩種常見的格式,分別是 2003 和 2007格式,
其文件尾碼名分別是.xls.xlsx。2007版相對與2003版最大的變動是它的文件格式,使用xml語言的壓縮方式,更規範也更適合新的需求。

兩種格式,都仍有人在同時使用,我個人推薦 2007 格式。

序號 名稱 尾碼名 文件格式 相容性
1 2003 .xls bin 不向上相容
2 2007 .xlsx xml 向下相容

二、 excel文件校驗

2.1 文件尾碼名校驗

這種方式其實也可以用來校驗,但只屬於初驗。用戶通過修改文件尾碼名,可以繞過這種校驗方式。
比如,demo.txt文件,我們可以強制修改文件尾碼名,讓它變成demo.xls文件。

通常校驗的方式是文件名尾碼截取,只截取最後一個. 字元後的內容, 或者使用正則表達式。

2.2 apache poi 3.xx 版本校驗excel

處理excel的開源jar包有兩個,一個是jxl, 一個是 apache poi,現在主流的是後者。

apache poi 3.xx 版本校驗excel跟 4.xx版本存在不同,這裡僅就本人遇到的情況進行說明。
這裡3.xx版本使用的是3.10.1版本。

  1. 引入相關依賴

    這裡引入了httpcomponentsjar包,為了進行文件類型File -> MultipartFile的轉換,畢竟web項目經常使用的是MultipartFile格式的入參文件。

    dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi</artifactId>
       <version>3.10.1</version>
     </dependency>
    
     <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>3.10.1</version>
     </dependency>
    
     <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.5.9</version>
     </dependency>
    
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>5.3.19</version>
       <scope>compile</scope>
     </dependency>
    
  2. 校驗方法

    package com.lunyu.tools.poi.excel;
    
     import java.io.File;
     import java.io.FileInputStream;
     import java.io.IOException;
     import java.io.InputStream;
     import java.io.PushbackInputStream;
     import org.apache.http.entity.ContentType;
     import org.apache.poi.POIXMLDocument;
     import org.apache.poi.poifs.filesystem.POIFSFileSystem;
     import org.springframework.mock.web.MockMultipartFile;
     import org.springframework.web.multipart.MultipartFile;
    
     /**
     * Excel 校驗
     * @author lunyu
     * @since 2022/6/25
     */
     public class ExcelPoi3Main {
    
         public static void main(String[] args) throws IOException {
    
             File file = new File("poi/excel/demo.xls");
    
             FileInputStream fileInputStream = new FileInputStream(file);
    
             //轉成MultipartFile
             MultipartFile mf = new MockMultipartFile(file.getName(), file.getName(),
                 ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
    
             // 執行校驗
             boolean checkResult = checkExcelValid(mf);
    
             System.out.println("excel = " + file.getName() +  "校驗結果: " + checkResult);
    
             // TODO: 進一步要做的操作
         }
    
         /**
         * 檢驗excel合法性
         * @param mf
         * @return
         * @throws IOException
         */
         private static boolean checkExcelValid(MultipartFile mf) throws IOException {
    
             InputStream is = mf.getInputStream();
             if(! is.markSupported()) {
             is = new PushbackInputStream(is, 8);
             }
    
             // 校驗excel格式
         return POIFSFileSystem.hasPOIFSHeader(is) || POIXMLDocument.hasOOXMLHeader(is);
         }
     }
    
    

    需要進行說明的是,在3.xx 版本中,POIFSFileSystem.hasPOIFSHeader(InputStream is)方法用於校驗excel文件是否符合xls格式,而POIXMLDocument.hasOOXMLHeader(InputStream is)方法則用於校驗excel文件是否符合xlsx格式。

2.3 apache poi 4.xx 版本校驗excel

同上,我們先引入需要的jar包。

  1. 引入相關依賴

    dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi</artifactId>
       <version>4.1.2</version>
     </dependency>
    
     <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>4.1.2</version>
     </dependency>
    
     <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.5.9</version>
     </dependency>
    
     <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>5.3.19</version>
       <scope>compile</scope>
     </dependency>
    
  2. 編寫校驗方法

    package com.lunyu.tools.poi.excel;
    
     import java.io.File;
     import java.io.FileInputStream;
     import java.io.IOException;
     import java.io.InputStream;
     import org.apache.http.entity.ContentType;
     import org.apache.poi.EmptyFileException;
     import org.apache.poi.poifs.filesystem.FileMagic;
     import org.springframework.mock.web.MockMultipartFile;
     import org.springframework.web.multipart.MultipartFile;
    
     /**
     * Excel 校驗
     * @author lunyu
     * @since 2022/6/25
     */
     public class ExcelPoi4Main {
    
         public static void main(String[] args) throws IOException {
    
             File file = new File("poi/excel/demo.txt");
    
             FileInputStream fileInputStream = new FileInputStream(file);
    
             //轉成MultipartFile
             MultipartFile mf = new MockMultipartFile(file.getName(), file.getName(),
                 ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
    
             // 執行校驗
             boolean checkResult = checkExcelValid(mf);
    
             System.out.println("excel = " + file.getName() +  "校驗結果: " + checkResult);
    
             // TODO: 進一步要做的操作
         }
    
         /**
         * 檢驗excel合法性
         * @param mf
         * @return
         * @throws IOException
         */
         private static boolean checkExcelValid(MultipartFile mf) throws IOException {
    
             InputStream is = mf.getInputStream();
    
             is = FileMagic.prepareToCheckMagic(is);
    
             FileMagic fm;
             try {
             fm = FileMagic.valueOf(is);
             }catch (EmptyFileException e) {
             System.out.println(e.getMessage());
             return false;
             }
    
             return FileMagic.OLE2.equals(fm) || FileMagic.OOXML.equals(fm);
         }
    
    
     }
    
    

    4.xx 版本中,方法FileMagic.OLE2.equals(FileMagic fm)用於校驗excel是否是xls格式,方法FileMagic.OOXML.equals(FileMagic fm) 用於校驗excel是否是xlsx格式。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AntDesignVue --tree 樹形插件自定義圖標。 index.vue樹形區域的代碼如下,重點就是①那個“showIcon” 參數要等於“true”;②寫幾個img標簽顯示你自定義的圖標,img標簽加“slot”屬性。 <a-tree showIcon="true" showLine > ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、談談你對MVVM的理解? 映射關係簡化,隱藏controller MVVM在MVC的基礎上,把控制層隱藏掉了。 Vue不是一個MVVM框架,它是一個視圖層框架。 ViewModal是一個橋梁,將數據和視圖進行關聯。 二、談談你對Vue ...
  • 今天,遇到了一個很有意思的問題,一名群友問我,僅僅使用 CSS,能否實現這樣一種響應式的佈局效果: 簡單解析一下效果: 在屏幕視口較為寬時,表現為一個整體 Table 的樣式 而當屏幕視口寬度較小時,原 Table 的每一行數據單獨拆分為一個 Table 進行展示 很有意思的一個響應式佈局,讓信息在 ...
  • 前言 在瞭解原型和原型鏈之前,我們先瞭解一部分概念,constructor,prototype,proto。 constructor 在之前判斷數據類型的文章: javaScript常見數據類型檢查校驗 有提到過關於構造函數的屬性constructor constructor 的是返回創建實例對象的 ...
  • 前言 我們可以使用SpringCloud框架中Feign組完成微服務之間的遠程調用; 但是Feign組件底層基於HTTP協議,HTTP協議的特點是請求同步,而且既需要請求也需要響應,屬於同步遠程調用; 微服務架構在同步遠程調用的場景下,如果服務提供者一直沒有響應服務消費者,很容易造成服務雪崩; 如果 ...
  • BUAA_OO_U4_Summary 一 / 架構設計 1.0> 題目解析 實現UML類圖的分析。 1.1> HW13 1.1.1> 關於UML 從JML到UML,對於從模型到實現的能力訓練,此單元從上一單元的Java Modeling Language升級到了Unified Modeling La ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 眾所周知,所有權是Rust區別於其他語言的一大特色,只要代碼滿足了所有權規則,我們就不用擔心記憶體的泄露的問題。 讓代碼在編譯階段就解決記憶體的問題,而不是在運行崩潰後再調試。 Rust中,所有權和借用的規則其實並不複雜,所有權有3條規則,借用只有2條規則。 所有權的規則 1. Rust中的每一個值都有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...