EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

使用 C# 移除 Excel (.xlsx) 文件的數位簽名並自動刪除副本

在日常開發中,有時候我們需要從 Excel 文件中移除數位簽名。通常,為了保護原始文件不被直接修改,我們會先建立一個副本,移除副本的簽名後進行操作,最後再刪除這個臨時文件。本文將介紹如何使用 C# 和 Open XML SDK 來實現這樣的操作,並確保使用完副本文件後自動刪除,避免臨時文件佔用空間。

需求場景

假設我們有一個 Excel 文件,它包含數位簽名。在某些情況下,我們需要將其簽名移除並生成一個副本進行操作。當操作完成後,我們希望副本文件自動刪除,不在磁碟上留下任何痕跡。

解決方案概述

  1. 生成副本:將原始 Excel 文件複製到臨時目錄。
  2. 移除數位簽名:使用 Open XML SDK 開啟副本並移除簽名部分。
  3. 使用副本文件:在移除簽名後,可以根據需求對副本文件進行操作。
  4. 自動刪除副本:操作完成後,刪除臨時文件,確保不佔用系統資源。

實現步驟

首先,我們需要使用 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}");

            // 示例:讀取副本文件路徑
            // 注意:此處的代碼可以換成任何需要的文件操作邏輯
        });
    }
}

代碼詳解

  1. 臨時文件路徑:利用 Path.GetTempPath() 方法創建臨時文件路徑,並附加唯一的 GUID 作為文件名,以確保臨時文件名稱不會重複。
  2. 副本文件的創建與簽名刪除:將原始文件複製到臨時文件路徑,然後打開副本文件,使用 Open XML SDK 刪除數位簽名部分。
  3. 使用副本文件:通過 Action<string> 委託參數 useFileAction,可以自定義對副本文件的操作邏輯,例如讀取文件內容、進行分析等。
  4. 刪除臨時文件:在 finally 區塊中,檢查副本文件是否存在,如果存在則將其刪除。這樣即使發生異常,副本文件也不會殘留在系統中。

使用方法

在主程序中,只需提供原始文件的路徑,並定義一個操作副本文件的委託函數。例如,可以在 useFileAction 委託中執行任何您需要的操作,操作完成後,臨時副本文件會自動刪除。

This article was last edited at 2024-11-11 10:45:05

* *