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

2024-03-29 15:15:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个有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)

我收到以下错误消息:

File "C:/formulas_multi_sheets.py", line 31, in nrows = sheet.nrows

AttributeError: 'int' object has no attribute 'nrows'

我假设第31行中的错误适用于第32行。我使用的是python2.7。在


Tags: 数据inimportosfnamesheetrows公式
2条回答

由于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()   

在这里,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)

相关问题 更多 >