本节介绍字典数据的格式化输出以及字典与Excel工作表之间的数据读写操作。
8.4.1字典数据的格式化输出
【Excel VBA】
Excel VBA输出字典数据没有特别之处,需要格式化输出的地方可以使用Format函数实现。
下面创建一个字典对象并添加键值对,然后在立即窗口中输出各键对应的值。其中学员的成绩进行格式化输出,要求小数点后面保留两位。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。
Sub Test()
Dim dicT As Scripting.Dictionary
Set dicT = New Scripting.Dictionary
dicT.Add "name", "dqexcel"
dicT.Add "sex", "男"
dicT.Add "score", 92
Debug.Print "姓名:" & dicT("name")
Debug.Print "性别:" & dicT("sex")
Debug.Print "成绩:" & Format(dicT("score"), "0.00") '格式化输出
End Sub
运行过程,在立即窗口中输出字典数据。
姓名:dqexcel
性别:男
成绩:92.00
【Python】
使用print函数输出字典数据时,可以用format函数指定输出的格式。下面首先创建一个字典。
>>> student = {'name':'dqexcel','sex':'男','score':92}
用{}占位,括号内可以从0开始添加数字,也可以不加数字。字典数据作为format函数的参数给出。
>>> print('姓名:{0},性别:{1},成绩:{2}'.format(student['name'],student['sex'], student['score']))
姓名:dqexcel,性别:男,成绩:92
用{}占位,括号内指定参数名称,format函数的参数使用对应的参数名称并指定字典数据。
>>> print('姓名:{name},性别:{sex},成绩:{score}'.\
format(name=student['name'],sex=student['sex'],score=student['score']))
姓名:dqexcel,性别:男,成绩:92
用{}占位,括号内输入键的名称,format函数的参数指定为字典名称,注意在字典名称前面添加两个*。
>>> print('姓名:{name},性别:{sex},成绩:{score}'.format(**student))
姓名:dqexcel,性别:男,成绩:92
用{}占位,括号内添加字典的索引形式,但是字典名称用0代替。format函数的参数指定为字典名称。
>>> print('{0[name]}:{0[sex]},{0[score]}'.format(student))
dqexcel:男,92
Excel工作表与字典之间的数据读写
Excel工作表与字典之间的数据读写包括两方面的内容,即将Excel工作表中单元格区域内的数据读取到字典中和将字典数据写入到Excel工作表中。
图8-4 Excel工作表数据
下面将图8-4所示的工作表中单元格区域A1:B2和A4:B5内的数据读取并保存到字典中,A和B作为字典的键,1和2作为字典的值。
【Excel VBA】
下面的代码将图8- 所示的工作表中单元格区域A1:B2内的数据读取并保存到字典中,A和B作为字典的键,1和2作为字典的值。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。
Sub Test()
Dim arr01() '保存A1:A2单元格区域内的数据,二维数组
Dim arr02() '保存B1:B2单元格区域内的数据,二维数组
Dim arr1() 'arr01()转一维数组
Dim arr2() 'arr02()转一维数组
Dim intI As Integer
Dim intR As Integer '一维数组的大小
Dim dicT As Scripting.Dictionary
Set dicT = New Scripting.Dictionary '创建字典对象
arr01 = Range("A1:A2") '取数据
arr02 = Range("B1:B2")
arr1 = Application.WorksheetFunction.Transpose(arr01) '转换为一维数组
arr2 = Application.WorksheetFunction.Transpose(arr02)
intR = UBound(arr1)
For intI = 1 To intR '两个一维数组中的数据组成键值对添加到字典
dicT.Add arr1(intI), arr2(intI)
Debug.Print arr1(intI) & vbTab & arr2(intI) '输出
Next
End Sub
运行过程,在立即窗口中输出字典数据。
A 1
B 2
下面的代码将图8-4所示的工作表中单元格区域A4:B5内的数据读取并保存到字典中,A和B作为字典的键,1和2作为字典的值。注意,因为键和值的取值都是单元格区域中的行数据,所以二维转一维时要转置两次。第1次行数据转列数据,第2次二维转一维。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。
Sub Test2()
Dim arr01() '保存A4:B4单元格区域内的数据,二维数组
Dim arr02() '保存A5:B5单元格区域内的数据,二维数组
Dim arr1(), arr2() '保存第1次转置的结果,二维数组
Dim arr3(), arr4() '保存二维转一维的结果,一维数组
Dim intI As Integer
Dim intR As Integer
Dim dicT As Scripting.Dictionary
Set dicT = New Scripting.Dictionary '创建字典对象
arr01 = Range("A4:B4") '取数据
arr02 = Range("A5:B5")
arr1 = Application.WorksheetFunction.Transpose(arr01) '行数据转列数据
arr2 = Application.WorksheetFunction.Transpose(arr02)
arr3 = Application.WorksheetFunction.Transpose(arr1) '列数据转一维数组
arr4 = Application.WorksheetFunction.Transpose(arr2)
intR = UBound(arr3)
For intI = 1 To intR '两个一维数组中的数据组成键值对添加到字典
dicT.Add arr3(intI), arr4(intI)
Debug.Print arr3(intI) & vbTab & arr4(intI) '输出
Next
End Sub
运行过程,在立即窗口中输出字典数据。
A 1
B 2
【Python】
Python中使用xlwings包提供的字典转换器,可以轻松地将Excel工作表中的单元格区域数据读取到字典中。A4:B5单元格区域内的数据是行方向的,使用transpose参数,设置它的值为True进行转置:
编写代码如下:
>>> import xlwings as xw
>>> bk=xw.Book()
在工作表中输入图8-4中所示的数据。
>>> sht=xw.sheets.active
>>> sht.range('A1:B2').options(dict).value
{'A': 1.0, 'B': 2.0}
>>> sht.range('A4:B5').options(dict, transpose=True).value
{'A': 1.0, 'B': 2.0}
下面实现上面读取操作的逆操作,即给定字典,将数据以图8-4中两种形式写入到Excel工作表中。现假设给定字典的键为A和B,值为1和2。数据写入到工作表中的A1:B2和A4:B5单元格区域内。
【Excel VBA】
首先创建字典对象并添加键值对。使用字典对象的Keys和Items方法可以获取它的所有键和值,并以一维数组的形式保存。注意,一维数组的数据写入单元格区域的单列时需要将先用工作表函数Transpose转换为二维数组,写入单元格区域的单行时需要用Transpose函数转换两次,第1次一维转二维列数据,第2次二维列数据转二维行数据。
第1种情况,将字典数据写入工作表中的A1:B2单元格区域,A和B为列数据。编写过程代码如下所示。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。
Sub Test3()
Dim arr1(), arr2()
Dim intI As Integer
Dim intR As Integer
Dim dicT As Scripting.Dictionary
Set dicT = New Scripting.Dictionary '创建字典对象
dicT.Add "A", 1 '添加键值对
dicT.Add "B", 2
intR = dicT.Count
Range("A1").Resize(intR, 1) = Application. _
WorksheetFunction.Transpose(dicT.Keys) '键,一维转二维写入
Range("B1").Resize(intR, 1) = Application. _
WorksheetFunction.Transpose(dicT.Items) '值,一维转二维写入
End Sub
第2种情况,将字典数据写入工作表中的A4:B5单元格区域,A和B为行数据。编写过程代码如下所示。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。
Sub Test4()
Dim arr1(), arr2()
Dim intI As Integer
Dim intR As Integer
Dim dicT As Scripting.Dictionary
Set dicT = New Scripting.Dictionary '创建字典对象
dicT.Add "A", 1 '添加键值对
dicT.Add "B", 2
intR = dicT.Count
Range("A4").Resize(1, intR) = Application. _
WorksheetFunction.Transpose( _
Application. _
WorksheetFunction.Transpose(dicT.Keys)) '写入键,转两次
Range("A5").Resize(1, intR) = Application. _
WorksheetFunction.Transpose( _
Application. _
WorksheetFunction.Transpose(dicT.Items)) '写入值,转两次
End Sub
运行上面两个过程,在工作表中写入字典数据的效果如图8-4中所示。
【Python】
Python中使用xlwings包提供的字典转换器可以很方便地将给定的字典数据写入到Excel工作表。对于下面代码中的字典dic,写入列和写入行后的效果如图8-4所示。
>>> import xlwings as xw
>>> bk=xw.Book()
>>> sht=xw.sheets.active
>>> dic={'a': 1.0, 'b': 2.0}
>>> sht.range('A1:B2').options(dict).value=dic
>>> sht.range('A4:B5').options(dict, transpose=True).value=dic