使用 xlwings 计算 excel sheet 中 Python 中的行数
Count rows in excel sheet in Python with xlwings
我在Python中有一个脚本,它使用xlwings打开一个Excel文件,并逐行读取和处理某一列的值。这是 for 语句:
for row in range(2, rownum):
我想在 sheet 中实际包含某些内容的每一行上重复此函数。它从 2 开始,到 'rownum' 结束。我的问题是如何自动计算行数并将该值传递给 'rownum'。我确定 xlwings 有办法做到这一点,但我想不通——也许是 Autofit 工具?
感谢您的帮助!
除非我在阅读他们的 API documentation 时遗漏了什么,否则这似乎是不可能的。您可能需要使用其他库,例如 pandas
:
import pandas as pd
df = pd.read_excel(excel_file_path, sheetname="Sheet1")
print len(df)
如果你不想为此使用另一个库,你可以用艰难而丑陋的方式来做:
last_row = 0
while True:
if cell_value is not None: # replace cell_value with however
# xlwings accesses a cell's value
last_row += 1
else:
break
print last_row
使用 xlwings,您将首先读取范围,然后遍历它:
rng = Range((startrow, startcol), (rownum, colnum)).value
for row in rng:
...
然后在最后,将结果写回:
Range((startrow, startcol)).value = result_rng
这样可以最大限度地减少缓慢的跨应用程序调用。
您可能还想使用 Range.table
。
如果您只查找行数,您可以使用范围的 current_region
属性 获得 array/table 中的总行数,然后获取此范围的最后一个单元格的地址:(仅当您的范围是连续的时才有效 - 内部没有空 rows/columns)
rownum = Range('A1').current_region.last_cell.row
或者,您可以使用 table
而不是 current_region
,范围会略有不同。
完成后,您可以循环遍历行:
for i in range(1, rownum + 1): # The indexing starts at 1
Range((i, 1)) = ... # Will select cell 'Ai'
但是正如其他答案中提到的那样,这会增加应用程序之间的调用,这会慢得多。最好导入范围,修改它并导出回 Excel.
如果没有空白行,你可以这样使用:
len(Range('A1').vertical)
我不得不做一个计数器,因为我正在自动化一堆从 excel 中获取并填充到不同网站上的东西。这只是我想出的 "prototype" 只是为了确保我能做到。
wb = xw.Book(r'C:\Users\dd\Desktop\Testbook.xlsm')
Dudsht = wb.sheets['Dud']
lastcell = Dudsht.range(1,1).end('down').row #this just does ctrl+shift+down
print(lastcell) #just so you know how many rows you have. Mine was 30.
x = 2
for i in range(x, lastcell+1): #range of 2 to 30
Dudsht.cells(i,2).value = 'y' #enters 'y' triggering formulas
if Dudsht.cells(i,1).value == 'ERROR':
Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 2
continue #if there is an error it will hightlight and skip an item
time.sleep(.5) #this was just so I could see visually
Dudsht.cells(i,2).value = 'x'
print('Item' + str(i) + ' Complete') #Item1 Complete
time.sleep(.5)
Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 3 #highlights completed item
您不需要知道 sheet 中有多少行。
import xlwings as xw
wb = xw.Book('20180301.xlsm')
sh = wb.sheets['RowData']
rownum = 2
while (sh.range('A'+str(rownum)).value != None):
value = sh.range('A'+str(rownum)).value
print(str(value))
rownum += 1
这将打印出 A 列中的所有数据。
used_range_rows = (active_sheet.api.UsedRange.Row, active_sheet.api.UsedRange.Row + active_sheet.api.UsedRange.Rows.Count)
used_range_cols = (active_sheet.api.UsedRange.Column, active_sheet.api.UsedRange.Column + active_sheet.api.UsedRange.Columns.Count)
used_range = xw.Range(*zip(used_range_rows, used_range_cols))
计算列中中间有空单元格的行数:
import xlwings as xw
wb = xw.Book(loc)
sheet = wb.sheets['sheetname']
counter = 0
rownum = 1
while (rownum >= 1):
if sheet.range('A'+str(rownum)).value !=None:
counter += 1
elif sheet.range('A'+str(rownum)).value == None and sheet.range('A'+str(rownum+1)).value != None:
counter += 1
elif sheet.range('A'+str(rownum)).value == None and sheet.range('A'+str(rownum+1)).value == None:
counter += 1
break
rownum += 1
我在Python中有一个脚本,它使用xlwings打开一个Excel文件,并逐行读取和处理某一列的值。这是 for 语句:
for row in range(2, rownum):
我想在 sheet 中实际包含某些内容的每一行上重复此函数。它从 2 开始,到 'rownum' 结束。我的问题是如何自动计算行数并将该值传递给 'rownum'。我确定 xlwings 有办法做到这一点,但我想不通——也许是 Autofit 工具?
感谢您的帮助!
除非我在阅读他们的 API documentation 时遗漏了什么,否则这似乎是不可能的。您可能需要使用其他库,例如 pandas
:
import pandas as pd
df = pd.read_excel(excel_file_path, sheetname="Sheet1")
print len(df)
如果你不想为此使用另一个库,你可以用艰难而丑陋的方式来做:
last_row = 0
while True:
if cell_value is not None: # replace cell_value with however
# xlwings accesses a cell's value
last_row += 1
else:
break
print last_row
使用 xlwings,您将首先读取范围,然后遍历它:
rng = Range((startrow, startcol), (rownum, colnum)).value
for row in rng:
...
然后在最后,将结果写回:
Range((startrow, startcol)).value = result_rng
这样可以最大限度地减少缓慢的跨应用程序调用。
您可能还想使用 Range.table
。
如果您只查找行数,您可以使用范围的 current_region
属性 获得 array/table 中的总行数,然后获取此范围的最后一个单元格的地址:(仅当您的范围是连续的时才有效 - 内部没有空 rows/columns)
rownum = Range('A1').current_region.last_cell.row
或者,您可以使用 table
而不是 current_region
,范围会略有不同。
完成后,您可以循环遍历行:
for i in range(1, rownum + 1): # The indexing starts at 1
Range((i, 1)) = ... # Will select cell 'Ai'
但是正如其他答案中提到的那样,这会增加应用程序之间的调用,这会慢得多。最好导入范围,修改它并导出回 Excel.
如果没有空白行,你可以这样使用:
len(Range('A1').vertical)
我不得不做一个计数器,因为我正在自动化一堆从 excel 中获取并填充到不同网站上的东西。这只是我想出的 "prototype" 只是为了确保我能做到。
wb = xw.Book(r'C:\Users\dd\Desktop\Testbook.xlsm')
Dudsht = wb.sheets['Dud']
lastcell = Dudsht.range(1,1).end('down').row #this just does ctrl+shift+down
print(lastcell) #just so you know how many rows you have. Mine was 30.
x = 2
for i in range(x, lastcell+1): #range of 2 to 30
Dudsht.cells(i,2).value = 'y' #enters 'y' triggering formulas
if Dudsht.cells(i,1).value == 'ERROR':
Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 2
continue #if there is an error it will hightlight and skip an item
time.sleep(.5) #this was just so I could see visually
Dudsht.cells(i,2).value = 'x'
print('Item' + str(i) + ' Complete') #Item1 Complete
time.sleep(.5)
Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 3 #highlights completed item
您不需要知道 sheet 中有多少行。
import xlwings as xw
wb = xw.Book('20180301.xlsm')
sh = wb.sheets['RowData']
rownum = 2
while (sh.range('A'+str(rownum)).value != None):
value = sh.range('A'+str(rownum)).value
print(str(value))
rownum += 1
这将打印出 A 列中的所有数据。
used_range_rows = (active_sheet.api.UsedRange.Row, active_sheet.api.UsedRange.Row + active_sheet.api.UsedRange.Rows.Count)
used_range_cols = (active_sheet.api.UsedRange.Column, active_sheet.api.UsedRange.Column + active_sheet.api.UsedRange.Columns.Count)
used_range = xw.Range(*zip(used_range_rows, used_range_cols))
计算列中中间有空单元格的行数:
import xlwings as xw
wb = xw.Book(loc)
sheet = wb.sheets['sheetname']
counter = 0
rownum = 1
while (rownum >= 1):
if sheet.range('A'+str(rownum)).value !=None:
counter += 1
elif sheet.range('A'+str(rownum)).value == None and sheet.range('A'+str(rownum+1)).value != None:
counter += 1
elif sheet.range('A'+str(rownum)).value == None and sheet.range('A'+str(rownum+1)).value == None:
counter += 1
break
rownum += 1