NPOI 读取加密.xlsx Excel文件


前言

最近公司内部有个小需求,希望能够有个小工具用来解析Excel加密文件并且能够批量处理及Join多个Sheet中的表内容。

本来想着蛮简单的使用NPOI读取多个Sheet中的表,然后做个筛选并且Join一下,读.xls加密文件比较简单网上搜索就找到解决方案,结果在读取.xlsx的加密文件卡住了,在GitHub上找了一圈终于解决了,记录一下以免碰到相同情况忘记了。


一、基础环境

简单记录下运行环境,以免到时候更新了内容有误

  • 系统:Win 10
  • 框架:.Net 6
  • IDE:VS 2022

二、操作步骤

1.创建项目

通过vs 2022的向导创建,这里我就不多赘述了,基本选择好点击下一步就可以了,这里选择的是:控制台应用程序,创建的项目名称是:ExcelAnalysis。
在这里插入图片描述
创建了一个空白的控制台应用程序,创建完成后是这样的,由于使用的是.NET 6框架,所以Porgam.cs默认用的是顶级语句模板
在这里插入图片描述

2.引入NPOI

接下来可以通过NuGet引入NPOI的程序包,这里使用的是管理界面,如果习惯用命令行可以打开程序包管理控制台
在这里插入图片描述
打开管理界面,搜索NPOI,选择第一个进行安装,我这里安装的版本是预发行版 2.6.0-rc-3,点击安装,如果跳出需要同意选择,点击同意即可
在这里插入图片描述

3.编写代码

主要代码在下面,通过设置NPOI的加密对象及密码就能正常读取数据:

IWorkbook wk = null;
//读取文件流
using (FileStream fileStream = File.OpenRead(FilePath))
using (dynamic fs = new POIFSFileSystem(fileStream))
{
	//加密文件对象
    EncryptionInfo info = new EncryptionInfo(fs);
    Decryptor decryptor = Decryptor.GetInstance(info);
    //设置开启密码
    bool isPasswordCorrect = decryptor.VerifyPassword(password);
    var stream = decryptor.GetDataStream(fs);

    wk = new XSSFWorkbook(stream);

}

4.整体代码

代码如下,通过NPOI解析文件后通过控制台输出,如果需要输出到DataSet可以自行修改,这里我就不不举例了:

/// <summary>
/// 读取.xlsx文件内容,控制台输出
/// </summary>
/// <param name="FilePath">文件路径</param>
/// <param name="SheetName">工作簿名称</param>
/// <param name="password">密码</param>
public void ReadFormExcelFile(string FilePath, string SheetName, string password)
{
    IWorkbook wk = null;

    try
    {
        using (FileStream fileStream = File.OpenRead(FilePath))
        using (dynamic fs = new POIFSFileSystem(fileStream))
        {
            EncryptionInfo info = new EncryptionInfo(fs);
            Decryptor decryptor = Decryptor.GetInstance(info);
            bool isPasswordCorrect = decryptor.VerifyPassword(password);
            var stream = decryptor.GetDataStream(fs);

            wk = new XSSFWorkbook(stream);

        }

        ISheet sheet = wk.GetSheet(SheetName);
        IRow row = sheet.GetRow(0);

        for (int i = 0; i < sheet.LastRowNum; i++)
        {
            row = sheet.GetRow(i);
            if (row != null)
            {
                for (int j = 0; j < row.LastCellNum; j++)
                {
                    string value = row.GetCell(j).ToString();
                    Console.Write(value + " ");
                }
                Console.WriteLine();
            }
        }

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
}

总结

到这里就能正常读取.xlsx文件了,还是比较简单的,只是网上好像没查到很多资料,我看了有人用Java写的示例就转成C#来记录下

PS

这里再记一下,如果要读加密的.xls文件只需要解析前加一行代码,设置密码然后正常读即可

Biff8EncryptionKey.CurrentUserPassword = password;
wk = new HSSFWorkbook(fileStream);
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值