python - 无法关闭 xlsxwriter 中的工作表
问题描述
我正在尝试使用 xlsxwriter 创建一个 excel 工作簿,但是当我尝试这样做时,workbook.close()
我得到以下异常:
Traceback (most recent call last):
File "/usr/local/bin/fab", line 11, in <module>
sys.exit(program.run())
File "/usr/local/lib/python2.7/site-packages/invoke/program.py", line 363, in run
self.execute()
File "/usr/local/lib/python2.7/site-packages/invoke/program.py", line 532, in execute
executor.execute(*self.tasks)
File "/usr/local/lib/python2.7/site-packages/invoke/executor.py", line 129, in execute
result = call.task(*args, **call.kwargs)
File "/usr/local/lib/python2.7/site-packages/invoke/tasks.py", line 128, in __call__
result = self.body(*args, **kwargs)
File "/app/fabfile.py", line 168, in test2
workbook.close()
File "/usr/local/lib/python2.7/site-packages/xlsxwriter/workbook.py", line 304, in close
self._store_workbook()
File "/usr/local/lib/python2.7/site-packages/xlsxwriter/workbook.py", line 676, in _store_workbook
xlsx_file.write(os_filename, xml_filename)
File "/usr/lib64/python2.7/zipfile.py", line 1146, in write
zinfo.header_offset = self.fp.tell() # Start of header bytes
AttributeError: 'tuple' object has no attribute 'tell'
Exception AttributeError: "'tuple' object has no attribute 'tell'" in <bound method ZipFile.__del__ of <zipfile.ZipFile object at 0x7f87fcffa410>> ignored
我正在查询一个数据库,然后创建 3 张工作表并在其中填写表格,这是代码:
def summary_main():
start_time = time.time()
print "starting job}"
##setup db and extract summaries
files_last_date = input("date in yyyy-mm-dd")
sql_h = SqlHelper()
date = datetime.today().strftime("%Y-%m-%d")
file_name=('/app/SUMMARY_',date,'.xlsx')
print "file name created = ",file_name
workbook = xlsxwriter.Workbook(file_name)
get_uploaded_files(workbook,files_last_date,sql_h)
# getting exception in the following line
workbook.close()
print "\n\nSummary has been saved, workbook closed"
上面的代码在我的本地机器上的 python3 中运行得很好,但是在服务器上我们试图在 python2 上运行相同的代码,这是代码不起作用的原因吗?在最后一行抛出异常,这意味着在此之前没有兼容性问题。在 get_uploaded_files 函数中,我查询数据库并将数据写入工作表,如下所示:
def get_uploaded_files(wb,dt,sql_h):
sheet = wb.add_worksheet("Uploaded Files")
data_set = sql_h.getData(dt,1)
header = ["File ID", "First Name", "Last Name", "File Name", "Comments"]
sql_h.parse_sql_data(sheet,header,data_set,wb)
以下 2 个函数在名为 SqlHelper_py2.py 的单独文件中定义
def getData(self,dt,case):
print(self.conn)
cur=self.conn.cursor()
data_set=""
if case==1:
cur.execute(self.sql_uploaded_file.replace("%s",str(dt)))
data_set=cur.fetchall()
cur.close()
return data_set
def parse_sql_data(self,sheet,header,data_set,workbook):
format_bold=workbook.add_format({'bold': True,'border':1})
format_border=workbook.add_format({'border':1})
col = 0
count=0
dict_max={0:0}
for h in header:
sheet.write(0,col,h,format_bold)
col+=1
dict_max[count]=len(str(h))
count+=1
row = 1
for data in data_set:
col=0
for d in data:
if(dict_max[col] is not None and len(str(d))>dict_max[col]):
dict_max[col]=len(str(d))
if("datetime.datetime" not in str(type(d))):
sheet.write(row,col,d,format_border)
col+=1
row+=1
for key in dict_max:
sheet.set_column(key,key,dict_max[key]+5)
解决方案
上面的代码在我本地机器上的 python3 中运行良好
我觉得这很难相信,因为您使用了print
语句,这会在 Python 3 上导致语法错误。无论如何,回到您的主要问题:
AttributeError:“元组”对象没有“告诉”属性
tell
是文件对象的一种方法。不知何故,xlswriter 在它需要一个文件对象的地方持有一个元组。我们是否在您的代码中看到任何可疑的元组?是的:
file_name=('/app/SUMMARY_',date,'.xlsx')
workbook = xlsxwriter.Workbook(file_name)
你file_name
不是一个字符串,而是一个字符串元组。 xlsxwriter.Workbook
需要一个字符串或一个文件对象。当它看到你没有向它传递一个字符串时,它假定它必须是一个文件对象。
要解决此问题,请将文件名的各个部分连接到实际字符串中:
file_name = ''.join('/app/SUMMARY_',date,'.xlsx')
推荐阅读
- javascript - Uncaught (in promise): TypeError: this.auth.user$.map is not a function
- jquery - YouTube 播放器无法识别嵌入的 YouTube 视频
- javascript - 单选按钮 onChange 功能不会更新应用程序的状态 - React
- python - Python 特殊方法名称的完整列表?
- python - 如何使用 Microsoft Graph 覆盖上传到 SharePoint 的文件
- typescript - 如何在 Angular 6 中模拟 e2e 测试
- android - 如何在您的应用关闭且没有 Firebase 时推送通知?
- bash - linux bash脚本:使用嵌套的For Do循环处理文件夹内容迭代的文件
- linux - 查看手册页时,如何查看加载它的目录?(例如,用于本地份额与系统份额的确定)?
- macos - NSTableView 与核心动画层