我目前有一本包含5个工作表的工作簿。列a-e中有数据,而每个工作表可能具有相同列中的数据,但每个工作表具有不同的不同数量的行。我在f列中输入一个公式,它将从单元格F4转到该工作表中的最后一行。 我能够遍历工作表并能够创建一个从F4到最后一行的公式,但是我无法让两者一起工作。
代码
import os
import os.path
import urllib
import xlrd
import xlwt
from xlutils.copy import copy
fname = "test.xls"
destination = 'C:\Users\Raj Saha\Google Drive\Python\Excel-Integration'
rb = xlrd.open_workbook(fname,formatting_info=True) #original workbook
r_sheet = rb.sheet_by_index(1) #origianl worksheet
style = xlwt.easyxf('font: bold 1')
wb = copy(rb) #virtual workbook
#sheet = wb.get_sheet(1)
shxrange = range(rb.nsheets)
sh = rb.sheet_by_name("Data 1")
#print "total rows: %d, rows less headers: %d" % (nrows, rows)
for sheet in shxrange:
nrows = sheet.nrows
rows = nrows - 4
for i in range(rows):
sheet.write(i+3, 5, xlwt.Formula("B%d-C%d" % (i+4, i+4)))
sheet.write(2,5,"CL1-CL2",style)
wb.save(fname)
我收到以下错误消息:
文件" C:/formulas_multi_sheets.py",第31行,在 nrows = sheet.nrows
AttributeError:' int'对象没有属性' nrows'
我假设第31行的错误适用于第32行。我使用的是python 2.7。
答案 0 :(得分:0)
这里,shxrange给你整数。你需要的是sheet
类对象。为获取工作簿中每张工作表的对象,
for sheet_no in shxrange:
sheet=rb.sheet_by_index(sheet_no)
nrows = sheet.nrows
rows = nrows - 4
for i in range(rows):
sheet.write(i+3, 5, xlwt.Formula("B%d-C%d" % (i+4, i+4)))
sheet.write(2,5,"CL1-CL2",style)
答案 1 :(得分:0)
由于xlrd和wlwt的限制,我转向win32com。以下是我提出的以下解决方案。我能够在多个工作表中对数据进行排序,并将公式添加到多个工作表中。
<强>代码强>
import win32com.client as win32
import types
from win32com.client import constants as c
fname = ('C:/Users/test.xls')
xlApp = win32.gencache.EnsureDispatch('Excel.Application')
xlApp.Visible = True
xlDescending = 2
xlSortColumns = 1
sh_range = range(2,6)
wb = xlApp.Workbooks.Open(fname)
for sh in wb.Sheets:
rangeFrom = 'F4'
column = 'F'
lastRow = sh.UsedRange.Rows.Count
rangeTo = rangeFrom + ':' + column + str(lastRow)
print "%r" % rangeTo
xlApp.Worksheets(sh.Name).Activate()
ws = xlApp.ActiveSheet
ws.Range('f3').Value = "CL1-CL2"
ws.Range('f4').Formula = "=B4-C4"
ws.Range('f4:f4').Select()
xlApp.Selection.AutoFill(ws.Range(rangeTo),win32.constants.xlFillDefault)
for i in sh_range:
xlApp.Sheets(i).Range("A4:E50000").Sort(Key1=xlApp.Sheets(i).Range("A4"), Order1=xlDescending, Orientation=xlSortColumns)
wb.Save()
wb.Close()