如何保护我的Excel文件不被别人阅读?

基本上我想开发一个office excel插件。 一旦你安装了这个插件,所有创build的excel文件只能由excel安装了这个插件的用户打开。 所以我在这里有两个问题:

  1. 我可以使用VBA来开发它吗?或者我必须使用C#或VB来开发它作为应用程序级插件?
  2. 怎么做? 看起来好像我必须在保存时修改一下excel文件格式,所以没有这个插件的其他excel会认为这是一个破损的文件。 有没有什么优秀的API这样做? 如果没有,你有更好的点子吗?

美丽的问题:)

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

当您通过加载项创build文件时,请按照下列步骤操作

1)将文件保存在Temp directoryTemp.xls并使用密码进行密码保护。 您可以select保留固定密码dynamic 密码 。 看到这个代码来创build一个dynamic的密码。

 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 

为了testing它,就像这样调用它

 Sub Sample() Debug.Print GenerateRandPassword End Sub 

密码将采用这种格式

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

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

IMP :不要在Application.WorksheetFunction.RandBetween(1, 10)select太大的数字,它只会延迟文件的打开。

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

 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)一旦文件在临时目录中创build,重命名该文件,并给它一个Excel无法识别的扩展名,例如MyFile.ice (从你的SO处理iceagle 3个字母)

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

Name TempPath & "MyFile.xls" As "C:\MyFile.Ice"

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

要打开这个文件,可以在Application.GetOpenFilenam中将filter设置为*.ice

 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 

4)使用此代码打开文件

 Sub OpenFile() Dim wb As Workbook Dim strPass As String For i = 1 To 10 On Error Resume Next strPass = "@#$%^" & i & i & i & i & i & "@#$%^" Set wb = Workbooks.Open("C:\MyFile.ice", , , , strPass) If Err.Number = 0 Then Exit For Err.Clear Next On Error GoTo 0 End Sub 

希望这会让你开始:)