写入Excel电子表格


149

我是Python的新手。我需要将程序中的一些数据写入电子表格。我在网上搜索过,似乎有很多可用的软件包(xlwt,XlsXcessive,openpyxl)。其他人则建议写入.csv文件(从不使用CSV,也不真正了解它是什么)。

该程序非常简单。我有两个列表(浮点数)和三个变量(字符串)。我不知道两个列表的长度,它们的长度可能不一样。

我希望布局如下图所示:

布局样本

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

那么最好的方法是什么?

PS我正在运行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文件。使用tsv的主要优点是,您可以确信基本上任何电子表格程序的任何版本都可以打开它,而不仅仅是Office 2010的excel
goncalopp 2012年

在python中使用字符串格式来控制数字数据的显示。
弗雷德·米切尔

检查openpyxl以使用.xlsx文件
圣地亚哥

Answers:


95
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


13
您可能要提到的是,如果您在Windows上运行Python并且在同一台计算机上安装了Excel,则可以使用Python COM界面直接控制Excel。
Michael Dillon 2012年

1
该链接非常有帮助。谢谢
Jey 2012年

3
请注意,使用此代码,最大行数限制为65536行,因为.xls文件仅支持那么多行
Shreyas Pimpalgaonkar,

1
需要明确的xlwt是,仅用于写入.xlsExcel 2003或更早版本的旧文件。这可能已过时(取决于您的需求)。
Cowlinator

您可以检查openpyxl以使用.xlsx文件
圣地亚哥

139

使用DataFrame.to_excel大熊猫。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文件看起来像这样:

在此处输入图片说明

请注意,两个列表的长度必须相等,否则熊猫会抱怨。要解决此问题,请将所有缺失的值替换为None


谢谢,但对于我的需求来说似乎太复杂了。
杰伊,2012年

不错,但有点过分+1
Burhan Khalid 2012年

2
可以肯定的是,pandas将xlrd / xlwt库用于其excel功能pandas.pydata.org/pandas-docs/stable/io.html#excel-files
mrmagooey 2013年

6
我以为它也用过xlwt,但出现openpyxl错误。对于任何对此感到困惑的人-都在您想要的文件类型中。大熊猫(0.12)文档说:“具有.xls扩展名的文件将使用xlwt编写,具有.xlsx扩展名的文件将使用openpyxl编写”。
赛车Ta

5
不知道为什么人们会说这太过分了。就我而言,这正是我想要的。谢谢!
安倍

35
  • xlrd / xlwt(标准):Python在其标准库中没有此功能,但我认为xlrd / xlwt是读取和写入excel文件的“标准”方式。制作工作簿,添加工作表,编写数据/公式以及格式化单元格非常容易。如果您需要所有这些东西,那么使用此库可能会获得最大的成功。我认为您可以选择openpyxl代替,它会非常相似,但是我没有使用过。

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

  • Tablib(功能强大,直观):Tablib是用于处理表格数据的功能更强大但更直观的库。它可以编写具有多个工作表以及其他格式(例如csv,json和yaml)的excel工作簿。如果不需要格式化的单元格(例如背景色),则可以使用该库,这将使您从长远角度上受益匪浅。

  • csv(简单):计算机上的文件是文本二进制文件。文本文件只是字符,包括特殊字符(例如换行符和选项卡),并且可以在任何地方轻松打开(例如记事本,Web浏览器或Office产品)。csv文件是一种以某种方式设置格式的文本文件:每一行都是一个值列表,以逗号分隔。Python程序可以轻松读取和写入文本,因此,csv文件是将数据从python程序导出到excel(或其他python程序)的最简单,最快的方法。

    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文件,则可能要使用标准库中包含的csv模块
Flimm

1
并不是特别重要,但是Tablib与许多其他更高级别的软件包一样,使用xlwt输出Excel文件。
约翰Y

13

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

免费书籍《用Python自动化无聊的东西》中有关于openpyxl的一章,其中有更多详细信息,或者您可以查看Read Docs网站。您无需安装Office或Excel即可使用openpyxl。

您的程序如下所示:

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

11

CSV代表逗号分隔的值。CSV就像一个文本文件,可以简单地通过添加.CSV扩展名来创建

例如,编写以下代码:

f = open('example.csv','w')
f.write("display,variable x")
f.close()

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


5
您不能使用CSV格式化列背景。它只是用于导入和导出的数据格式。
Michael Dillon 2012年

5
如果要执行此操作,则可能要使用标准库中包含的csv模块。例如,它可以更好地处理报价。
Flimm

@Flimm我如何简单地写到不同的单元格?
oldboy

如果您使用的是Python 3,并且文件包含非ASCII字符(如é或),则最好f.write('\xEF\xBB\xBF')在后面紧跟open()。这就是Microsoft软件识别UTF-8编码所需的BOM(字节顺序标记,qv)
Walter Tross

10
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()

7

也尝试看看以下库:

xlwings-用于将数据从Python进出电子表格以及处理工作簿和图表

ExcelPython-一个Excel加载项,用于用Python代替VBA编写用户定义的函数(UDF)和宏


2

OpenPyxl 是一个很好的库,用于读取/写入Excel 2010 xlsx / xlsm文件:

https://openpyxl.readthedocs.io/en/stable

另一个参考答案是使用折旧函数(get_sheet_by_name)。如果没有它,这是怎么做的:

import openpyxl

wbkName = 'New.xlsx'        #The file should be created before running the code.
wbk = openpyxl.load_workbook(wbkName)
wks = wbk['test1']
someValue = 1337
wks.cell(row=10, column=1).value = someValue
wbk.save(wbkName)
wbk.close

1
上面的代码产生错误FileNotFoundError: [Errno 2] No such file or directory: 'New.xlsx'
Atinesh

@Atinesh-谢谢您的反馈- openpyxl.load_workbook加载一个已经存在的工作簿。创建一个文件New.xlsx以避免此错误。
Vityata '18

1
好,谢谢您的建议
Atinesh

请注意,openpyxl不支持旧的“ xls”格式。
蒂莫西·奎因

2

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)

在此处输入图片说明


💡注1-我故意不回答OP提出的确切情况。取而代之的是,我提出了一种大多数访客都希望使用的更为通用的解决方案。这个问题的标题在搜索引擎中有很好的索引,并跟踪大量流量

在此处输入图片说明

💡注2-如果您使用Python3.6或更高版本,请考虑OrderedDict在中使用headers。在Python3.6之前,dict未保留顺序。



0

导入精确数字的最简单方法是在l1和中的数字后面添加小数l2。Python将此小数点解释为您的指示,以包括确切的数字。如果需要将其限制在小数点后一位,则应该能够创建一个限制输出的打印命令,类似于以下内容:

print variable_example[:13]

假设您的数据在小数点后还有两个整数,则将其限制在小数点后十位。


0

您可以尝试hfexcel基于对人友好的面向对象的Python库XlsxWriter

from hfexcel import HFExcel

hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)

hf_workbook.add_style(
    "headline", 
    {
       "bold": 1,
        "font_size": 14,
        "font": "Arial",
        "align": "center"
    }
)

sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")

column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')

column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')


column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')

# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')

hf_workbook.save()

0

如果您需要修改现有工作簿,则最安全的方法是使用pyoo。您需要安装一些库,并且要花一些时间才能完成,但是一旦安装完成,这将是防弹的,因为您可以利用LibreOffice / OpenOffice的广泛而可靠的API。

请参阅我的要点,了解如何设置linux系统以及如何使用pyoo进行一些基本编码。

这是代码示例:

#!/usr/local/bin/python3
import pyoo
# Connect to LibreOffice using a named pipe 
# (named in the soffice process startup)
desktop = pyoo.Desktop(pipe='oo_pyuno')
wkbk = desktop.open_spreadsheet("<xls_file_name>")
sheet = wkbk.sheets['Sheet1']
# Write value 'foo' to cell E5 on Sheet1
sheet[4,4].value='foo'
wkbk.save()
wkbk.close()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.