如何将Python中的数据保存到Excel展现出来?我们可以使用XlsxWriter模块来实现。
首先是使用pip来直接安装:(Centos系统)
pip install XlsxWriter
我们做个实验来验证是否安装成功:
import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write('A1', 'Hello world')
workbook.close()
将文件保存为hello.py并且运行:
python hello.py
运行成功后将输出文件hello.xlsx,文件应该和下图类似:
Paste_Image.png
官网教程一:创建一个简单的XLSX文件
假设我们有一些月度支出的数据,我们希望将其转换为Excel XLSX文件:
expenses = (
['Rent', 1000],
['Gas', 100],
['Food', 300],
['Gym', 50],
)
为了做到这一点,我们写个小程序吧:
import xlsxwriter
#创建一个工作簿并添加一张工作表,当然工作表是可以命名的
workbook = xlsxwriter.Workbook('Expenses01.xlsx')
worksheet = workbook.add_worksheet()
# 下面是我们要插入的数据
expenses = (
['Rent', 1000],
['Gas', 100],
['Food', 300],
['Gym', 50],
)
# 从第一个单元格开始,行和列的索引均为0
row = 0
col = 0
# 迭代数据并逐行写入
for item, cost in (expenses):
worksheet.write(row, col, item)
worksheet.write(row, col + 1, cost)
row += 1
# 写一个公式,计算出总和
worksheet.write(row, 0, 'Total')
worksheet.write(row, 1, '=SUM(B1:B4)')
workbook.close()
这是一个简单的例子,但涉及的步骤代表使用XlsxWriter的所有程序:
我们使用Workbook()来创建工作簿,里面必须有一个参数即我们要创建的工作簿的名字:
workbook = xlsxwriter.Workbook('Expenses01.xlsx')
注意:XlsxWriter只能创建文件,不能读取或修改现有的文件。
然后使用工作簿对象通过该add_worksheet()方法添加新工作表 :
worksheet = workbook.add_worksheet()
默认情况下,电子表格中的工作表名称将是Sheet1,Sheet2等,但我们也可以指定名称:
worksheet1 = workbook.add_worksheet() # Defaults to Sheet1.
worksheet2 = workbook.add_worksheet('Data') # Data.
worksheet3 = workbook.add_worksheet() # Defaults to Sheet3.
然后我们可以使用工作表对象通过write() 方法写入数据:
worksheet.write(row, col, some_data)
在XlsxWriter中,行和列都是零索引。工作表中的第一个单元格A1是(0, 0)。
在栗子中我们通过迭代将数据写入表中:
# Iterate over the data and write it out row by row.
for item, cost in (expenses):
worksheet.write(row, col, item)
worksheet.write(row, col + 1, cost)
row += 1
我们添加一个公式来计算第二列中的项目总和:
worksheet.write(row, 1, '=SUM(B1:B4)')
最后,我们通过close()方法关闭Excel文件:
workbook.close()
现在,我们现在有一个文件,可以通过Excel和其他电子表格应用程序读取。
教程2:向XLSX文件添加格式
在上一节中,我们使用Python和XlsxWriter模块创建了一个简单的电子表格。
这将所需的数据转换为Excel文件,但它看起来有点裸。为了使信息更清晰,我们想添加一些简单的格式,如下所示:
Paste_Image.png
这里的区别是,我们已经以粗体字体添加了项目和成本列标题,我们已在第二列中设置了货币格式,并且我们将总字符串加粗。
为此,我们可以扩展我们的程序如下:
import xlsxwriter
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook('Expenses02.xlsx')
worksheet = workbook.add_worksheet()
# 添加用于突出显示单元格的粗体格式。
bold = workbook.add_format({'bold': True})
# 为显式钱的单元格添加数字格式。
money = workbook.add_format({'num_format': '$#,##0'})
# Write some data headers.
worksheet.write('A1', 'Item', bold)
worksheet.write('B1', 'Cost', bold)
# Some data we want to write to the worksheet.
expenses = (
['Rent', 1000],
['Gas', 100],
['Food', 300],
['Gym', 50],
)
# Start from the first cell below the headers.
row = 1
col = 0
# Iterate over the data and write it out row by row.
for item, cost in (expenses):
worksheet.write(row, col, item)
worksheet.write(row, col + 1, cost, money)
row += 1
# Write a total using a formula.
worksheet.write(row, 0, 'Total', bold)
worksheet.write(row, 1, '=SUM(B2:B5)', money)
workbook.close()
这个和以前的程序的主要区别是,我们添加了两个Format对象,我们可以使用它们来格式化电子表格中的单元格。
格式对象表示可应用于Excel中单元格的所有格式属性,例如字体,数字格式,颜色和边框。这在“格式类”部分中有更详细的解释。
现在我们将避免进入细节,只使用有限的格式功能添加一些简单的格式:
# 添加用于突出显示单元格的粗体格式。
bold = workbook.add_format({'bold': True})
# 为显式钱的单元格添加数字格式。
money = workbook.add_format({'num_format': '$#,##0'})
然后我们将这些格式作为可选的第三个参数传递到worksheet.write()方法来格式化单元格中的数据:
write(row, column, token, [format])
例如这样:
worksheet.write(row, 0, 'Total', bold)
教程3:将不同类型的数据写入XLSX文件
在上一节中,我们创建了一个使用Python和XlsxWriter模块格式化的简单电子表格。
这次让我们扩展我们要写的数据,以包括一些日期:
expenses = (
[ 'Rent' , '2017-01-13' , 1000 ],
[ 'Gas' , '2017-01-14' , 100 ],
[ 'Food' , '2017-01-16' , 300 ] ,
[ 'Gym' , '2017-01-20' , 50 ],
)
相应的电子表格将如下所示:
Paste_Image.png
这里的区别是,我们添加了一个带有格式的日期列,并使该列稍宽以适应日期。
为此,我们可以扩展我们的程序如下:
from datetime import datetime
import xlsxwriter
# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook('Expenses03.xlsx')
worksheet = workbook.add_worksheet()
# Add a bold format to use to highlight cells.
bold = workbook.add_format({'bold': 1})
# Add a number format for cells with money.
money_format = workbook.add_format({'num_format': '$#,##0'})
# 添加Excel日期格式。
date_format = workbook.add_format({'num_format': 'mmmm d yyyy'})
# 调整列宽。
worksheet.set_column(1, 1, 15)
# Write some data headers.
worksheet.write('A1', 'Item', bold)
worksheet.write('B1', 'Date', bold)
worksheet.write('C1', 'Cost', bold)
# Some data we want to write to the worksheet.
expenses = (
['Rent', '2017-01-13', 1000],
['Gas', '2017-01-14', 100],
['Food', '2017-01-16', 300],
['Gym', '2017-01-20', 50],
)
# Start from the first cell below the headers.
row = 1
col = 0
for item, date_str, cost in (expenses):
# Convert the date string into a datetime object.
date = datetime.strptime(date_str, "%Y-%m-%d")
worksheet.write_string (row, col, item )
worksheet.write_datetime(row, col + 1, date, date_format )
worksheet.write_number (row, col + 2, cost, money_format)
row += 1
# Write a total using a formula.
worksheet.write(row, 0, 'Total', bold)
worksheet.write(row, 2, '=SUM(C2:C5)', money_format)
workbook.close()
这个和以前的程序的主要区别是我们为日期添加了一个新的Format对象,我们对数据类型有额外的处理。
Excel不同地处理不同类型的输入数据,例如字符串和数字,虽然它通常对用户透明。XlsxWriter试图在工作表中模拟这 一点。write()方法通过将Python数据类型映射到Excel支持的类型。
该write()方法作为几个更具体方法的通用别名:
write_string()
write_number()
write_blank()
write_formula()
write_datetime()
write_boolean()
write_url()
In this version of our program we have used some of these explicit write_ methods for different types of data:
worksheet.write_string (row, col, item )
worksheet.write_datetime(row, col + 1, date, date_format )
worksheet.write_number (row, col + 2, cost, money_format)
This is mainly to show that if you need more control over the type of data you write to a worksheet you can use the appropriate method. In this simplified example the write() method would actually have worked just as well.
The handling of dates is also new to our program.
Excel中的日期和时间是应用了数字格式的浮点数,以便以正确的格式显示它们。如果日期和时间是Python datetime对象,XlsxWriter会自动进行所需的数字转换。但是,我们还需要添加数字格式以确保Excel将其显示为日期:
from datetime import datetime
...
date_format = workbook.add_format({'num_format': 'mmmm d yyyy'})
...
for item, date_str, cost in (expenses):
# Convert the date string into a datetime object.
date = datetime.strptime(date_str, "%Y-%m-%d")
...
worksheet.write_datetime(row, col + 1, date, date_format )
...
The last addition to our program is the set_column() method to adjust the width of column ‘B’ so that the dates are more clearly visible:
# Adjust the column width.
worksheet.set_column('B:B', 15)