Excel表格的加密与解密
2016-04-25 09:51
253 查看
因为项目需要所以要对Excel表格的数据进行加密,这就涉及到了四个小知识点,导出,导入,加密和解密
注:如果没有设置保存路径他会默认到本地的“我的文档”上面
这时在导出时只需调用一下这个函数代替原先的导出数据的那句代码如下
感想:数据资源管理刚刚考完就立刻用到了,感觉微爽
普通导出
<span style="font-size:18px;"><strong> Dim MyExcel As New Microsoft.Office.Interop.Excel.Application() '定义并实例化excel工作表 MyExcel.Application.Workbooks.Add(True) '打开excel工作簿,显示excel界面 MyExcel.Visible = True 'excel设置为可见的 Dim Col As Integer '定义整形变量 '设置单元格格式 ' MyExcel.WindowState = Excel.XlWindowState.xlMaximized ' MyExcel.Cells(1, 3).value = "数据表" + "公司全局变量" '表头内容,在第一行,第三列 'MyExcel.Range("A1", "G1").Merge() '合并单元格 ' MyExcel.Range("A1", "G1").HorizontalAlignment = 3 '指定单元格,水平居中 '所有单元格,水平居中 ' MyExcel.ActiveWindow.Caption = "数据表" + "公司全局变量" '修改完这里保存时仍然为sheet1 MyExcel.ActiveWorkbook.SaveAs(Filename:="数据表" + "_companyName" & ".xls") '此处是用来设置保存路径的 ' MyExcel.Caption = "加油,加油" '这里是修改显示的后缀 Try For Col = 0 To DataData.ColumnCount - 1 'col的变化范围 MyExcel.Cells(1, Col + 1) = Me.DataData.Columns(Col).HeaderText '添加标题 Next Col Catch ex As Exception MsgBox(ex.Message) '弹出捕获的消息 Exit Sub End Try Dim k As Integer '定义整型行变量 i Dim j As Integer '定义整型列变量 j Try For k = 0 To DataData.RowCount - 1 For j = 0 To DataData.ColumnCount - 1 '列变量取值范围 If Me.DataData(j, k).Value IsNot System.DBNull.Value Then MyExcel.Cells(k + 3, j + 1) = DataData(j, k).Value.ToString() '将datagridview中的数据添加到excel表中 End If Next j Next k Catch ex As Exception If MsgBox(ex.Message) Then MsgBox("导出成功!请到本机的<我的文档>中调取该表") End If End Try </strong></span>
注:如果没有设置保存路径他会默认到本地的“我的文档”上面
加密导出
需要一个加密函数,此处用的加密技术就是标准DES(Data Encryption Algorithm)加密技术<span style="font-size:18px;"><strong>Public Function EncryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String '使用的DES对称加密 Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法 'Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider'TripleDES算法 Dim inputByteArray As Byte() inputByteArray = System.Text.Encoding.Default.GetBytes(SourceStr) des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符 des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符 Dim ms As New System.IO.MemoryStream Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write) Dim sw As New System.IO.StreamWriter(cs) sw.Write(SourceStr) sw.Flush() cs.FlushFinalBlock() ms.Flush() EncryptDes = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length) End Function </strong></span>
这时在导出时只需调用一下这个函数代替原先的导出数据的那句代码如下
<span style="font-size:18px;"><strong> If Me.DataData(j, k).Value IsNot System.DBNull.Value Then 'MyExcel.Cells(k + 3, j + 1) = DataData(j, k).Value.ToString() '此句话替换成下面的代码此时在 Dim EDes As String EDes = EncryptDes(DataData(j, k).Value, "12345678", "abcdefgh") MyExcel.Cells(k + 2, j + 1) = EDes End If</strong></span>
感想:数据资源管理刚刚考完就立刻用到了,感觉微爽
导入
导入的过程是先用一个控件选取所需要的Excel表,将这表在以类似插入的方法将表格中的数据插入到数据库中<span style="font-size:18px;"><strong>''' <summary> '''打开Excel ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click 'Dim myStream As System.IO.Stream Dim di As DirectoryInfo '计数已导入公司控件的index Dim index As Integer '获取选中文件的路径 '实体层 Dim lineEntity As New Entity.LineEntity 'B层实体 Dim ImportExcelBLL As New BLL.advancedQueryBLL '先将文本框清空 txtFileName.Text = "" '打开文件的初始路径 OpenFileDialog1.InitialDirectory = "c:\" '限定打开文件的类型 OpenFileDialog1.Filter = "Excel files (*.xlsx)|*.xlsx|Excel files (*.xls)|*.xls" OpenFileDialog1.FilterIndex = 2 OpenFileDialog1.RestoreDirectory = True '打开资源管理器成功 If OpenFileDialog1.ShowDialog() = DialogResult.OK Then '获取Excel文件名 di = New DirectoryInfo(Me.OpenFileDialog1.FileName) '获取.在选中文件名内的位置 Point = di.Name.ToString().IndexOf(".") '将文件名称显示在文本框中 txtFileName.Text = Microsoft.VisualBasic.Left(di.Name.ToString(), Point) '循环比较选中表是否已经导入过 If cmbTable.Items.Count <> 0 Then For index = 0 To cmbTable.Items.Count If txtFileName.Text = cmbTable.Items(index) Then Throw New Exception("该表已经导入,不可重复选择") End If Next End If '全局变量,文件的名称 FileNames = txtFileName.Text '获取文件路径 fileName = Me.OpenFileDialog1.FileName End If End Sub </strong></span>
<strong><span style="font-size:18px;">''' <summary> ''' 导入Excel ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub btnImport_Click(sender As Object, e As EventArgs) Handles btnImport.Click '定义用户表实体 Dim UserEntity As New Entity.UserEntity '定义公司信息表实体 Dim CompanyEntity As New Entity.ComPanyEntity '定义数据表实体 Dim DataEntity As New Entity.DataEntity '定义变量,计数Excel中有多少条数据 Dim Count As Integer '受影响的行数 Dim result As Integer '将导入表文件名插入数据库 Dim insert As Integer '已导入表实体 Dim ImportedEntity As New Entity.ImportedEntity Try '截取文件名的前两个字符 TableLable = Microsoft.VisualBasic.Left(FileNames, 2) '截取公司名称 NameCompany = Microsoft.VisualBasic.Mid(FileNames, 4) '判断选择的文件对应哪一张表 If Not TableLable = "用户" And Not TableLable = "数据" And Not TableLable = "公司" Then Throw New Exception("该文件名称不合法,无法识别,请更改文件名称,例如") Else '建立Excel连接,读入数据 Dim strConn As String = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source='" & fileName & "';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'" Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", strConn) Dim mydataset As DataSet = New DataSet '将Excel的数据填充到数据集中 da.Fill(mydataset) '和DataGridView控件绑定 'Me.DataGridView1.DataSource = mydataset.Tables(0) '判断表中是否有数据 If mydataset.Tables(0).Rows.Count <= 0 Then Throw New Exception("该表中没有数据,请选择其他表导入") End If '对应用户表 If TableLable = "用户" Then For Count = 0 To mydataset.Tables(0).Rows.Count - 1 Step Count + 1 UserEntity.userId = DecryptDes(mydataset.Tables(0).Rows(Count).Item(0), "12345678", "abcdefgh") UserEntity.userName = DecryptDes(mydataset.Tables(0).Rows(Count).Item(1), "12345678", "abcdefgh") UserEntity.passWord = DecryptDes(mydataset.Tables(0).Rows(Count).Item(2), "12345678", "abcdefgh") UserEntity.realyName = DecryptDes(mydataset.Tables(0).Rows(Count).Item(3), "12345678", "abcdefgh") UserEntity.phoneNumber = DecryptDes(mydataset.Tables(0).Rows(Count).Item(4), "12345678", "abcdefgh") UserEntity.unitName = DecryptDes(mydataset.Tables(0).Rows(Count).Item(5), "12345678", "abcdefgh") UserEntity.unitType = DecryptDes(mydataset.Tables(0).Rows(Count).Item(6), "12345678", "abcdefgh") UserEntity.isDelete = DecryptDes(mydataset.Tables(0).Rows(Count).Item(7), "12345678", "abcdefgh") '执行插入 result = AdvancedQueyBLL.ImportUser(UserEntity) Next MsgBox(NameCompany + "用户表数据导入成功!") '对应数据表 ElseIf TableLable = "数据" Then For Count = 0 To mydataset.Tables(0).Rows.Count - 1 Step Count + 1 DataEntity.id = DecryptDes(mydataset.Tables(0).Rows(Count).Item(0), "12345678", "abcdefgh") DataEntity.departmentId = DecryptDes(mydataset.Tables(0).Rows(Count).Item(1), "12345678", "abcdefgh") DataEntity.unitId = DecryptDes(mydataset.Tables(0).Rows(Count).Item(2), "12345678", "abcdefgh") DataEntity.rowId = DecryptDes(mydataset.Tables(0).Rows(Count).Item(3), "12345678", "abcdefgh") DataEntity.lineId = DecryptDes(mydataset.Tables(0).Rows(Count).Item(4), "12345678", "abcdefgh") DataEntity.data = DecryptDes(mydataset.Tables(0).Rows(Count).Item(5), "12345678", "abcdefgh") DataEntity.currentdate = DecryptDes(mydataset.Tables(0).Rows(Count).Item(6), "12345678", "abcdefgh") DataEntity.currenttime = DecryptDes(mydataset.Tables(0).Rows(Count).Item(7), "12345678", "abcdefgh") DataEntity.userId = DecryptDes(mydataset.Tables(0).Rows(Count).Item(8), "12345678", "abcdefgh") DataEntity.isDelete = DecryptDes(mydataset.Tables(0).Rows(Count).Item(9), "12345678", "abcdefgh") '执行导入 result = AdvancedQueyBLL.ImportData(DataEntity) Next MsgBox(NameCompany + "数据表数据导入成功!") '对应公司表 Else For Count = 0 To mydataset.Tables(0).Rows.Count - 1 Step Count + 1 CompanyEntity.id = DecryptDes(mydataset.Tables(0).Rows(Count).Item(0), "12345678", "abcdefgh") CompanyEntity.name = DecryptDes(mydataset.Tables(0).Rows(Count).Item(1), "12345678", "abcdefgh") CompanyEntity.companType = DecryptDes(mydataset.Tables(0).Rows(Count).Item(2), "12345678", "abcdefgh") CompanyEntity.isDelete = DecryptDes(mydataset.Tables(0).Rows(Count).Item(3), "12345678", "abcdefgh") '执行导入 result = AdvancedQueyBLL.ImportCompany(CompanyEntity) Next MsgBox(NameCompany + "公司表导入成功") End If '将该表名称添加到已导入表 cmbTable.Items.Add(FileNames) ImportedEntity.tableName = FileNames insert = AdvancedQueyBLL.InsertImported(ImportedEntity) End If Catch ex As Exception MessageBox.Show(ex.Message.ToString()) End Try </span> End Sub </strong>
解密导入
依然是将此函数放在U层窗体上就行,然后在导入时进行揭秘转换,方法已放在上面的普通导入中<span style="font-size:18px;"><strong> '解密函数 Public Function DecryptDes(ByVal SourceStr As String, ByVal myKey As String, ByVal myIV As String) As String '使用标准DES对称解密 Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法 'Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider'TripleDES算法 des.Key = System.Text.Encoding.UTF8.GetBytes(myKey) 'myKey DES用8个字符,TripleDES要24个字符 des.IV = System.Text.Encoding.UTF8.GetBytes(myIV) 'myIV DES用8个字符,TripleDES要24个字符 Dim buffer As Byte() = Convert.FromBase64String(SourceStr) Dim ms As New System.IO.MemoryStream(buffer) Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read) Dim sr As New System.IO.StreamReader(cs) DecryptDes = sr.ReadToEnd() End Function</strong></span>
相关文章推荐
- 用ASP编写的加密和解密类
- 解密网页加密的两个方法
- VBS脚本加密/解密VBS脚本(简易免杀版1.1)
- BAT加密工具 EncryBat 非编译型bat批处理加密方案与代码
- C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例
- SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文
- 实例讲解SQL Server加密功能
- C#编写DES加密、解密类
- C#实现对文件进行加密解密的方法
- C#实现数据包加密与解密实例详解
- C#最简单的字符串加密解密方法
- C#加密app.config中连接字符串的方法
- C#使用伪随机数实现加密用户密码的方法
- asp MD5加密方式使用建议
- C#对称加密与非对称加密实例
- .NET实现一机一码加密、把EXE变成图片运行,被破解自动销毁随时授权回收
- SQL Server解密存储过程
- 对称加密和非对称加密概念和区别
- 5-Kafka 0.10.0 SASL/PLAIN身份认证及权限实现