如何使用Python向Excel电子表格中写入内容?

197

我需要将程序中的一些数据写入Excel电子表格。我在网上搜索到有许多可用的软件包(如xlwt、XlsXcessive、openpyxl)。其他人建议将数据写入.csv文件(我从未使用过CSV,也不太理解它是什么)。

这个程序非常简单。我有两个列表(float类型)和三个变量(字符串类型)。我不知道这两个列表的长度,并且它们可能长度不同。

我希望布局如下图所示:

Layout sample

粉色列将具有第一个列表的值,绿色列将具有第二个列表的值。

那么最好的方法是什么?

我正在运行Windows 7,但并不一定在运行该程序的计算机上安装Office。

import xlwt

x=1
y=2
z=3

list1=[2.34,4.346,4.234]

book = xlwt.Workbook(encoding="utf-8")

sheet1 = book.add_sheet("Sheet 1")

sheet1.write(0, 0, "Display")
sheet1.write(1, 0, "Dominance")
sheet1.write(2, 0, "Test")

sheet1.write(0, 1, x)
sheet1.write(1, 1, y)
sheet1.write(2, 1, z)

sheet1.write(4, 0, "Stimulus Time")
sheet1.write(4, 1, "Reaction Time")

i=4

for n in list1:
    i = i+1
    sheet1.write(i, 0, n)

book.save("trial.xls")

我使用了你提供的所有建议来写这篇文章。它能够完成任务,但还有一些可以稍微改进的地方。

在for循环中创建的单元格(list1 值)如何以科学计数法或数字格式进行格式化?

我不想截断这些值。程序中使用的实际值应该有小数点后约10位数字。


如果您在记事本/写字板等文本编辑器中打开一个tsv文件,您将了解它是什么。使用tsv的主要优势在于,您可以确信基本上任何版本的任何电子表格程序都可以打开它,而不仅仅是office2010的excel。 - loopbackbee
使用Python中的字符串格式控制数值数据的显示。 - Fred Mitchell
请查看openpyxl以处理.xlsx文件。 - Santiago
12个回答

172
使用DataFrame.to_excel函数从pandas中进行操作。Pandas允许您使用功能丰富的数据结构来表示您的数据,并且可以让您读取Excel文件。
您需要先将数据转换为DataFrame格式,然后像下面这样将其保存到Excel文件中:
In [1]: from pandas import DataFrame
In [2]: l1 = [1,2,3,4]
In [3]: l2 = [1,2,3,4]
In [3]: df = DataFrame({'Stimulus Time': l1, 'Reaction Time': l2})
In [4]: df
Out[4]: 
   Reaction Time  Stimulus Time
0              1              1
1              2              2
2              3              3
3              4              4

In [5]: df.to_excel('test.xlsx', sheet_name='sheet1', index=False)

而生成的Excel文件如下所示:

enter image description here

请注意,两个列表的长度必须相等,否则 pandas 会报错。为了解决这个问题,请将所有缺失的值替换为 None

2
我相信pandas在其excel功能方面使用了xlrd / xlwt库。http://pandas.pydata.org/pandas-docs/stable/io.html#excel-files - mrmagooey
11
我原以为它也使用 xlwt,但出现了 openpyxl 错误。对于其他有疑惑的人来说,问题在于你需要的文件类型。Pandas(0.12)文档指出,“扩展名为 .xls 的文件将使用 xlwt 写入,扩展名为 .xlsx 的文件将使用 openpyxl 写入”。 - Racing Tadpole
6
不确定为什么有人说这太过了。对于我的需求来说,这正是我所需要的。谢谢! - Abe

108
import xlwt

def output(filename, sheet, list1, list2, x, y, z):
    book = xlwt.Workbook()
    sh = book.add_sheet(sheet)

    variables = [x, y, z]
    x_desc = 'Display'
    y_desc = 'Dominance'
    z_desc = 'Test'
    desc = [x_desc, y_desc, z_desc]

    col1_name = 'Stimulus Time'
    col2_name = 'Reaction Time'

    #You may need to group the variables together
    #for n, (v_desc, v) in enumerate(zip(desc, variables)):
    for n, v_desc, v in enumerate(zip(desc, variables)):
        sh.write(n, 0, v_desc)
        sh.write(n, 1, v)

    n+=1

    sh.write(n, 0, col1_name)
    sh.write(n, 1, col2_name)

    for m, e1 in enumerate(list1, n+1):
        sh.write(m, 0, e1)

    for m, e2 in enumerate(list2, n+1):
        sh.write(m, 1, e2)

    book.save(filename)

更多解释请参见:     https://github.com/python-excel


15
如果你在Windows上运行Python且已经安装了Excel,你可以使用Python COM接口直接控制Excel。你可能想提醒一下这一点。 - Michael Dillon
4
请注意,使用此代码的最大行限制为65536行,因为.xls文件只支持这么多行。 - Shreyas Pimpalgaonkar
6
要明确的是,xlwt 只用于编写旧的 .xls 文件,适用于 Excel 2003 或更早版本。这可能已经过时了(取决于您的需求)。 - cowlinator
你可以查看 openpyxl 来处理 .xlsx 文件。 - Santiago

41
  • xlrd/xlwt(标准库):Python没有这个功能的标准库,但我认为xlrd/xlwt是读写Excel文件的“标准”方式。它很容易创建工作簿、添加工作表、写入数据/公式并格式化单元格。如果您需要所有这些内容,则可能会在该库中取得最大成功。我认为您也可以选择openpyxl,它与xlrd/xlwt非常相似,但我没有使用过。

    要使用xlwt格式化单元格,请定义一个XFStyle,并在写入工作表时包括该样式。 这里有一个具有许多数字格式的示例。请参见下面的示例代码。

  • Tablib(强大而直观):Tablib 是用于处理表格数据的更强大而直观的库。它可以编写具有多个工作表以及其他格式(例如csv、json和yaml)的Excel工作簿。如果您不需要格式化单元格(如背景颜色),那么使用该库会使您受益匪浅,因为这将在长期内让您更进一步。

  • csv(简单):计算机上的文件可以是文本二进制。文本文件只是字符,包括特殊字符,如换行符和制表符,并且可以在任何地方轻松打开(例如记事本、Web浏览器或Office产品)。CSV文件是以特定方式格式化的文本文件:每行是由逗号分隔的值列表。Python程序可以轻松读写文本,因此将数据从Python程序导出到Excel(或另一个Python程序)的最简单和最快的方法是使用csv文件。

    Excel文件是二进制的,需要知道文件格式的特殊库,这就是为什么您需要为Python安装额外的库或使用Microsoft Excel、Gnumeric或LibreOffice等特殊程序来读/写它们。


import xlwt

style = xlwt.XFStyle()
style.num_format_str = '0.00E+00'

...

for i,n in enumerate(list1):
    sheet1.write(i, 0, n, fmt)

2
如果你要写一个CSV文件,那么你可能想使用Python标准库中包含的csv模块 - Flimm
1
虽然这并不特别重要,但是Tablib和许多其他高级包一样,使用xlwt来输出Excel文件。 - John Y

15

我调查了一些Python的Excel模块,发现openpyxl是最好的。

免费的书《Python 编程快速上手:让繁琐工作自动化》有一章关于openpyxl的详细介绍,或者你可以查看Read the Docs网站。使用openpyxl不需要安装Office或Excel。

您的程序大概是这个样子:

import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')

stimulusTimes = [1, 2, 3]
reactionTimes = [2.3, 5.1, 7.0]

for i in range(len(stimulusTimes)):
    sheet['A' + str(i + 6)].value = stimulusTimes[i]
    sheet['B' + str(i + 6)].value = reactionTimes[i]

wb.save('example.xlsx')

我收到一个错误,提示无法将int64转换为Excel。 - pnkjmndhl
我确实发现openpyxl是一个更优秀的软件包。 - jakebeal
sheet['A' + str(i + 6)].value = stimulusTimes[i] 看起来比 dataframe( [1,2,3])(以下是pandas示例)要难得多。 - john k

15
import xlsxwriter


# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)

# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': True})

# Write some simple text.
worksheet.write('A1', 'Hello')

# Text with formatting.
worksheet.write('A2', 'World', bold)

# Write some numbers, with row/column notation.
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# Insert an image.
worksheet.insert_image('B5', 'logo.png')

workbook.close()

12
CSV代表逗号分隔值。CSV类似于文本文件,只需添加.CSV扩展名即可创建。
例如,编写此代码:
f = open('example.csv','w')
f.write("display,variable x")
f.close()

您可以使用Excel打开此文件。


5
CSV文件不支持对列背景进行格式设置,它只是一种用于导入和导出数据的格式。 - Michael Dillon
5
如果你想要做这件事情,最好使用Python标准库中的 csv模块。相比之下,它可以更好地处理引用等问题。 - Flimm
@Flimm 我该如何简单地写入不同的单元格? - oldboy
如果你正在使用Python 3,而文件中包含像é这样的非ASCII字符,那么在open()之后最好执行一个f.write('\xEF\xBB\xBF')。这是BOM(字节顺序标记),Microsoft软件需要它来识别UTF-8编码。 - Walter Tross

7

请尝试查看以下库:

xlwings - 用于将数据从Python导入和导出到电子表格中,以及操作工作簿和图表

ExcelPython - 一款Excel插件,可用于在Python中编写用户定义函数(UDFs)和宏,而不是VBA。


7
“xlsxwriter”库非常适合创建“.xlsx”文件。以下代码片段可以从一个字典列表生成一个“.xlsx”文件,并指定顺序显示名称
from xlsxwriter import Workbook


def create_xlsx_file(file_path: str, headers: dict, items: list):
    with Workbook(file_path) as workbook:
        worksheet = workbook.add_worksheet()
        worksheet.write_row(row=0, col=0, data=headers.values())
        header_keys = list(headers.keys())
        for index, item in enumerate(items):
            row = map(lambda field_id: item.get(field_id, ''), header_keys)
            worksheet.write_row(row=index + 1, col=0, data=row)


headers = {
    'id': 'User Id',
    'name': 'Full Name',
    'rating': 'Rating',
}

items = [
    {'id': 1, 'name': "Ilir Meta", 'rating': 0.06},
    {'id': 2, 'name': "Abdelmadjid Tebboune", 'rating': 4.0},
    {'id': 3, 'name': "Alexander Lukashenko", 'rating': 3.1},
    {'id': 4, 'name': "Miguel Díaz-Canel", 'rating': 0.32}
]

create_xlsx_file("my-xlsx-file.xlsx", headers, items)

enter image description here


注意1 - 我故意没有回答OP提出的确切情况。相反,我提供了一个更通用的解决方案,我认为大多数访问者都在寻找这种解决方案。这个问题的标题在搜索引擎中得到了很好的索引,并且跟踪了大量的流量。

在此输入图像描述

注意2 - 如果您使用Python3.6或更新版本,请考虑在headers中使用OrderedDict。在Python3.6之前,dict中的顺序不会被保留。



我刚回到这篇帖子,感谢你提供了这个美妙的函数 _/\_。 - otaku

3

OpenPyxl 是一个非常好的库,用于读写 Excel xlsx/xlsm 文件。

另一个答案,提到它使用了已弃用的函数get_sheet_by_name()。这是不使用它的方法:

import openpyxl

# The 'New.xlsx' should be created before running the code.
# There must be a worksheet with the name "Sheet1" in it.

wbk_name = 'New.xlsx'        
wbk = openpyxl.load_workbook(wbk_name)
wks = wbk['Sheet1']
some_value = 1337
wks.cell(row=10, column=1).value = some_value
wbk.save(wbk_name)
wbk.close

some_value 变量写在 Excel 文件中: 输入图像描述


1
以上代码产生错误 FileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx' - Atinesh
@Atinesh - 感谢您的反馈 - openpyxl.load_workbook 加载一个已经存在的工作簿。为了避免这个错误,请创建一个名为 New.xlsx 的文件。 - Vityata
1
好的,谢谢您的建议。 - Atinesh
请注意,openpyxl不支持旧的“xls”格式。 - Timothy C. Quinn
@William Brochensque junior - 我喜欢看到我的答案被编辑和改进,但请注意Python变量的命名方式-https://softwareengineering.stackexchange.com/questions/308972/python-file-naming-convention - Vityata
显示剩余2条评论

0
导入精确数字的最简单方法是在您的l1l2中的数字后添加小数点。Python将解释此小数点为您包含精确数字的指令。如果您需要将其限制到某个小数位,您应该能够创建一个打印命令来限制输出,例如:
print variable_example[:13]

如果您的数据小数点左边有两个整数,那么可以将其限制在第十个小数位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接