• 【python VS vba(系列2)】 python和vba读写EXCEL文件的方式比较 (建设ing)


    目录

    1   用VBA读写EXCEL文件

    1.1 VBA 针对 EXCEL相关的语法内容

    1.1.1 EXCEL文件的层级关系

    1.1.2 这些都对象,和python等新语言一样

    1.1.3 遍历sheet

    1.1.4 具体存储内容的对象

    1.1.5 还有很多有用的特殊用法

    1.2 用VBA读写本工作簿workbook里的特定sheet的特定内容

    1.2.1 EXCEL表内内容访问

    1.2.2 注意点

    1.2.3 代码

    1.3 用VBA读写本工作簿workbook里的所有sheet的内容

    1.3.1 麻烦之处

    1.3.2 方法,如何指定EXCEL里的内容范围

    1.3.3 写入内容

    2 用python 读写EXCEL文件

    2.1 代码例子


    1   用VBA读写EXCEL文件

    • 因为VBA内嵌在EXCEL里,所以,VBA处理EXCEL文件是最近的楼台
    • vba 读写EXCEL文件,不需要 read, write 等关键词语句或者函数,直接读写即可,比较顺畅

    1.1 VBA 针对 EXCEL相关的语法内容

    1.1.1 EXCEL文件的层级关系

     application(EXCEL/WORD/ppt) ----workbook-----worksheets-----worksheet-----range()/cell()/rows()/columns()

    1.1.2 这些都对象,和python等新语言一样

    • 需要定义为对象
    • 然后用set 语句赋值
    • 既然都是对象,那么就可以使用
    • 对象.方法,  对象.属性
    • 比如
    • sheet.name
    • worksheets.count

    dim sh as object

    set sh=thisworkbook.activesheet

    或者

    dim sh as  worksheet

    set sh=thisworkbook.worksheets("")

    1.1.3 遍历sheet

    • for each sh in thisworkbook.worksheets
    • next
    • for i = 1 to thisworkbook.worksheets.count
    • next

    1. Sub test301()
    2. Dim sh As Object
    3. For Each sh In ThisWorkbook.Worksheets
    4. Debug.Print sh.Name
    5. Next
    6. For i = 1 To ThisWorkbook.Worksheets.Count
    7. Debug.Print ThisWorkbook.Worksheets(i).Name
    8. Next
    9. End Sub

    1.1.4 具体存储内容的对象

    注意不同的表示方法的细微差别

    1. sheet.cells(i,j)
    2. sheet.range("a1:c5")
    3. sheet.rows(5) 

    1.1.5 还有很多有用的特殊用法

    1. sheet.usedrange()
    2. cells().end(xltoup)
    3. ...

    1.2 用VBA读写本工作簿workbook里的特定sheet的特定内容

    • VBA对单个sheet处理
    • 特殊点:
    1. 处理本EXCEL文件,因为开着VBE,VBA属于本文件,所以本EXCEL表必然是打开的
    2. 对应语法用的也是 thisworkbook.worksheets() ,若不指定缺省也会如此默认

    1.2.1 EXCEL表内内容访问

    • 具体到内部,因为EXCEL天生是表格,是数组,是2维数组等
    • 需要使用下面这些对象的层级
    • 注意不同的表示方法的细微差别

    注意不同的表示方法的细微差别

    1. sheet.cells(i,j)
    2. sheet.range("a1:c5")
    3. sheet.rows(5) 
    4. sheet.usedrange()

    1.2.2 注意点

    • 注意用于保存workbook, worksheet的变量
    1. 必须先定义为对象
    2. 且用set赋值
    • 比如   
    • Dim path1 As Object (或者worksheet)
    •  Set path1 = ThisWorkbook.Worksheets("now")

    1.2.3 代码

    1. 'VBA对单个sheet处理
    2. '特殊点:处理本EXCEL文件,因为开着VBE,VBA属于本文件,所以本EXCEL表比然是打开的
    3. Sub print2001()
    4. Dim path1 As Object
    5. Set path1 = ThisWorkbook.Worksheets("now")
    6. '读指定sheet里特定内容
    7. Debug.Print path1.Cells(1, 1)
    8. '往wb的指定sheet写入内容
    9. '查下path1当前最大行
    10. maxr = path1.Cells(9999, 1).End(xlUp).Row
    11. path1.Cells(maxr + 1, 1) = 100
    12. path1.Cells(maxr + 1, 2) = 101
    13. path1.Cells(maxr + 1, 3) = 102
    14. path1.Cells(maxr + 1, 4) = 103
    15. End Sub

    1.3 用VBA读写本工作簿workbook里的所有sheet的内容

    • 目标是遍历这个,整个thisworkbook里面的内容
    • '注意VBA里数组语法的 1 to 4 和1,4完全不同,后者是2维数组

    1.3.1 麻烦之处

    • '处理EXCEL的内容会比一般文件麻烦
    • 因为EXCEL天生是表格,是数组,是2维数组等, 一般可以使用双层循环取得二维数组的内容
    • 'VBA处理一个wb里的多个sheet处理,同样使用循环
    1. 注意正确的是 for sheet in workbook.worksheets
    2. 注意是 for sheet in workbook.worksheet  或 for sheet in workbook是错误的

    1.3.2 方法,如何指定EXCEL里的内容范围

    • 1 指定要读写的范围边界,写入数组,然后操作数组
    • 2 使用 sheet.usedrange() 作为数组的数据源

    1.3.3 写入内容

    • 遍历 sheet,然后写入即可
    1. '注意VBA里数组的1to4 和1,4完全不同,后者是2维数组
    2. 'VBA处理一个wb里的多个sheet处理
    3. Sub print2002()
    4. Dim path1 As Object
    5. Dim wb As Object
    6. Dim sht As Object
    7. For Each sht In ThisWorkbook.Worksheets
    8. Debug.Print "sheetName=" & sht.Name
    9. maxr = sht.Cells(9999, 1).End(xlUp).Row
    10. maxl = sht.Cells(1, 9999).End(xlToLeft).Column
    11. Debug.Print "现有内容的最大行数=" & maxr
    12. Debug.Print "现有内容的最大列数=" & maxl
    13. '因为表很大,数据散布在全表的不同格子里,尝查找限定范围内的内容
    14. '显示指定区域的内容
    15. arr1 = sht.Range("a1:d10")
    16. For i = LBound(arr1, 1) To UBound(arr1, 1)
    17. For j = LBound(arr1, 2) To UBound(arr1, 2)
    18. Debug.Print arr1(i, j),
    19. Next
    20. Debug.Print
    21. Next
    22. '显示表里用过的内容
    23. arr2 = sht.UsedRange
    24. For i = LBound(arr2, 1) To UBound(arr2, 1)
    25. For j = LBound(arr2, 2) To UBound(arr2, 2)
    26. Debug.Print arr2(i, j),
    27. Next
    28. Debug.Print
    29. Next
    30. Next
    31. '这里写入
    32. '往wb的指定sheet写入内容,还是先只追加1行
    33. '查下path1当前最大行
    34. For Each sht In ThisWorkbook.Worksheets
    35. For k = 1 To 4
    36. sht.Cells(maxr + 1, k) = 99 * k
    37. Next
    38. Next
    39. End Sub

    2 用python 读写EXCEL文件

    2.1 代码例子

    需要加载专门的模块---也就是前人造好的轮子,比如这2个:

    1. import random
    2. import xlwt
    3. import openpyxl
    4. with open(r"C:\Users\Administrator\Desktop\ppp2.txt",'a') as f:
    5. f.writelines([str(cup_num)+'\n',str(capacity)+'\n'])
    6. sss = []
    7. for cup in state2:
    8. a = ""
    9. for w in cup:
    10. a += str(w)+" "
    11. sss.append(a+'\n')
    12. f.writelines(sss)
    13. #wb=xlwt.workbook(r"C:\Users\Administrator\Desktop\water1.xlsx",encoding='utf-8')
    14. wb=xlwt.Workbook() #wb=xlwt.Workbook必须大写W?
    15. #指定文件后,指定sheet
    16. worksheet=wb.add_sheet("sheet1")
    17. #指定列
    18. print ("y=",y)
    19. worksheet.write(y,1,[str(cup_num)+'\n']) #1-x
    20. worksheet.write(y,2,[str(color_num)+'\n'])
    21. worksheet.write(y,3,[str(empty_cup)+'\n'])
    22. worksheet.write(y,4,[str(capacity)+'\n'])
    23. sss = []
    24. for cup in state2:
    25. a = ""
    26. for w in cup:
    27. a += str(w)+","
    28. #a=a[:-2]
    29. sss.append(a+"|"+'\n')
    30. worksheet.write(y,5,sss)
    31. wb.save(r"C:\Users\Administrator\Desktop\water1.xls") #必须单独写保存语句,而且不能是xlsx xlsm #还不能是打开状态
    32. # 末尾多, 多| 空元素之间逗号?
    33. #存的行数为啥从25,还互相覆盖?
    34. #新增输出到excel, 修改格式 ,之后还要读到py里解析
    35. #新增一次循环生成多个题目
    36. #superquiz
    37. #eval(superquiz)
    38. superquiz()

    2.2 需要导入的模块

    import xlwt
    import openpyxl

    2.3 基本的语法

    用import xlwt

    用 import openpyxl

    后续不同

    分2部分写把

  • 相关阅读:
    Linux下企业级夜莺监控分析工具的远程访问设置【内网穿透】
    Navicat连接Oracle数据库:Oracle library is not loaded 解决方案
    [附源码]Python计算机毕业设计Django高校体育场馆管理系统
    leetcode:67. 二进制求和
    【网络原理】| 应用层协议与传输层协议 (UDP)
    《痞子衡嵌入式半月刊》 第 79 期
    项目实战(计划任务,Mybatis拦截器,SpringMVC)
    【MyBatis】四、MyBatis中的动态SQL标签
    大三上人工智能课设,对亚马逊商城评论数据集进行数据分析并可视化(文本特征提取,KNN算法预测评分,进行词关联并绘制云图)
    【TCP】粘包问题 以及 异常处理
  • 原文地址:https://blog.csdn.net/xuemanqianshan/article/details/133997836