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

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

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

  • 我可以使用 VBA 来开发它还是必须使用 C# 或 VB 来开发它作为应用程序级插件?
  • 怎么做?保存的时候好像要稍微修改一下excel文件格式,让没有这个插件的其他excel会认为这是一个损坏的文件。有没有做这个的excel API?如果没有,你有更好的想法吗?
  • 最佳答案

    美丽的问题:)

    是的,它可以在 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 文件就会有随 secret 码。有关如何打开此类文件,请参阅第 4 点。

    import/export 商 : 不要在 Application.WorksheetFunction.RandBetween(1, 10) 中选择太大的数字它只会延迟稍后打开文件。

    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) 在临时目录中创建文件后,重命名文件并为其指定 Excel 无法识别的扩展名,例如 MyFile.ice (从您的 SO 句柄中取出前 3 个字母 iceagle )

    您可以使用此代码重命名文件
    Name TempPath & "MyFile.xls" As "C:\MyFile.Ice"
    这样,普通用户将不知道打开此文件需要哪个应用程序。

    要打开此文件,您可以将过滤器设置为 *.iceApplication.GetOpenFilenam
    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
    

    希望这能让你开始:)

    关于c# - 如何保护我的excel文件不被其他人阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11192641/

    相关文章:

    c# - 重写ToString还是为接口(interface)提供非ToString命名扩展方法?

    excel - 仅根据格式查找单元格

    excel - VBA粘贴不遵循If语句

    excel - 在子例程之间传递二维数组 Excel VBA

    c# - 如何在 C# 中从日期时间获取格式为 yyyy-mm 的字符串

    c# - 我是否必须在所有项目中引用 Entity Framework 6 dll? (不仅是我的 DAL)

    excel - 尝试使用示例设置自定义对象模型,但不起作用

    vba - 如果范围内的单元格与字符串相同,则在其下的单元格中进行计算

    vba - 在 VBA 中自动隐藏按钮的最佳方法

    c# - 如何使用 SQLite-Net Extensions 遍历多个相关表?