Previous topicNext topic
Help > 开发指南 > Excel > API > 示例 > 保护 >
如何:打开和保存密码加密的文件

电子表格文档 API 可以打开和保存二进制 (.xls, .xlsb) 和 OpenXml (.xlsx) 格式的密码加密文件。

打开加密文件

指定 WorkbookImportOptions.Password 属性以解密加载的文件。下表列出了在未指定 Password 属性或返回无效密码时引发的事件链。

事件 描述
Workbook.EncryptedFilePasswordRequest 如果未指定 Password 属性或返回无效密码,则引发该事件。使用EncryptedFilePasswordRequestEventArgs.Password属性指定新密码。
Workbook.EncryptedFilePasswordCheckFailed 如果EncryptedFilePasswordRequestEventArgs.Password设置为空密码或无效密码,则引发此事件。处理此事件以获取导致此事件的错误(EncryptedFilePasswordCheckFailedEventArgs.Error),并确定是否提示用户输入密码(EncryptedFilePasswordCheckFailedEventArgs.TryAgain)。
Workbook.InvalidFormatException 当EncryptedFilePasswordCheckFailedEventArgs.TryAgain属性设置为 false 时发生。

下面的代码示例演示如何处理 Workbook.EncryptedFilePasswordRequest 和 Workbook.EncryptedFilePasswordCheckFailed 事件,以提示用户输入密码。如果用户取消操作,电子表格文档 API 会显示异常消息并取消加载文件。

Vb.Net
Namespace FormEvents
    Public Class Forma8d52889a65d4c7ab16a512621abd710
        Inherits FormEventsBase
        
        Public Sub btnOpen_Click(sender As Object,e As  System.EventArgs)
            Dim workbook As New DevExpress.Spreadsheet.Workbook()
            '如果未指定 Password 属性或返回无效密码,则引发该事件
            AddHandler workbook.EncryptedFilePasswordRequest, AddressOf Workbook_EncryptedFilePasswordRequest
            '如果EncryptedFilePasswordRequestEventArgs.Password设置为空密码或无效密码,则引发此事件
            AddHandler workbook.EncryptedFilePasswordCheckFailed, AddressOf Workbook_EncryptedFilePasswordCheckFailed
            '当EncryptedFilePasswordCheckFailedEventArgs.TryAgain属性设置为 false 时发生
            AddHandler workbook.InvalidFormatException, AddressOf Workbook_InvalidFormatException
            
            workbook.LoadDocument("D:\encrypted.xlsx")
        End Sub
        Private Sub Workbook_EncryptedFilePasswordRequest(ByVal sender As Object, ByVal e As DevExpress.Spreadsheet.EncryptedFilePasswordRequestEventArgs)
            '让用户输入密码
            Dim obj As Object=""
            If Proj.InputValueBox(obj,"文档密码","请输入文档的密码:",InputValueTypeEnum.SingleString) Then
                e.Password = obj.ToString()
                e.Handled = True
            End If
        End Sub
        
        Private Sub Workbook_EncryptedFilePasswordCheckFailed(ByVal sender As Object, ByVal e As DevExpress.Spreadsheet.EncryptedFilePasswordCheckFailedEventArgs)
            Select Case e.Error
                
                '如果密码为空,请再次提出请求
                Case DevExpress.XtraSpreadsheet.SpreadsheetDecryptionError.PasswordRequired
                    MessageBox.Show("您没有输入密码!")
                    e.TryAgain = True
                    e.Handled = True
                    
                    '如果密码无效,询问用户是否继续操作:
                Case DevExpress.XtraSpreadsheet.SpreadsheetDecryptionError.WrongPassword
                    Dim Result As DialogResult
                    Result = MessageBox.Show("密码错误,是否重试?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                    If Result = DialogResult.Yes Then
                        e.TryAgain = True
                        e.Handled = True
                        
                        '如果用户取消操作,则显示一条异常消息:
                    End If
            End Select
        End Sub
        
        Private Sub Workbook_InvalidFormatException(ByVal sender As Object, ByVal e As DevExpress.Spreadsheet.SpreadsheetInvalidFormatExceptionEventArgs)
            
        End Sub
    End Class
End Namespace

C#
namespace FormEvents
{
    public class Forma8d52889a65d4c7ab16a512621abd710 : FormEventsBase
    {
        public void btnOpen_Click(object sender, System.EventArgs e)
        {
            DevExpress.Spreadsheet.Workbook workbook = new DevExpress.Spreadsheet.Workbook();
            // 如果未指定 Password 属性或返回无效密码,则引发该事件
            workbook.EncryptedFilePasswordRequest += Workbook_EncryptedFilePasswordRequest;
            // 如果EncryptedFilePasswordRequestEventArgs.Password设置为空密码或无效密码,则引发此事件
            workbook.EncryptedFilePasswordCheckFailed += Workbook_EncryptedFilePasswordCheckFailed;
            // 当EncryptedFilePasswordCheckFailedEventArgs.TryAgain属性设置为 false 时发生
            workbook.InvalidFormatException += Workbook_InvalidFormatException;

            workbook.LoadDocument(@"D:\encrypted.xlsx");
        }
        private void Workbook_EncryptedFilePasswordRequest(object sender, DevExpress.Spreadsheet.EncryptedFilePasswordRequestEventArgs e)
        {
            // 让用户输入密码
            object obj = "";
            if (Proj.InputValueBox(obj, "文档密码", "请输入文档的密码:", InputValueTypeEnum.SingleString))
            {
                e.Password = obj.ToString();
                e.Handled = true;
            }
        }

        private void Workbook_EncryptedFilePasswordCheckFailed(object sender, DevExpress.Spreadsheet.EncryptedFilePasswordCheckFailedEventArgs e)
        {
            switch (e.Error)
            {
                case DevExpress.XtraSpreadsheet.SpreadsheetDecryptionError.PasswordRequired:
                    {
                        MessageBox.Show("您没有输入密码!");
                        e.TryAgain = true;
                        e.Handled = true;
                        break;
                    }

                case DevExpress.XtraSpreadsheet.SpreadsheetDecryptionError.WrongPassword:
                    {
                        DialogResult Result;
                        Result = MessageBox.Show("密码错误,是否重试?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (Result == DialogResult.Yes)
                        {
                            e.TryAgain = true;
                            e.Handled = true;
                        }

                        break;
                    }
            }
        }

        private void Workbook_InvalidFormatException(object sender, DevExpress.Spreadsheet.SpreadsheetInvalidFormatExceptionEventArgs e)
        {
        }
    }
}

如果文档未通过代码验证,则会发生 Workbook.EncryptedFileIntegrityCheckFailed 事件。

使用密码加密工作簿

调用 Workbook.SaveDocument 方法重载,以在保存时对文档进行密码保护。使用 EncryptionOptions 对象属性指定密码和保护类型。使用 DocumentSettings.Encryption 属性访问 EncryptionOptions 对象。

Vb.Net
Dim encryptionOptions As New DevExpress.Spreadsheet.EncryptionSettings()
encryptionOptions.Type = DevExpress.Spreadsheet.EncryptionType.Strong
encryptionOptions.Password = "12345"

workbook.SaveDocument(fileName, documentFormat, encryptionOptions)

C#
DevExpress.Spreadsheet.EncryptionSettings encryptionOptions = new DevExpress.Spreadsheet.EncryptionSettings();
encryptionOptions.Type = DevExpress.Spreadsheet.EncryptionType.Strong;
encryptionOptions.Password = "12345";

workbook.SaveDocument(fileName, documentFormat, encryptionOptions);