尝试使用python对工作表进行排序,循环和写入时的AttributeError

时间:2017-02-10 08:55:31

标签: python xlrd xlwt

我目前有一本包含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。

2 个答案:

答案 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()   
相关问题