電子署名は、ドキュメントの真正性を証明します。電子署名済み文書は、署名者によって作成されたものであることと、変更されていないことを保証します。
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で署名欄を表示します。
署名欄をワークシートの他の範囲または他のワークシートにコピーするには、以下のいずれかの方法を使用します。
署名欄を他の範囲と他のワークシートにコピーする方法については、次のサンプルコードを参照してください。
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で電子署名を表示します。
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以降が必要です。