【求助】一小段读取excel的代码出错

Python/PHP/Perl 开发与设计
回复
头像
aric286
帖子: 943
注册时间: 2007-12-03 9:54
送出感谢: 0
接收感谢: 0
联系:

【求助】一小段读取excel的代码出错

#1

帖子 aric286 » 2011-03-20 20:40

第61行出错:
TypeError: unsupported operand type(s) for -: 'datetime.date' and 'str'
求各位大神帮帮忙啊。
看提示很简单,应该是date类型和str类型不能做减法,但是这句
startDate = datetime.date(y1,m1,d1)
得出的应该就是date类型啊?!

代码: 全选

#! /usr/bin/env python
#coding=gb18030
import xlrd
import datetime
#import os
#import time
fname='output.html'
name=[]#姓名列表
row_list = []#表格内容
startDate=''
endDate=''

def inputDate():
    startDate=''
    endDate=''
    (y1,m1,d1)=input('start Date(format:YYYY,MM,DD):')
    (y2,m2,d2)=input('end date(format:YYYY,MM,DD):')
    startDate = datetime.date(y1,m1,d1)
    
    endDate = datetime.date(y2,m2,d2)
    return startDate,endDate
def readNames():
    """读入name文件"""
    nameUrl='name.txt'
    f=open(nameUrl,'r')
    for i in f:
        name.append(i.rstrip('\n'))
    f.close()
def readSheet():
    '''读取短信excel表格'''
    book = xlrd.open_workbook('t.xls')
    sheet=book.sheet_by_index(0)

    nrows = sheet.nrows

    for i in range(0,nrows):
        row_data = sheet.row_values(i)
        row_list.append(row_data)

    #冒泡法以日期排序'''
    for a in range(0,len(row_list)-1):
        for b in range(a+1,len(row_list)):
            if row_list[a]>row_list[b]:
                t=row_list[a];row_list[a]=row_list[b];row_list[b]=t
def msg():
    print type(startDate)
    '''按照姓名'''
    msgbox=[]
    __s_date=datetime.date(1899, 12, 31).toordinal()-1#注意这里的日期算法
    for a in name:
        m='<tr bgcolor="White"><td>'+a+'</td>'
        for b in row_list:
            #print b[1].encode('gb18030')
            if a==b[1].encode('gb18030'):#如果姓名数据跟表格姓名相同
                m=m+'<td><ul>'
                lenb=len(b)
                for c in range(2,lenb):
                    if isinstance(b[c],float):
                        bDate=datetime.date.fromordinal(int(b[c])+__s_date)#看这个日期的算法
                        
                        days1=(bDate-startDate).days
                        days2=(bDate-endDate).days
                        if days1>=0 and days2<=0:
                            b[c]=bDate
                        else:
                            break
                    else:
                        b[c]=b[c].encode('gb18030')
                    m=m+'<li>'+str(b[c])+'</li>'
                    #print m
                m=m+'</ul></td>'
        m=m+'</tr>'
        msgbox.append(m)
    inputToFile(msgbox)
def inputToFile(msgbox):
    fobj=open(fname,'w')
    fobj.writelines('<script language="javascript">function preview(){\
    window.clipboardData.setData("Text",document.all("table1").outerHTML);\
    try\
    {\
    var ExApp = new ActiveXObject("Excel.Application");\
    var ExWBk = ExApp.workbooks.add();\
    var ExWSh = ExWBk.worksheets(1);\
    ExApp.DisplayAlerts = false;\
    ExApp.visible = true;\
    }  \
    catch(e)\
    {\
    alert("您的电脑没有安装Microsoft excel软件!");\
    return false\
    } \
     ExWBk.worksheets(1).Paste;	\
}</script>\
')
    fobj.writelines('<table align="center"><tr><td><input type="button" value="output excel" onclick="preview();"></td></tr></table>')
    fobj.writelines('<table id="table1" bgcolor="gray" border=1>')
    fobj.writelines([a for a in msgbox])
    fobj.writelines('</table>')
    fobj.close()
if __name__ == '__main__':
    inputDate()#输入日期
    readNames()#读取姓名数据
    readSheet()#读取表格内容
    msg()
代码中读取的excel文件
t.xls
(93.5 KiB) 下载 18 次
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 【求助】一小段读取excel的代码出错

#2

帖子 lilydjwg » 2011-03-20 20:47

注意变量的作用域。
头像
aric286
帖子: 943
注册时间: 2007-12-03 9:54
送出感谢: 0
接收感谢: 0
联系:

Re: 【求助】一小段读取excel的代码出错

#3

帖子 aric286 » 2011-03-20 20:51

我猜出来了,但是这个应该怎么改呢?请大神帮忙看看阿
头像
aric286
帖子: 943
注册时间: 2007-12-03 9:54
送出感谢: 0
接收感谢: 0
联系:

Re: 【求助】一小段读取excel的代码出错

#4

帖子 aric286 » 2011-03-20 21:11

不能沉了啊,哪位帮我解答一下,感激不尽 阿
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 【求助】一小段读取excel的代码出错

#5

帖子 lilydjwg » 2011-03-20 21:30

你为什么不看教程呢。。

简单的解决办法是:

代码: 全选

global startDate, endDate
但这样的代码实在是太 Ugly 了。
头像
aric286
帖子: 943
注册时间: 2007-12-03 9:54
送出感谢: 0
接收感谢: 0
联系:

Re: 【求助】一小段读取excel的代码出错

#6

帖子 aric286 » 2011-03-20 21:40

:em06
见笑了,要不是因为这个问题很长时间解决不了,我是不会放在这的,水平太那个啥了
这个全局变量的定义放在什么地方呢? :em03
头像
aric286
帖子: 943
注册时间: 2007-12-03 9:54
送出感谢: 0
接收感谢: 0
联系:

Re: 【求助】一小段读取excel的代码出错

#7

帖子 aric286 » 2011-03-20 21:42

另外,我也确实看教程了,无奈的是,半路出家,还没老师教,看教程觉得还行,但写东西就真难为我了
头像
lilydjwg
论坛版主
帖子: 4163
注册时间: 2009-04-11 23:46
系统: Arch Linux
送出感谢: 11 次
接收感谢: 127 次
联系:

Re: 【求助】一小段读取excel的代码出错

#8

帖子 lilydjwg » 2011-03-20 23:51

aric286 写了::em06
见笑了,要不是因为这个问题很长时间解决不了,我是不会放在这的,水平太那个啥了
这个全局变量的定义放在什么地方呢? :em03
我很想给你贴教程。。。
回复

回到 “Python/Php/Perl”