前言
最近公司内部有个小需求,希望能够有个小工具用来解析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);