您的位置:首页 > 其它

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息