将 Python 列表导出到 Excel
Posted
技术标签:
【中文标题】将 Python 列表导出到 Excel【英文标题】:Export a Python List to Excel 【发布时间】:2012-07-30 19:07:36 【问题描述】:我正在尝试通过我在标题处导入的 Win32COM 客户端将列表导出到 excel。 我创建的对象编码如下,但我似乎无法让它将每个值导出到电子表格中自己的行。如果我能得到一个好的指针(除了放弃 python !!:D),我将不胜感激。
class XcelExport():
def excel(self):
app = 'Excel'
xl = win32.gencache.EnsureDispatch('%s.Application' % app)
ss = xl.Workbooks.Open(r'C:\MyFile.xls')
sh = ss.ActiveSheet
xl.Visible = True
sleep(.1)
sh.Cells(1,1).Value = 'Export-to-%s : Items' % app
sleep(.1)
for i in EventTableRFT:
sh.Range("A").Value = i
sh.Cells(i+2,1).Value = "End of the List!"
xprt = XcelExport()
xprt.excel()
【问题讨论】:
有什么理由使用 Win32COM 而不是 xlwt?for i,e in enumerate(datalist): sheet.write(i,1,e)
会做你想做的事,当然,在你打开书和纸之后。
为什么不把它写成 csv 并使用 excel 自己的导入工具?
@Logan 谢谢伙计。效果很好,我会根据需要研究 xlwt/xlrd 功能。
【参考方案1】:
由于您似乎喜欢我的回答/评论,所以这里有一个正确的答案:
Python Excel 拥有您所需要的一切。如果您想要更集成但似乎有限的东西,可以使用IronSpread。 XLRD 和 XLWT 是很棒的软件包,但它们不支持 *.xlsx 文件。 IronSpread 仅适用于 Windows,并且仅支持 '07 和 '10 版本的 Excel。每个都有它的警告。最后,您可以同时使用两者(编辑为 *.xlsx,然后另存为 *.xls(我有人遇到过大 *.xls 文件的速度问题,但我的脚本在 1分钟。))。
哦,我肯定会阅读(略读)有关有趣功能的文档,例如获取 xlrd/xlwt 的单元格类型等。这是值得的,如果只是因为它很短,并且可以节省您进行实验的学习曲线。
xlwt 的超短示例:
import xlwt
from tempfile import TemporaryFile
book = xlwt.Workbook()
sheet1 = book.add_sheet('sheet1')
supersecretdata = [34,123,4,1234,12,34,12,41,234,123,4,123,1,45123,5,43,61,3,56]
for i,e in enumerate(supersecretdata):
sheet1.write(i,1,e)
name = "random.xls"
book.save(name)
book.save(TemporaryFile())
xlrd 的超短示例:
import xlrd
from xlrd import open_workbook
book = open_workbook('random.xls')
sheet1 = book.sheet_by_index(0)
data = []
for i in xrange(sheet1.nrows):
data.append(sheet1.cell(i,1).value)
【讨论】:
IronSpread 的惊喜。那是令人印象深刻的。将用户留在 Excel 环境中真是太好了,因此不会流鼻血看着编码。 +1000 先生,感谢您的回答。 一个警告,我只是注意到 Office 64 位版本存在一些轻微的兼容性问题,在退出 Excel 时会引发一些错误,但似乎可以工作。希望 64 位版本即将推出。 哪个有兼容性问题? 看来 Ironspread 并不完全喜欢 Excel 64bit。在 excel 打开时,一个对话框显示“加载 xll 失败”我禁用了所有其他插件和 COM 插件,但就像我说的,它在我关闭对话框后完美运行。 好吧,给他们时间。这是一个新产品。【参考方案2】:您缺少 Range 中的单元格行号,并且需要在每次循环迭代后递增单元格行。
sh.Range("A1").Offset(0,x).Value = i
此更改应该有效。
class XcelExport():
def excel(self):
app = 'Excel'
xl = win32.gencache.EnsureDispatch('%s.Application' % app)
ss = xl.Workbooks.Open(r'C:\MyFile.xls')
sh = ss.ActiveSheet
xl.Visible = True
sleep(.1)
sh.Cells(1,1).Value = 'Export-to-%s : Items' % app
sleep(.1)
x=0
for i in EventTableRFT:
sh.Range("A1").Offset(0,x).Value = i #You need to increment the cell row
x+=1
sh.Cells(i+2,1).Value = "End of the List!"
xprt = XcelExport()
xprt.excel()
【讨论】:
谢谢,您的意思是将x++
写成x+1
。我运行时出现的错误:` File "C:\MyFile.py", line 195, in excel sh.Range("A1").Offset(0,Rowx).Value = i #你需要增加单元格行文件“C:\Python27\lib\site-packages\win32com\gen_py\00020813-0000-0000-C000-000000000046x0x1x7\Range.py”,第 686 行,在 call 中,ColumnIndex) 文件“ C:\Python27\lib\site-packages\win32com\client_init_.py",第 459 行,在 ApplyTypes self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),` <:>
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)` Win 和 Office 64bit 影响 COM 连接? (我知道我最近使用 ActiveX 的另一个软件遇到了这个问题)
我已更新我的帖子以解决您在第一条评论中解决的问题。【参考方案3】:
class Signal(object):
def __init__(self, x, y):
self.x = x
self.y = y
def to_dict(self):
return
'x': self.x,
'y': self.y,
def file_save_excel(dataset, filename, sheet_name, new_sheet):
dataset = dataset.applymap(lambda x: x.encode('unicode_escape').
decode('utf-8') if isinstance(x, str) else x)
print('Writing the processed dataset to excel file...')
writer = pd.ExcelWriter(filename, engine='openpyxl')
if os.path.exists(filename) and new_sheet:
book = openpyxl.load_workbook(filename)
writer.book = book
dataset.to_excel(writer, sheet_name=sheet_name, index=False)
writer.save()
writer.close()
return True
dataframe = pandas.DataFrame.from_records([s.to_dict() for s in signals])
file_save_excel(dataframe, 'FileName.xlsx', 'SheetName', True)
【讨论】:
以上是关于将 Python 列表导出到 Excel的主要内容,如果未能解决你的问题,请参考以下文章
将 Access 2003 列表框行源(查询)导出到 Excel 2003 的最有效方法