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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...