如何保护我的excel文件不被其他人阅读?

时间:2012-06-25 15:45:49

标签: c# excel vba ms-office add-in

基本上,我想开发一个办公室excel插件。安装此插件后,创建的所有excel文件只能由excel安装了此插件的用户打开。所以我在这里有两个问题:

  1. 我可以使用VBA进行开发吗?或者我必须使用C#或VB将其开发为应用程序级别的插件?
  2. 怎么做?看起来我必须在保存时稍微修改excel文件格式,这样没有这个插件的另一个excel会认为这是一个损坏的文件。有没有excel API这样做?如果没有,你有更好的想法吗?

1 个答案:

答案 0 :(得分:3)

美丽的问题:)

是的,它可以在VBA Excel加载项中实现。事实上,几年前我确实实现了类似的功能。这是以4个步骤解释的逻辑。

通过加载项创建文件时,请按照以下步骤操作

1)将文件保存在Temp directory中,如Temp.xls所示,并使用密码对其进行密码保护。您可以选择保留固定密码动态。请参阅此代码以创建动态密码。

Function GenerateRandPassword() As String
    Dim strEnvPass As String, strPass As String
    Dim n As Integer

    strEnvPass = "@#$%^"
    n = Application.WorksheetFunction.RandBetween(1, 10)

    For i = 1 To 5
        strPass = strPass & n
    Next i

    strPass = strEnvPass & strPass & strEnvPass

    GenerateRandPassword = strPass
End Function

要测试它,只需将其称为

Sub Sample()
    Debug.Print GenerateRandPassword
End Sub

密码将采用此格式

@#$%^11111@#$%^
@#$%^22222@#$%^
@#$%^33333@#$%^
.
.
.
@#$%^1010101010@#$%^

当您尝试通过加载项打开文件时,循环1到10并使用@#$%^作为后缀和前缀来创建密码,然后尝试打开该文件。这样您的Excel文件将具有随机密码。请参阅第4点,了解如何打开这些文件。

IMP :请勿在{{1​​}}中选择太大的数字。它只会延迟以后打开文件。

2)要获取临时目录,请使用此代码

Application.WorksheetFunction.RandBetween(1, 10)

3)在temp目录中创建文件后,重命名该文件并为其指定一个Excel无法识别的扩展名,例如Private Declare Function GetTempPath _ Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long Private Const MAX_PATH As Long = 260 Function TempPath() As String TempPath = String$(MAX_PATH, Chr$(0)) GetTempPath MAX_PATH, TempPath TempPath = Replace(TempPath, Chr$(0), "") End Function Sub TmpPath() 'This will give the Temp Path MsgBox TempPath End Sub (从前3个字母开始您的SO句柄MyFile.ice

您可以使用此代码重命名文件

iceagle

这样普通用户就不知道打开这个文件需要哪个应用程序。

要打开此文件,您可以在Name TempPath & "MyFile.xls" As "C:\MyFile.Ice"

中将过滤器设置为*.ice
Application.GetOpenFilenam

4)要打开文件,请使用此代码

Sub Sample()
    fileToOpen = Application.GetOpenFilename("ICE Files (*.ice), *.ice")
    If fileToOpen <> False Then
        Application.DisplayAlerts = False
        Workbooks.Open (fileToOpen)
        Application.DisplayAlerts = True
    End If
End Sub

希望这能让你开始:)