【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


Sub test301()
 
Dim sh As Object

 
For Each sh In ThisWorkbook.Worksheets
    Debug.Print sh.Name
Next

For i = 1 To ThisWorkbook.Worksheets.Count
    Debug.Print ThisWorkbook.Worksheets(i).Name
Next


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 代码

'VBA对单个sheet处理
'特殊点:处理本EXCEL文件,因为开着VBE,VBA属于本文件,所以本EXCEL表比然是打开的
Sub print2001()

    Dim path1 As Object
    Set path1 = ThisWorkbook.Worksheets("now")
    
    '读指定sheet里特定内容
    Debug.Print path1.Cells(1, 1)

    '往wb的指定sheet写入内容
    '查下path1当前最大行
    maxr = path1.Cells(9999, 1).End(xlUp).Row
    path1.Cells(maxr + 1, 1) = 100
    path1.Cells(maxr + 1, 2) = 101
    path1.Cells(maxr + 1, 3) = 102
    path1.Cells(maxr + 1, 4) = 103

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,然后写入即可
'注意VBA里数组的1to4 和1,4完全不同,后者是2维数组
'VBA处理一个wb里的多个sheet处理
Sub print2002()

    Dim path1 As Object
    Dim wb As Object
    Dim sht As Object

    For Each sht In ThisWorkbook.Worksheets
        Debug.Print "sheetName=" & sht.Name
        
        maxr = sht.Cells(9999, 1).End(xlUp).Row
        maxl = sht.Cells(1, 9999).End(xlToLeft).Column
        Debug.Print "现有内容的最大行数=" & maxr
        Debug.Print "现有内容的最大列数=" & maxl
        
        '因为表很大,数据散布在全表的不同格子里,尝查找限定范围内的内容
        '显示指定区域的内容
        arr1 = sht.Range("a1:d10")
        For i = LBound(arr1, 1) To UBound(arr1, 1)
            For j = LBound(arr1, 2) To UBound(arr1, 2)
                Debug.Print arr1(i, j),
            Next
            Debug.Print
        Next
        
        '显示表里用过的内容
        arr2 = sht.UsedRange
        For i = LBound(arr2, 1) To UBound(arr2, 1)
            For j = LBound(arr2, 2) To UBound(arr2, 2)
                Debug.Print arr2(i, j),
            Next
            Debug.Print
        Next
     Next
    
    '这里写入
    '往wb的指定sheet写入内容,还是先只追加1行
    '查下path1当前最大行
    For Each sht In ThisWorkbook.Worksheets
        For k = 1 To 4
            sht.Cells(maxr + 1, k) = 99 * k
        Next
    Next

End Sub

2 用python 读写EXCEL文件

2.1 代码例子

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

import random
import xlwt
import openpyxl

  
    with open(r"C:\Users\Administrator\Desktop\ppp2.txt",'a') as f:
        f.writelines([str(cup_num)+'\n',str(capacity)+'\n'])
        sss = []
        for cup in state2:
            a = ""
            for w in cup:
                a += str(w)+" "
            sss.append(a+'\n')
        f.writelines(sss)

    #wb=xlwt.workbook(r"C:\Users\Administrator\Desktop\water1.xlsx",encoding='utf-8')
    wb=xlwt.Workbook()  #wb=xlwt.Workbook必须大写W?
    #指定文件后,指定sheet
    worksheet=wb.add_sheet("sheet1")
    #指定列
    print ("y=",y)
    worksheet.write(y,1,[str(cup_num)+'\n'])    #1-x
    worksheet.write(y,2,[str(color_num)+'\n'])             
    worksheet.write(y,3,[str(empty_cup)+'\n']) 
    worksheet.write(y,4,[str(capacity)+'\n']) 
        
    sss = []
    for cup in state2:
        a = ""
        for w in cup:
            a += str(w)+","
            #a=a[:-2]
        sss.append(a+"|"+'\n')

    
    worksheet.write(y,5,sss)

    
    wb.save(r"C:\Users\Administrator\Desktop\water1.xls")      #必须单独写保存语句,而且不能是xlsx xlsm #还不能是打开状态
    
    
# 末尾多, 多| 空元素之间逗号?
#存的行数为啥从25,还互相覆盖?
        
    
#新增输出到excel, 修改格式 ,之后还要读到py里解析
#新增一次循环生成多个题目

#superquiz
#eval(superquiz)
superquiz()

2.2 需要导入的模块

import xlwt
import openpyxl

2.3 基本的语法

用import xlwt

用 import openpyxl

后续不同

分2部分写把

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值