这里的读取方法,不用最大行号最大列号,直接使用used_range对应的方法
代码如下:
import xlwings as xw
file_path = r'...\AAA.xlsx'
# 实例化app,打开文件
app_e = xw.App(Visible=False,add_book=False)
work_book = appe.books.open(file_path)
# 找到要读取的sheet页
sht = work_book.sheets[0]
# 获取使用区域
list_data_0 = sht.used_range # 此行主要是测试用,看看used_range的打印结果是什么,与获取数据操作无关
print(f'list_data_0:\t{list_data_0}')
# 直接从使用区域获取数据
## 获取使用区域的数据(二维数组形式)
list_data = sht.used_range.value
print(f'list_data:\t{list_data}')
## 取出二维数组中的每一个数(即每一个单元格的数据)
list_1 = []
for row in list_data:
for data in row:
list_1.append(data)
print(f'list_1:\t{list_1}')
# 手写代码,谨慎复制。
另一种从最大行最大列获取数据的方法也写在下面
import xlwings as xw
file_path = r'...\AAA.xlsx'
# 实例化app,打开文件
app_e = xw.App(Visible=False,add_book=False)
work_book = appe.books.open(file_path)
# 找到要读取的sheet页
sht = work_book.sheets[0]
# 读取使用区域的最后一个单元格,依次来获取最大行号、最大列号
row_num = sht.used_range.last_cell.row
col_num = sht.used_range.last_cell.column
# 循环读取数据
list_1 = []
for i in range(row_num):
for j in range(col_num):
value_x = sht.range(i+1,j+1).value
list_1.append(value_x)
print(f'list_1:\t{list_1}')
# 在循环中range(i,j)为什么+1呢?
# 这是因为xlwings中单元格索引从1开始,如果不作+1处理,会出现pywintypes.com_error: (-2147352567, '发生意外。', (0, None, None, None, 0, -2146827284), None)的错误
# 循环读取数据的另一种写法
list_2 = []
for i in range(1,row_num+1):
for j in range(1,col_num+1):
value_x = sht.range(i,j).value
list_2.append(value_x)
print(f'list_1:\t{list_2}')
之所以不用读取最大行号、最大列号然后循环的方法,是因为这种方法会把使用区域外的空白单元格也读进去,尤其是空白区域在使用区域左侧,如我使用的这个Excel文件
下方红色区域内,绿色标注的就是使用区域之外空白区域的数据
使用uesd_range.value读取的结果如下
used_range.value读取的结果没有涉及使用区域外的内容,且used_range.value读取的结果是一个二维数组,按行读取的,要取出具体数据,循环一下used_range.value即可。
截图中的list_1、list_2、list_3是我测试时使用的,与本文代码中的指代不一样,别被混淆了。
注:xlwings也可以使用i,j进行单元格数据的循环读取,并不是只能用range('A1').value这样使用单元格位置(英文+数字)的形式读取数据。
祝好。