如何使用 Python 编写 Excel 电子表格?

我需要写一些数据从我的程序到一个 Excel 电子表格。我在网上搜索过,似乎有很多软件包可用(xlwt,XlsXcsive,openpyxl)。其他人建议写信给。CSV 文件(从未使用过 CSV,也不知道它是什么)。

程序很简单。我有两个列表(float)和三个变量(字符串)。我不知道这两个列表的长度,它们可能不会是相同的长度。

我希望布局如下图所示:

Layout sample

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

那么最好的方法是什么呢?

我正在运行 Windows7,但我不一定要在运行此程序的计算机上安装 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个数字。

708121 次浏览

CSV 代表逗号分隔的值。CSV 类似于文本文件,只需添加 。 CSV 扩展即可创建

例如,编写以下代码:

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

你可以用 excel 打开这个文件。

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

熊猫使用 DataFrame.to _ excel。熊猫允许您在功能丰富的数据结构中表示您的数据,并且还允许您使用 读进去 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

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

  • Xlrd/xlwt (标准) : Python 的标准库中没有这个功能,但我认为 Xlrd/xlwt是读写 Excel 文件的“标准”方式。制作工作簿、添加工作表、编写数据/公式和格式化单元格都相当容易。如果您需要所有这些东西,那么使用这个库可能是最成功的。我想你可以选择 openpyxl,它会非常相似,但我没有使用它。

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

  • Tablib (强大,直观) : Tablib是一个更强大但更直观的表格数据库。它可以使用多种工作表以及其他格式(如 csv、 json 和 yaml)编写 Excel 工作簿。如果您不需要格式化的单元格(比如背景色) ,那么使用这个库会对您有所帮助,从长远来看,它会让您走得更远。

  • Csv (easy) : 计算机上的文件为 短信二进制。文本文件只是字符,包括新行和标签等特殊字符,可以在任何地方轻松打开(例如记事本、网页浏览器或 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)

你也可以试着看看下面的图书馆:

Xlwing -用于从 Python 获取数据进出电子表格,以及操作工作簿和图表

ExcelPython -用于在 Python 而不是 VBA 中编写用户定义函数(UDF)和宏的 Excel 外接程序

我调查了几个用于 Python 的 Excel 模块,发现 Openpyxl是最好的。

免费图书自动与 Python有一章是关于 openpyxl 的枯燥的东西与更多细节或您可以检查的 看看文件网站。使用 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')

导入精确数字的最简单方法是在 l1l2中的数字后面加一个小数。Python 将这个小数点解释为包含确切数字的指令。如果需要将其限制在小数点后的某个位置,应该能够创建一个 print 命令来限制输出,比如:

print variable_example[:13]

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

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

OpenPyxl是一个相当不错的库,用于读/写 Excel2010 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

您可以尝试基于 XlsxWriterHfexcel人类友好的面向对象的 python 库:

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

如果您需要修改现有的工作簿,最安全的方法是使用 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()

xlsxwriter库非常适合创建 .xlsx文件。下面的代码片段在声明 秩序显示的名字的同时,从一系列的 dicts 中生成一个 .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 提出。相反,我提出了一个更通用的解决方案,恕我直言,大多数游客寻求。这个问题的标题在搜索引擎中有很好的索引,并且跟踪了大量的流量

enter image description here

注意2-如果您使用 Python 3.6或更新的 没有,请考虑在 headers中使用 OrderedDict。在 Python 3.6之前,dict中的顺序是不保留的。