Excel文件校验

打印 上一主题 下一主题

主题 752|帖子 752|积分 2256

excel文件校验

工作中,经常存在excel文件的导入导出的相关工作,因此正确的文件格式校验成为必须。
不合适的文件校验方式会导致非法文件跳过校验,从而产生不必要的麻烦。
比如,通过文件后缀名的方式进行校验,这种方式其实是存在问题的,因为后缀名可自定义。
正确的校验方式,则应该根据文件流相关属性进行判断。
下面,根据个人工作和参考其他人的经验,逐一进行说明。
一、excel文件两种格式

正常excel存在两种常见的格式,分别是 2003 和 2007格式,
其文件后缀名分别是.xls 和 .xlsx。2007版相对与2003版最大的变动是它的文件格式,使用xml语言的压缩方式,更规范也更适合新的需求。
两种格式,都仍有人在同时使用,我个人推荐 2007 格式。
序号名称后缀名文件格式兼容性12003.xlsbin不向上兼容22007.xlsxxml向下兼容二、 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版本。

  • 引入相关依赖
    这里引入了httpcomponentsjar包,为了进行文件类型File -> MultipartFile的转换,毕竟web项目经常使用的是MultipartFile格式的入参文件。
    1. dependency>
    2.    <groupId>org.apache.poi</groupId>
    3.    <artifactId>poi</artifactId>
    4.    <version>3.10.1</version>
    5. </dependency>
    6. <dependency>
    7.    <groupId>org.apache.poi</groupId>
    8.    <artifactId>poi-ooxml</artifactId>
    9.    <version>3.10.1</version>
    10. </dependency>
    11. <dependency>
    12.    <groupId>org.apache.httpcomponents</groupId>
    13.    <artifactId>httpclient</artifactId>
    14.    <version>4.5.9</version>
    15. </dependency>
    16. <dependency>
    17.    <groupId>org.springframework</groupId>
    18.    <artifactId>spring-test</artifactId>
    19.    <version>5.3.19</version>
    20.    <scope>compile</scope>
    21. </dependency>
    复制代码
  • 校验方法
    1. package com.lunyu.tools.poi.excel;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import java.io.PushbackInputStream;
    7. import org.apache.http.entity.ContentType;
    8. import org.apache.poi.POIXMLDocument;
    9. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    10. import org.springframework.mock.web.MockMultipartFile;
    11. import org.springframework.web.multipart.MultipartFile;
    12. /**
    13. * Excel 校验
    14. * @author lunyu
    15. * @since 2022/6/25
    16. */
    17. public class ExcelPoi3Main {
    18.      public static void main(String[] args) throws IOException {
    19.          File file = new File("poi/excel/demo.xls");
    20.          FileInputStream fileInputStream = new FileInputStream(file);
    21.          //转成MultipartFile
    22.          MultipartFile mf = new MockMultipartFile(file.getName(), file.getName(),
    23.              ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
    24.          // 执行校验
    25.          boolean checkResult = checkExcelValid(mf);
    26.          System.out.println("excel = " + file.getName() +  "校验结果: " + checkResult);
    27.          // TODO: 进一步要做的操作
    28.      }
    29.      /**
    30.      * 检验excel合法性
    31.      * @param mf
    32.      * @return
    33.      * @throws IOException
    34.      */
    35.      private static boolean checkExcelValid(MultipartFile mf) throws IOException {
    36.          InputStream is = mf.getInputStream();
    37.          if(! is.markSupported()) {
    38.          is = new PushbackInputStream(is, 8);
    39.          }
    40.          // 校验excel格式
    41.      return POIFSFileSystem.hasPOIFSHeader(is) || POIXMLDocument.hasOOXMLHeader(is);
    42.      }
    43. }
    复制代码
    需要进行说明的是,在3.xx 版本中,POIFSFileSystem.hasPOIFSHeader(InputStream is)方法用于校验excel文件是否符合xls格式,而POIXMLDocument.hasOOXMLHeader(InputStream is)方法则用于校验excel文件是否符合xlsx格式。
2.3 apache poi 4.xx 版本校验excel

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

  • 引入相关依赖
    1. dependency>
    2.    <groupId>org.apache.poi</groupId>
    3.    <artifactId>poi</artifactId>
    4.    <version>4.1.2</version>
    5. </dependency>
    6. <dependency>
    7.    <groupId>org.apache.poi</groupId>
    8.    <artifactId>poi-ooxml</artifactId>
    9.    <version>4.1.2</version>
    10. </dependency>
    11. <dependency>
    12.    <groupId>org.apache.httpcomponents</groupId>
    13.    <artifactId>httpclient</artifactId>
    14.    <version>4.5.9</version>
    15. </dependency>
    16. <dependency>
    17.    <groupId>org.springframework</groupId>
    18.    <artifactId>spring-test</artifactId>
    19.    <version>5.3.19</version>
    20.    <scope>compile</scope>
    21. </dependency>
    复制代码
  • 编写校验方法
    1. package com.lunyu.tools.poi.excel;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.io.IOException;
    5. import java.io.InputStream;
    6. import org.apache.http.entity.ContentType;
    7. import org.apache.poi.EmptyFileException;
    8. import org.apache.poi.poifs.filesystem.FileMagic;
    9. import org.springframework.mock.web.MockMultipartFile;
    10. import org.springframework.web.multipart.MultipartFile;
    11. /**
    12. * Excel 校验
    13. * @author lunyu
    14. * @since 2022/6/25
    15. */
    16. public class ExcelPoi4Main {
    17.      public static void main(String[] args) throws IOException {
    18.          File file = new File("poi/excel/demo.txt");
    19.          FileInputStream fileInputStream = new FileInputStream(file);
    20.          //转成MultipartFile
    21.          MultipartFile mf = new MockMultipartFile(file.getName(), file.getName(),
    22.              ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
    23.          // 执行校验
    24.          boolean checkResult = checkExcelValid(mf);
    25.          System.out.println("excel = " + file.getName() +  "校验结果: " + checkResult);
    26.          // TODO: 进一步要做的操作
    27.      }
    28.      /**
    29.      * 检验excel合法性
    30.      * @param mf
    31.      * @return
    32.      * @throws IOException
    33.      */
    34.      private static boolean checkExcelValid(MultipartFile mf) throws IOException {
    35.          InputStream is = mf.getInputStream();
    36.          is = FileMagic.prepareToCheckMagic(is);
    37.          FileMagic fm;
    38.          try {
    39.          fm = FileMagic.valueOf(is);
    40.          }catch (EmptyFileException e) {
    41.          System.out.println(e.getMessage());
    42.          return false;
    43.          }
    44.          return FileMagic.OLE2.equals(fm) || FileMagic.OOXML.equals(fm);
    45.      }
    46. }
    复制代码
    4.xx 版本中,方法FileMagic.OLE2.equals(FileMagic fm)用于校验excel是否是xls格式,方法FileMagic.OOXML.equals(FileMagic fm) 用于校验excel是否是xlsx格式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表