字典数据的读写

本节介绍字典数据的格式化输出以及字典与Excel工作表之间的数据读写操作。

8.4.1字典数据的格式化输出

【Excel VBA】

Excel VBA输出字典数据没有特别之处,需要格式化输出的地方可以使用Format函数实现。

下面创建一个字典对象并添加键值对,然后在立即窗口中输出各键对应的值。其中学员的成绩进行格式化输出,要求小数点后面保留两位。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。

code.vba
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

运行过程,在立即窗口中输出字典数据。

code.vba
姓名:dqexcel
性别:男
成绩:92.00

【Python】

使用print函数输出字典数据时,可以用format函数指定输出的格式。下面首先创建一个字典。

code.python
>>> student = {'name':'dqexcel','sex':'男','score':92}

用{}占位,括号内可以从0开始添加数字,也可以不加数字。字典数据作为format函数的参数给出。

code.python
>>> print('姓名:{0},性别:{1},成绩:{2}'.format(student['name'],student['sex'], student['score']))
姓名:dqexcel,性别:男,成绩:92

用{}占位,括号内指定参数名称,format函数的参数使用对应的参数名称并指定字典数据。

code.python
>>> print('姓名:{name},性别:{sex},成绩:{score}'.\
format(name=student['name'],sex=student['sex'],score=student['score']))
姓名:dqexcel,性别:男,成绩:92

用{}占位,括号内输入键的名称,format函数的参数指定为字典名称,注意在字典名称前面添加两个*。

code.python
>>> print('姓名:{name},性别:{sex},成绩:{score}'.format(**student))
姓名:dqexcel,性别:男,成绩:92

用{}占位,括号内添加字典的索引形式,但是字典名称用0代替。format函数的参数指定为字典名称。

code.python
>>> print('{0[name]}:{0[sex]},{0[score]}'.format(student))
dqexcel:男,92

Excel工作表与字典之间的数据读写

Excel工作表与字典之间的数据读写包括两方面的内容,即将Excel工作表中单元格区域内的数据读取到字典中和将字典数据写入到Excel工作表中。

Document Image

图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。

code.vba
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

运行过程,在立即窗口中输出字典数据。

code.vba
A   1
B   2

下面的代码将图8-4所示的工作表中单元格区域A4:B5内的数据读取并保存到字典中,A和B作为字典的键,1和2作为字典的值。注意,因为键和值的取值都是单元格区域中的行数据,所以二维转一维时要转置两次。第1次行数据转列数据,第2次二维转一维。示例文件的存放路径为Samples\ch08\Excel VBA\字典数据的读写.xlsm。

code.vba
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

运行过程,在立即窗口中输出字典数据。

code.vba
A   1
B   2

【Python】

Python中使用xlwings包提供的字典转换器,可以轻松地将Excel工作表中的单元格区域数据读取到字典中。A4:B5单元格区域内的数据是行方向的,使用transpose参数,设置它的值为True进行转置:

编写代码如下:

code.python
>>> import xlwings as xw
>>> bk=xw.Book()

在工作表中输入图8-4中所示的数据。

code.python
>>> 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。

code.vba
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。

code.vba
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所示。

code.python
>>> 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