我需要删除 Excel 密码并使用 Interop 保存(无密码),以便其他进程可以毫无问题地读取 Excel 文件。我尝试了在谷歌中找到的以下代码,但它没有删除密码。
请注意,我是 SSIS 和 C# 新手,知识有限。
public void Main()
{
string excelFile = "D:\\Data\\FX File\\ZZ_All_Files\\Input\\SSIS Test PWD.xlsx";
Application xl = new Application();
Workbook wb = xl.Workbooks.Open(excelFile, Password: "ssistest");
wb.Unprotect("ssistest");
wb.Save();
wb.Close();
xl.Quit();
Dts.TaskResult = (int)ScriptResults.Success;
}
代码运行正常,但密码未从 Excel 工作簿中删除。我尝试使用具有不同文件名的另存为,但仍然不起作用。
您必须在编辑模式下打开 Excel 文件。
SpreadSheetDocument.Open
中的第二个参数应设置为 true
。
using System.Linq;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
class Test
{
static void Main()
{
string filePath = @"E:\test.xlsx";
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filePath, true))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
var dataBeforeProtection = workSheet.Descendants<Row>().First().Descendants<Cell>().First().CellValue.InnerText;
workSheet.RemoveAllChildren<SheetProtection>();
var dataAfterProtection = workSheet.Descendants<Row>().First().Descendants<Cell>().First().CellValue.InnerText;
workSheet.Save();
}
}
}