使用SSIS和C#删除Excel密码

问题描述 投票:0回答:1

我需要删除 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 工作簿中删除。我尝试使用具有不同文件名的另存为,但仍然不起作用。

c# excel ssis
1个回答
0
投票

您必须在编辑模式下打开 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();
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.