DioDocs for Excel
DioDocs for Excel
電子署名
機能 > 電子署名

電子署名は、ドキュメントの真正性を証明します。電子署名済み文書は、署名者によって作成されたものであることと、変更されていないことを保証します。

DioDocs for Excelでは、スプレッドシートに電子署名を付加して認証し、容易に検証することができます。

署名欄

署名欄は、電子署名のプレースホルダとして機能し、図形としてワークシートに追加して署名できます。

署名欄の追加

ISignatureSetインタフェースのAddSignatureLineメソッドを使用することで、ワークシートに署名欄を追加します。また、ISignatureSetupインタフェースのさまざまなプロパティを使用して、署名者に関する情報と、署名者への説明を指定することができます。ワークブックが再度開かれるか、署名者にExcelファイルとして送信されると、署名が必要であるという通知が表示されます。

ワークシートに署名欄を追加する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
var workbook = new Workbook();
IWorksheet activeSheet = workbook.ActiveSheet;

//署名欄を追加します
ISignatureSetup setup = workbook.Signatures.AddSignatureLine(activeSheet, 100.0, 50.0).Setup;
setup.ShowSignDate = false;
setup.AllowComments = false;
setup.SigningInstructions = "署名する前に、署名するコンテンツが正しことをご確認ください。";
setup.SuggestedSigner = "Shinzo";
setup.SuggestedSignerEmail = "shinzo.nagama@ea.com";
setup.SuggestedSignerLine2 = "Commander (Balanced)";

//ワークブックをXLSXファイルに保存します
workbook.Save("addsignaturelines.xlsx");

以下の画像は、Excelで署名欄を表示します。

Signature lines in Excel worksheet

 

署名欄のコピー

署名欄をワークシートの他の範囲または他のワークシートにコピーするには、以下のいずれかの方法を使用します。

署名欄を他の範囲と他のワークシートにコピーする方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//署名欄を他の範囲にコピーします
IRange srcRange = activeSheet.Range["A1:I15"];
IRange destRange = activeSheet.Range["A16:I30"];
srcRange.Copy(destRange);

//署名欄を複製します
signature.SignatureLineShape.Duplicate();

//署名欄を他のワークシートにコピーします
activeSheet.Copy();

署名欄の削除

署名欄を削除するには、以下のいずれかの方法を使用します。

ワークシートの署名欄を削除する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//新しい署名欄を作成し、Signature.Deleteで削除します
ISignature signatureForTest = newSignatureLine();
signatureForTest.Delete();

//新しい署名欄を作成し、Shape.Deleteで削除します
signatureForTest = newSignatureLine();
IShape signatureLineShape = signatureForTest.SignatureLineShape;
signatureLineShape.Delete();

署名欄の移動

署名欄を他の範囲またはワークシートに移動する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//署名欄を移動します
signature.SignatureLineShape.Top += 100;
signature.SignatureLineShape.Left += 50;

署名欄の一覧表示

ワークシートの署名欄を一覧表示する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//最初の署名欄を追加します
ISignature signatureShinzo = signatures.AddSignatureLine(
    activeSheet, 100.0, 50.0);
ISignatureSetup setup1 = signatureShinzo.Setup;
setup1.ShowSignDate = false;
setup1.AllowComments = false;
setup1.SigningInstructions = "署名する前に、署名するコンテンツが正しことをご確認ください。";
setup1.SuggestedSigner = "Shinzo Nagama";
setup1.SuggestedSignerEmail = "shinzo.nagama@ea.com";
setup1.SuggestedSignerLine2 = "Commander (Balanced)";

//2番目の署名欄を追加します
ISignature signatureKenji = signatures.AddSignatureLine(
    activeSheet, 100.0, 350.0);
ISignatureSetup setup2 = signatureKenji.Setup;
setup2.ShowSignDate = true;
setup2.AllowComments = true;
setup2.SigningInstructions = "署名する前に、署名するコンテンツが正しことをご確認ください。";
setup2.SuggestedSigner = "Kenji Tenzai";
setup2.SuggestedSignerEmail = "kenji.tenzai@ea.com";
setup2.SuggestedSignerLine2 = "Commander (Mecha)";

//インデックスを使用して署名を一覧表示します
for (var i = 0; i < signatures.Count; i++)
{
    var signature = signatures[i];
    //SuggestedSignerを変更します
    if (i == 0)
        signature.Setup.SuggestedSigner = "Shinzo Nagama 123";
    //SuggestedSignerLine2を変更します
    if (i == 1)
        signature.Setup.SuggestedSignerLine2 = "Commander (Mecha 1234)";
}

署名欄を図形として使用する場合は、ISignatureインタフェースのSignatureLineShapeプロパティを使用できます。SignatureLineShapeプロパティのメンバとその動作を以下の表に示します。

メンバ 取得/呼び出し動作 設定動作
Adjustments サポートされる #N/A
Adjustments.Count サポートされる #N/A
Adjustments.Item サポートされない サポートされない
Adjustments.GetEnumerator サポートされない #N/A
AutoShapeType サポートされる サポートされない
BottomRightCell サポートされる #N/A
Chart サポートされない #N/A
Connector サポートされる #N/A
ConnectorFormat サポートされない #N/A
Fill サポートされない #N/A
GroupItems サポートされない #N/A
HasChart サポートされる #N/A
Hyperlink サポートされない #N/A
IsPrintable サポートされる サポートされる
Line サポートされない #N/A
Locked サポートされる サポートされる
Name サポートされる サポートされる
Parent サポートされる #N/A
ParentGroup サポートされない #N/A
PictureFormat サポートされる #N/A
PictureFormat.ColorType サポートされる サポートされる
PictureFormat.Brightness サポートされる サポートされる
PictureFormat.Contrast サポートされる サポートされる
PictureFormat.Crop サポートされない #N/A
PictureFormat.CropLeft, CropTop,
CropRight and CropBottom
サポートされない サポートされない
Placement サポートされる サポートされる
Rotation サポートされる サポートされない
TextFrame サポートされない #N/A
ThreeD サポートされない #N/A
Title サポートされない サポートされない
TopLeftCell サポートされる #N/A
Left, Top, Right and Bottom サポートされる サポートされる
Type サポートされる サポートされる
Transparency サポートされない サポートされない
Ungroup サポートされない #N/A
Visible サポートされる サポートされる
ZOrderPosition サポートされる サポートされる

署名欄はPDFにエクスポートすることもできます。

電子署名の追加

電子署名は、本人であることを証明する署名証明書を使用して署名欄に署名することで、スプレッドシートに追加することができます。「証明書の作成」ファイルに記載されている手順に従って、証明書ファイル(.pfx)を作成できます。

ISignatureインタフェースのSignメソッドを使用することで、電子署名を追加できます。署名をコミットするには、ワークブックを.xlsx または.xlsm として保存する必要があります。電子署名を含むワークブックは、編集を防ぐために最終版としてマークされています。

ワークシートに電子署名を追加する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//ワークブックを初期化します
var workbook = new Workbook();

//署名欄を追加します
ISignature signature = workbook.Signatures.AddSignatureLine(
    workbook.ActiveSheet, 100.0, 50.0);
ISignatureSetup setup = signature.Setup;
setup.ShowSignDate = true;
setup.AllowComments = true;
setup.SigningInstructions = "<your signing instructions>";
setup.SuggestedSigner = "<signer's name>";
setup.SuggestedSignerEmail = "example@microsoft.com";
setup.SuggestedSignerLine2 = "<signer's title>";

//電子署名の詳細を追加します
var details = new SignatureDetails
{
    Address1 = "<your address>",
    Address2 = "<address 2>",
    SignatureComments = "Final",
    City = "<your city>",
    StateOrProvince = "<your state or province>",
    PostalCode = "<your postal code>",
    CountryName = "<your country or region>",
    ClaimedRole = "<your role>",
    CommitmentTypeDescription = "Approved",
    CommitmentTypeQualifier = "Final"
};

//証明書を初期化します
var cert = new X509Certificate2("GcExcelTest.pfx", "test@123");
signature.Sign(cert, "John Williams", details);

//署名をコミットするために、ワークブックをXLSXファイルに保存します
workbook.Save("digitalsignatures.xlsx");

以下の画像は、Excelで電子署名を表示します。

Digital signatures in Excel worksheet

非表示の電子署名の追加

ISignatureSetインタフェースのAddNonVisibleSignatureメソッドを使用して、ワークブックに非表示の電子署名を追加することができます。非表示の電子署名は、ワークシートに表示されないが、[署名の表示]をクリックして表示できます。

ワークシートに非表示の電子署名を追加する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//ワークブックを初期化します
var workbook = new Workbook();

//非表示の署名を追加します
ISignature signature = workbook.Signatures.AddNonVisibleSignature();
var details = new SignatureDetails
{
    Address1 = "<your address>",
    Address2 = "<address 2>",
    SignatureComments = "Final",
    City = "<your city>",
    StateOrProvince = "<your state or province>",
    PostalCode = "<your postal code>",
    CountryName = "<your country or region>",
    ClaimedRole = "<your role>",
    CommitmentTypeDescription = "Approved",
    CommitmentTypeQualifier = "Final"
};

var cert = new X509Certificate2("GcExcelTest.pfx", "test@123");
signature.Sign(cert, details);

//XLSXファイルに保存します
workbook.Save("nonvisiblesignatures.xlsx");

署名の副署

電子署名されたワークブックは読み取り専用になります。 このワークブックをDioDocs for Excelで再度開いた場合、閉じる前に電子署名を保持する必要があります。

ワークブックに副署する

電子署名されたワークブックを再度開いて変更する場合は、副署する必要があります。それ以外の場合、ワークブックを.xlsx または.xlsm として保存すると、既存の署名が削除されます。ISignatureインタフェースのCountersignメソッドを使用することで、同じ証明書によって署名に副署できます。

電子署名されたワークブックを開き、ワークシートを変更して副署する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//電子署名されたワークブックを開きます
workbook.Open("signsignaturelines.xlsx");

//ワークシートを変更します
workbook.Worksheets[0].Range["A1"].Value = "Modified";

//同じ証明書を使用して署名に副署します
workbook.Signatures[0].Countersign(cert);

//XLSXファイルに保存します
workbook.Save("countersign.xlsx");

電子署名のみモードでブックを開く

XlsxOpenOptionsクラスのDigitalSignatureOnlyプロパティを使用して、電子署名されたブックを電子署名のみモードで開くことができます。このモードでは、既存の署名を保持しながら、次の操作を実行できます。

電子署名されたブックを電子署名のみモードで開き、非表示の署名を追加する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
workbook.Open("signsignaturelines.xlsx");

//ブックは署名されているため、DigitalSignatureOnlyモードを使用します
//電子署名のみモードで開かないと、ワークブックを保存した時、既存のすべての署名が削除されます
XlsxOpenOptions openOption = new XlsxOpenOptions { DigitalSignatureOnly = true };

//このワークブックに署名を追加します
var signature = workbook.Signatures.AddNonVisibleSignature();
signature.Sign(cert, details);

//署名をコミットします
workbook.Save("AddNonVisibleSignatureToSignedWorkbook.xlsx");

電子署名の検証

ISignatureインタフェースのIsValidプロパティを使用して、電子署名を検証することができます。 証明書の検証結果を抽出するには、X509ChainStatusFlags列挙体を使用します。

署名されたワークブックの電子署名を検証する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//ワークブックを初期化します
var workbook = new Workbook();
workbook.Open("digitalsignatures.xlsx");
ISignatureSet signatures = workbook.Signatures;

bool signed = false;
bool valid = false;
X509Certificate2 certificate = null;

//電子署名を検証します
foreach (var signature in signatures)
{
    if (signature.IsSigned)
    {
        signed = true;
        certificate = signature.Details.SignatureCertificate;
        valid = signature.IsValid;
        break;
    }
}

//証明書を検証します
if (certificate != null)
{
    var status = X509ChainStatusFlags.NoError;

    //証明書チェーンを構築します
    var chain = new X509Chain();
    bool certValid = chain.Build(certificate);

    //結果を確認します
    if (!certValid)
    {
        var chainStatus = chain.ChainStatus;
        for (var i = 0; i < chainStatus.Length; i++)
        {
            status |= chainStatus[i].Status;
        }
    }

    //証明書の検証結果を抽出します
    var isCertificateExpired = status.HasFlag(X509ChainStatusFlags.NotTimeValid);
    var isCertificateRevoked = status.HasFlag(X509ChainStatusFlags.Revoked);
    var isCertificateUntrusted = status.HasFlag(X509ChainStatusFlags.UntrustedRoot);

    Console.WriteLine("Expired:" + isCertificateExpired);
    Console.WriteLine("Revoked:" + isCertificateRevoked);
    Console.WriteLine("UnTrusted:" + isCertificateUntrusted);
}

電子署名の削除

ISignatureインタフェースのDeleteメソッドを使用することで、署名された署名欄から電子署名を削除することができます。署名欄は保持されますが、個別に削除できます。詳細については、「署名欄の削除」を参照してください。

ワークブックで署名された署名欄から電子署名を削除する方法については、次のサンプルコードを参照してください。

C#
コードのコピー
//ワークブックを初期化します
var workbook = new Workbook();

//このファイルには、1つの署名された署名欄と署名されていない署名行が含まれています
workbook.Open("signsignaturelines.xlsx");

//ブックは署名されているため、DigitalSignatureOnlyモードを使用します。
XlsxOpenOptions openOption = new XlsxOpenOptions { DigitalSignatureOnly = true };

//署名された署名欄から電子署名を削除します
foreach (var signature in workbook.Signatures)
{
    if (signature.IsSignatureLine && signature.IsSigned)
    {
        //電子署名を削除します
        //署名欄は図形であるため、電子署名のみのモードでSignatureSetから署名欄が削除されません
        signature.Delete();
        break;
    }
}

//署名をコミットします
workbook.Save("deletesignaturefromsignatureline.xlsx");

メモ:この機能で確認された署名形式は、次のバージョンでテストされています。

対象のOfficeのバージョン

この機能を開発するときにファイル構造を確認するために使用されたOfficeバージョンはOffice 365、ビルド16.0.12228です。

このバージョンは、SignatureDetails.ApplicationVersionプロパティを使用して確認できます。

必要なOfficeのバージョン

署名されたワークブックを開くために、Office 2013以降が必要です。

制限事項