在日常開發中,有時候我們需要從 Excel 文件中移除數位簽名。通常,為了保護原始文件不被直接修改,我們會先建立一個副本,移除副本的簽名後進行操作,最後再刪除這個臨時文件。本文將介紹如何使用 C# 和 Open XML SDK 來實現這樣的操作,並確保使用完副本文件後自動刪除,避免臨時文件佔用空間。
需求場景
假設我們有一個 Excel 文件,它包含數位簽名。在某些情況下,我們需要將其簽名移除並生成一個副本進行操作。當操作完成後,我們希望副本文件自動刪除,不在磁碟上留下任何痕跡。
解決方案概述
- 生成副本:將原始 Excel 文件複製到臨時目錄。
- 移除數位簽名:使用 Open XML SDK 開啟副本並移除簽名部分。
- 使用副本文件:在移除簽名後,可以根據需求對副本文件進行操作。
- 自動刪除副本:操作完成後,刪除臨時文件,確保不佔用系統資源。
實現步驟
首先,我們需要使用 Open XML SDK。這是一個可以方便操作 Office 文件的庫,通過它可以直接讀取和修改 Excel 文件的內部結構。
Install-Package DocumentFormat.OpenXml
代碼實現
以下是 RemoveDigitalSignature
方法的實現。此方法會生成一個未帶簽名的 Excel 文件副本,在操作完成後自動刪除該副本。
using DocumentFormat.OpenXml.Packaging;
using System;
using System.IO;
public class ExcelSignatureRemover
{
public static void RemoveDigitalSignature(string originalFilePath, Action<string> useFileAction)
{
string tempFilePath = Path.Combine(Path.GetTempPath(), $"temp_{Guid.NewGuid()}.xlsx");
try
{
// 創建原文件的副本到臨時目錄
File.Copy(originalFilePath, tempFilePath, true);
// 打開副本並刪除數位簽名
using (SpreadsheetDocument document = SpreadsheetDocument.Open(tempFilePath, true))
{
bool signatureRemoved = false;
// 遍歷所有部件,查找並刪除數位簽名部分
foreach (var part in document.Parts)
{
if (part.OpenXmlPart is DigitalSignatureOriginPart)
{
document.DeletePart(part.OpenXmlPart);
signatureRemoved = true;
Console.WriteLine("數位簽名已成功刪除。");
break;
}
}
if (!signatureRemoved)
{
Console.WriteLine("未找到數位簽名。");
}
}
// 使用副本文件
useFileAction(tempFilePath);
}
catch (Exception ex)
{
Console.WriteLine($"發生錯誤:{ex.Message}");
}
finally
{
// 刪除臨時副本文件
if (File.Exists(tempFilePath))
{
File.Delete(tempFilePath);
Console.WriteLine("副本文件已刪除。");
}
}
}
}
// 調用示例
class Program
{
static void Main()
{
string originalFilePath = @"C:\path\to\your\original_file.xlsx";
// 定義使用副本文件的操作
RemoveDigitalSignature(originalFilePath, tempFilePath =>
{
// 在這裡對刪除簽名後的副本文件進行操作
// 比如可以打開文件進行讀取或其他操作
Console.WriteLine($"正在使用副本文件:{tempFilePath}");
// 示例:讀取副本文件路徑
// 注意:此處的代碼可以換成任何需要的文件操作邏輯
});
}
}
代碼詳解
- 臨時文件路徑:利用
Path.GetTempPath()
方法創建臨時文件路徑,並附加唯一的 GUID 作為文件名,以確保臨時文件名稱不會重複。 - 副本文件的創建與簽名刪除:將原始文件複製到臨時文件路徑,然後打開副本文件,使用 Open XML SDK 刪除數位簽名部分。
- 使用副本文件:通過
Action<string>
委託參數useFileAction
,可以自定義對副本文件的操作邏輯,例如讀取文件內容、進行分析等。 - 刪除臨時文件:在
finally
區塊中,檢查副本文件是否存在,如果存在則將其刪除。這樣即使發生異常,副本文件也不會殘留在系統中。
使用方法
在主程序中,只需提供原始文件的路徑,並定義一個操作副本文件的委託函數。例如,可以在 useFileAction
委託中執行任何您需要的操作,操作完成後,臨時副本文件會自動刪除。