gpt4 book ai didi

c# - 带有 OOXML Excel 密码的 NPOI 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:15 55 4
gpt4 key购买 nike

尝试读取加密的 2007 Excel 文档时,我在使用 OOXML 库时遇到问题。我发送到 DecryptToStream 方法的密码正在发回“密码无效”消息,但如果我直接进入 excel,密码就可以正常工作。以下是我正在使用的代码。

OleStorage ols = new OleStorage(d.fileLocation);
OfficeCrypto oc = new OfficeCrypto();
Stream test = oc.DecryptToStream(ols, "test123");

我也曾尝试使用 POI Decryptor 来尝试读取加密的 2007 excel,但我也没有成功。下面是代码。

FileStream file = new FileStream(d.fileLocation, FileMode.Open, System.IO.FileAccess.Read);
NPOI.POIFS.FileSystem.POIFSFileSystem nfs;
nfs = new NPOI.POIFS.FileSystem.POIFSFileSystem(file);
Stream excelData;
try
{
string password = "test123";
EncryptionInfo info = new EncryptionInfo(nfs);
Decryptor dc = Decryptor.GetInstance(info);

if (!dc.VerifyPassword(password))
{
throw new NotImplementedException();
}

excelData = dc.GetDataStream(nfs);

}
catch (Exception ex)
{
excelData = (Stream)file;
}

无论我传递给它什么,VerifyPassword 方法总是返回 true,它仍然不会读取文档。我使用 http://poi.apache.org/encryption.html 创建了上面的代码作为引用。

如有任何帮助,我们将不胜感激!

最佳答案

据我所知,目前的 NPOI 1.2.5 版本不支持 Excel2007 文件。幸运的是NPOI 2.0 alpha version支持Excel2007文件,但不支持加密的Excel文件。

但是,有一个项目叫做OfficeOpenXmlCrypto支持读取加密的Excel文件。该项目基于 NPOI 1.2.1 版本和ExcelPackage读取 Excel 2007 文件的项目。

您可以下载OfficeOpenXmlCrypto 项目的源代码,替换使用新的 NPOI 2.0 库和编译项目的旧 NPOI 库。

然后,您可以使用 XSSFWorkbookOfficeCryptoStream 类的组合读取加密 Excel 文件的内容:

using (OfficeCryptoStream ocs = OfficeCryptoStream.Open("c:\\temp\\secured.xlsx", "PA$$W0rd"))
{
NPOI.XSSF.UserModel.XSSFWorkbook w = new NPOI.XSSF.UserModel.XSSFWorkbook(ocs);

NPOI.xssf.extractor.XSSFExcelExtractor ee = new NPOI.xssf.extractor.XSSFExcelExtractor(w);

Console.Out.WriteLine(ee.Text);
}

作为替代方案 EPPlus class library提供了一个名为 ExcelPackage 的类,它支持加密的 Excel 文档。这个类也有一些属性(Workbook)访问 Excel 文档的内容。

这是一个读取加密 Excel 文件第一个单元格的简单示例:

using (FileStream file = new FileStream("c:\\temp\\secure.xlsx", 
FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
{
using (ExcelPackage ep = new ExcelPackage(file, "P@$$W0rd"))
{
Console.Out.WriteLine(ep.Workbook.Worksheets[1].Cells["A1"].Value);
}
}

您还可以结合使用 OpenXml 2.0 SDK SpreadsheetDocument 类使用 ExcelPackage 类。

使用以下代码读取第一个单元格(加密的Excel文档)的内容:

using (FileStream file = new FileStream("c:\\temp\\secure.xlsx", 
FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite))
{
using (ExcelPackage ep = new ExcelPackage(file, "P@$$W0rd"))
{
using (SpreadsheetDocument sd = SpreadsheetDocument.Open(ep.Package))
{
WorkbookPart workbookPart = sd.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

var row = sheetData.Elements<Row>().FirstOrDefault();
var cell = row.Elements<Cell>().FirstOrDefault();

Console.Out.WriteLine(cell.CellValue.InnerText);
}
}
}

如果密码无效,ExcelPackage 类的构造函数将抛出一个 UnauthorizedAccessException

关于c# - 带有 OOXML Excel 密码的 NPOI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583977/

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com