Creating Excel files
with Python and
XlsxWriter
John McNamara
Emutex Ltd
whoami
John McNamara
Software developer at Emutex Ltd
http://www.emutex.com
http://github.com/jmcnamara
Why Excel
•
•
•
•
•

Bosses like it
Useful as a data source
More useful with formatting
Input/output source for Pandas
Can be misused: Excel as a database
Available Python modules
•

csv.py
Readers and writers in core libs

•

xlwt/xlrd
Mature, stable modules, mainly XLS support

•

openpyxl
Reads and writes XLSX files

•

xlsxwriter
New module from early 2013
Excel File Formats
Excel 2003 : xls

Excel 2007 : xlsx

xlwt

xlsxwriter

Write
Read

openpyxl

xlrd
XlsxWriter
•
•
•
•
•

Write Excel XLSX files only
Doesn’t read or re-write Excel files
Adds many new features
Uses core modules only
Python 2.5, 2.6, 2.7, 3.1, 3.2, 3.3, PyPy, Jython
Why another module
•
•

Why not?

•

XlsxWriter adds support for:

Other modules support some but not all
features
charts, autofilters, tables, data validation,
merged cells, rich text, conditional
formatting, defined names, images, cell
comments, sparklines, outlines
Getting Started
•

Install:
$ sudo pip install xlsxwriter

•

Clone or fork:
$ git clone git@github.com:jmcnamara/XlsxWriter.git
$ cd XlsxWriter
$ make test
$ sudo python setup.py install

•

Read:
https://xlsxwriter.readthedocs.org
Hello World.xlsx
Hello World.xlsx
import xlsxwriter
workbook = xlsxwriter.Workbook('hello_world.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'Hello world')
workbook.close()
Hello World.xlsx
import xlsxwriter
workbook = xlsxwriter.Workbook('hello_world.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'Hello world')
workbook.close()
Hello World.xlsx
import xlsxwriter
workbook = xlsxwriter.Workbook('hello_world.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'Hello world')
worksheet.write(2, 1, 'Hello world')
workbook.close()
Hello World.xlsx
import xlsxwriter
workbook = xlsxwriter.Workbook('hello_world.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'Hello world')
worksheet.write(2, 1, 'Hello world')
worksheet.write('C5', 'Hello world')
workbook.close()
Cell Formatting
Cell Formatting
import xlsxwriter
workbook = xlsxwriter.Workbook('formatting.xlsx')
worksheet = workbook.add_worksheet()
italic = workbook.add_format({'italic': True})
bold
= workbook.add_format({'bold':
True, 'font_color': '#9CB640'})
worksheet.write(0, 0, 'Hello')
workbook.close()
Cell Formatting
import xlsxwriter
workbook = xlsxwriter.Workbook('formatting.xlsx')
worksheet = workbook.add_worksheet()
italic = workbook.add_format({'italic': True})
bold
= workbook.add_format({'bold':
True, 'font_color': '#9CB640'})
worksheet.write(0, 0, 'Hello')
worksheet.write(1, 0, 'Hello', italic)
workbook.close()
Cell Formatting
import xlsxwriter
workbook = xlsxwriter.Workbook('formatting.xlsx')
worksheet = workbook.add_worksheet()
italic = workbook.add_format({'italic': True})
bold
= workbook.add_format({'bold':
True, 'font_color': '#9CB640'})
worksheet.write(0, 0, 'Hello')
worksheet.write(1, 0, 'Hello', italic)
worksheet.write(2, 0, 'Hello', bold)
workbook.close()
Cell Formatting
set_font_name()

set_text_wrap()

set_border_color()

set_font_size()

set_rotation()

set_bottom_color()

set_font_color()

set_indent()

set_top_color()

set_bold()

set_shrink()

set_left_color()

set_italic()

set_text_justlast()

set_right_color()

set_underline()

set_pattern()

set_font_strikeout()

set_bg_color()

set_font_script()

set_fg_color()

set_num_format()

set_border()

set_locked()

set_bottom()

set_hidden()

set_top()

set_align()

set_left()

set_center_across()

set_right()
Types
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0, 0, 'Hello world')
workbook.close()
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0, 0, 'Hello world')
workbook.close()
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0, 0, 'Hello world')
worksheet.write(1, 0, 'Это фраза на русском!')
workbook.close()
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0, 0, 'Hello world')
worksheet.write(1, 0, 'Это фраза на русском!')
worksheet.write(2, 0, 123)
workbook.close()
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0,
worksheet.write(1,
worksheet.write(2,
worksheet.write(3,
workbook.close()

0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0,
worksheet.write(1,
worksheet.write(2,
worksheet.write(3,
worksheet.write(4,
workbook.close()

0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0,
worksheet.write(1,
worksheet.write(2,
worksheet.write(3,
worksheet.write(4,
worksheet.write(5,
workbook.close()

0,
0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
'=PI()')
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0,
worksheet.write(1,
worksheet.write(2,
worksheet.write(3,
worksheet.write(4,
worksheet.write(5,
worksheet.write(6,
workbook.close()

0,
0,
0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
'=PI()')
'http://python.com')
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0,
worksheet.write(1,
worksheet.write(2,
worksheet.write(3,
worksheet.write(4,
worksheet.write(5,
worksheet.write(6,
worksheet.write(7,
workbook.close()

0,
0,
0,
0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
'=PI()')
'http://python.com')
True)
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write(0,
worksheet.write(1,
worksheet.write(2,
worksheet.write(3,
worksheet.write(4,
worksheet.write(5,
worksheet.write(6,
worksheet.write(7,
workbook.close()

0,
0,
0,
0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
'=PI()')
'http://python.com')
True)
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write
worksheet.write
worksheet.write
worksheet.write
worksheet.write
worksheet.write
worksheet.write
worksheet.write
workbook.close()

(0,
(1,
(2,
(3,
(4,
(5,
(6,
(7,

0,
0,
0,
0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
'=PI()')
'http://python.com')
True)
Types
from datetime import date
import xlsxwriter
workbook
= xlsxwriter.Workbook('types.xlsx')
worksheet
= workbook.add_worksheet()
date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write_string (0,
worksheet.write_string (1,
worksheet.write_number (2,
worksheet.write_number (3,
worksheet.write_datetime(4,
worksheet.write_formula (5,
worksheet.write_url
(6,
worksheet.write_boolean (7,
workbook.close()

0,
0,
0,
0,
0,
0,
0,
0,

'Hello world')
'Это фраза на русском!')
123)
123.456)
date(2013, 10, 13), date_format)
'=PI()')
'http://python.com')
True)
Formulas
Formulas
worksheet.write_formula('A1', '=1+2')
worksheet.write_formula('A2', '=A1')
worksheet.write_formula('A3', '{=SUM(B1:C1*B2:C2)}')
worksheet.write_formula('A4', '=VLOOKUP("Acme", A2:D6, 3, FALSE)')
Images
Images
import xlsxwriter
workbook = xlsxwriter.Workbook('image.xlsx')
worksheet = workbook.add_worksheet()
worksheet.insert_image(0, 0, 'logo.png')
workbook.close()
Conditional Formatting
Conditional Formatting
import xlsxwriter
wb = xlsxwriter.Workbook('conditional_format.xlsx')
ws = wb.add_worksheet()
high = wb.add_format({'bg_color': '#FFC7CE', 'font_color': '#9C0006'})
low = wb.add_format({'bg_color': '#C6EFCE', 'font_color': '#006100'})
data = [
[88,
[24,
[6,
[73,
[36,
]

25,
100,
57,
78,
54,

33,
20,
88,
1,
22,

23,
88,
28,
96,
66,

67,
29,
10,
26,
81,

13],
33],
26],
45],
90],

for row, row_data in enumerate(data):
ws.write_row(row, 0, row_data)
ws.conditional_format('A1:F5', {'type':
'criteria':
'value':
'format':

'cell',
'>=',
50,
high})

ws.conditional_format('A1:F5', {'type':
'criteria':
'value':
'format':

'cell',
'<',
50,
low})

wb.close()
Charts
Charts
Area
stacked
percent_stacked
Bar
stacked
percent_stacked

Pie
Radar
with_markers
filled

Column
stacked
percent_stacked

Scatter
straight_with_markers
straight
smooth_with_markers
smooth

Line

Stock
Charts
import xlsxwriter
workbook = xlsxwriter.Workbook('chart.xlsx')
worksheet = workbook.add_worksheet()
# Add the worksheet data to be plotted.
data = [10, 40, 50, 20, 10, 50]
worksheet.write_column('A1', data)
# Create a new chart object.
chart = workbook.add_chart({'type': 'area'})
# Add a series to the chart.
chart.add_series({'values': '=Sheet1!$A$1:$A$6'})
# Insert the chart into the worksheet.
worksheet.insert_chart('C1', chart)
workbook.close()
Charts
chart = workbook.add_chart({'type': 'area'})
Charts
chart = workbook.add_chart({'type': 'bar'})
Charts
chart = workbook.add_chart({'type': 'column'})
Charts
chart = workbook.add_chart({'type': 'line'})
Charts
chart = workbook.add_chart({'type': 'pie'})
Charts
chart = workbook.add_chart({'type': 'radar'})
Charts
•

Configurability
Charts
Stacked chart with captions
Charts
Change chart styles
Charts
Add trendlines to charts
Charts
Format data points
Charts
Secondary axes
Autofilters
Autofilters
import xlsxwriter
workbook = xlsxwriter.Workbook('autofilter.xlsx')
worksheet = workbook.add_worksheet()
# Add a format for the headers.
header_format = workbook.add_format({'bold': 1, 'bg_color': '#C6EFCE'})
# Populate the worksheet data.
# See the xlsxwriter docs for a full example.
...
# Make the columns wider.
worksheet.set_column('A:D', 12)
# Format the header row.
worksheet.set_row(0, 20, header_format)
# Set the autofilter.
worksheet.autofilter('A1:D51')
workbook.close()
Tables
Tables
•
•
•

Group a range of cells into a single entity
Apply a uniform formatting across the cells
Refer to the table in formulas
worksheet.add_table('B3:F7', {options})
Data Validation
Data Validation
•
•
•

Restrict data entry to certain ranges
Raise errors/warning within Excel
Allow selection from drop down lists

data_validation(
'B25',
{'validate': 'integer',
'criteria': 'between',
'minimum': 1,
'maximum': 10})
Cell Comments
Cell Comments
•

Add comments to cells
worksheet.write('A1', 'Hello')
worksheet.write_comment('A1', 'This is a comment')
Sparklines
Sparklines
•
•

Mini charts within cells to show trends
Invented by Edward Tufte
Code All the Things!
•

Lots of features
Code All the Things!
•
•
•
•

Lots of features
Useful when you need them
Ignore them when you don’t
Plenty of examples and documentation to
get you started
How does it work
How does it work
•

20% of a studio audience guessed Witchcraft
How does it work
•
•
•
•

20% of a studio audience guessed Witchcraft
Actually a collection of XML files in a Zip file
Can be unzipped using standard utilities
Even modified in-place (if you are desperate)
How does it work
$ unzip -o -d hello_world hello_world.xlsx
Archive:

hello_world.xlsx

inflating: hello_world/[Content_Types].xml
inflating: hello_world/_rels/.rels
inflating: hello_world/docProps/app.xml
inflating: hello_world/docProps/core.xml
inflating: hello_world/xl/sharedStrings.xml
inflating: hello_world/xl/styles.xml
inflating: hello_world/xl/workbook.xml
inflating: hello_world/xl/_rels/workbook.xml.rels
inflating: hello_world/xl/theme/theme1.xml
inflating: hello_world/xl/worksheets/sheet1.xml
How does it work
$ unzip -o -d hello_world hello_world.xlsx
Archive:

hello_world.xlsx

inflating: hello_world/[Content_Types].xml
inflating: hello_world/_rels/.rels
inflating: hello_world/docProps/app.xml
inflating: hello_world/docProps/core.xml
inflating: hello_world/xl/sharedStrings.xml
inflating: hello_world/xl/styles.xml
inflating: hello_world/xl/workbook.xml
inflating: hello_world/xl/_rels/workbook.xml.rels
inflating: hello_world/xl/theme/theme1.xml
inflating: hello_world/xl/worksheets/sheet1.xml
How does it work
$ unzip -o -d hello_world hello_world.xlsx
Archive:

hello_world.xlsx

inflating: hello_world/[Content_Types].xml
inflating: hello_world/_rels/.rels
inflating: hello_world/docProps/app.xml
inflating: hello_world/docProps/core.xml
inflating: hello_world/xl/sharedStrings.xml
inflating: hello_world/xl/styles.xml
inflating: hello_world/xl/workbook.xml
inflating: hello_world/xl/_rels/workbook.xml.rels
inflating: hello_world/xl/theme/theme1.xml
inflating: hello_world/xl/worksheets/sheet1.xml
How does it work
$ unzip -o -d hello_world hello_world.xlsx
Archive:

hello_world.xlsx

inflating: hello_world/[Content_Types].xml
inflating: hello_world/_rels/.rels
inflating: hello_world/docProps/app.xml
inflating: hello_world/docProps/core.xml
inflating: hello_world/xl/sharedStrings.xml
inflating: hello_world/xl/styles.xml
inflating: hello_world/xl/workbook.xml
inflating: hello_world/xl/_rels/workbook.xml.rels
inflating: hello_world/xl/theme/theme1.xml
inflating: hello_world/xl/worksheets/sheet1.xml
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="..." xmlns:r="...">
<dimension ref="A1"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="..." xmlns:r="...">
<dimension ref="A1"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="..." xmlns:r="...">
<dimension ref="A1"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="..." xmlns:r="...">
<dimension ref="A1"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="..." xmlns:r="...">
<dimension ref="A1"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
How does it work
$ unzip -o -d hello_world hello_world.xlsx
...
$ xmllint --format hello_world/xl/worksheets/sheet1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="..." xmlns:r="...">
<dimension ref="A1"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0"/>
</sheetViews>
<sheetFormatPr defaultRowHeight="15"/>
<sheetData>
<row r="1" spans="1:1">
<c r="A1" t="s">
<v>0</v>
</c>
</row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
How does it work
•
•

It works well
XlsxWriter does the hard work so you
don’t have to
close()
•

Next time you need to write an Excel file with
Python try XlsxWriter

•

Clone it on Github, submit issues, add stars
http://github.com/jmcnamara/XlsxWriter

•

Read the documentation
https://xlsxwriter.readthedocs.org
PDF tutorial, cookbook and manual
Thank You

John McNamara
Emutex Ltd

Creating Excel files with Python and XlsxWriter

  • 1.
    Creating Excel files withPython and XlsxWriter John McNamara Emutex Ltd
  • 2.
    whoami John McNamara Software developerat Emutex Ltd http://www.emutex.com http://github.com/jmcnamara
  • 3.
    Why Excel • • • • • Bosses likeit Useful as a data source More useful with formatting Input/output source for Pandas Can be misused: Excel as a database
  • 4.
    Available Python modules • csv.py Readersand writers in core libs • xlwt/xlrd Mature, stable modules, mainly XLS support • openpyxl Reads and writes XLSX files • xlsxwriter New module from early 2013
  • 5.
    Excel File Formats Excel2003 : xls Excel 2007 : xlsx xlwt xlsxwriter Write Read openpyxl xlrd
  • 6.
    XlsxWriter • • • • • Write Excel XLSXfiles only Doesn’t read or re-write Excel files Adds many new features Uses core modules only Python 2.5, 2.6, 2.7, 3.1, 3.2, 3.3, PyPy, Jython
  • 7.
    Why another module • • Whynot? • XlsxWriter adds support for: Other modules support some but not all features charts, autofilters, tables, data validation, merged cells, rich text, conditional formatting, defined names, images, cell comments, sparklines, outlines
  • 8.
    Getting Started • Install: $ sudopip install xlsxwriter • Clone or fork: $ git clone git@github.com:jmcnamara/XlsxWriter.git $ cd XlsxWriter $ make test $ sudo python setup.py install • Read: https://xlsxwriter.readthedocs.org
  • 9.
  • 10.
    Hello World.xlsx import xlsxwriter workbook= xlsxwriter.Workbook('hello_world.xlsx') worksheet = workbook.add_worksheet() worksheet.write(0, 0, 'Hello world') workbook.close()
  • 11.
    Hello World.xlsx import xlsxwriter workbook= xlsxwriter.Workbook('hello_world.xlsx') worksheet = workbook.add_worksheet() worksheet.write(0, 0, 'Hello world') workbook.close()
  • 12.
    Hello World.xlsx import xlsxwriter workbook= xlsxwriter.Workbook('hello_world.xlsx') worksheet = workbook.add_worksheet() worksheet.write(0, 0, 'Hello world') worksheet.write(2, 1, 'Hello world') workbook.close()
  • 13.
    Hello World.xlsx import xlsxwriter workbook= xlsxwriter.Workbook('hello_world.xlsx') worksheet = workbook.add_worksheet() worksheet.write(0, 0, 'Hello world') worksheet.write(2, 1, 'Hello world') worksheet.write('C5', 'Hello world') workbook.close()
  • 14.
  • 15.
    Cell Formatting import xlsxwriter workbook= xlsxwriter.Workbook('formatting.xlsx') worksheet = workbook.add_worksheet() italic = workbook.add_format({'italic': True}) bold = workbook.add_format({'bold': True, 'font_color': '#9CB640'}) worksheet.write(0, 0, 'Hello') workbook.close()
  • 16.
    Cell Formatting import xlsxwriter workbook= xlsxwriter.Workbook('formatting.xlsx') worksheet = workbook.add_worksheet() italic = workbook.add_format({'italic': True}) bold = workbook.add_format({'bold': True, 'font_color': '#9CB640'}) worksheet.write(0, 0, 'Hello') worksheet.write(1, 0, 'Hello', italic) workbook.close()
  • 17.
    Cell Formatting import xlsxwriter workbook= xlsxwriter.Workbook('formatting.xlsx') worksheet = workbook.add_worksheet() italic = workbook.add_format({'italic': True}) bold = workbook.add_format({'bold': True, 'font_color': '#9CB640'}) worksheet.write(0, 0, 'Hello') worksheet.write(1, 0, 'Hello', italic) worksheet.write(2, 0, 'Hello', bold) workbook.close()
  • 18.
  • 19.
  • 20.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, 0, 'Hello world') workbook.close()
  • 21.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, 0, 'Hello world') workbook.close()
  • 22.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, 0, 'Hello world') worksheet.write(1, 0, 'Это фраза на русском!') workbook.close()
  • 23.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, 0, 'Hello world') worksheet.write(1, 0, 'Это фраза на русском!') worksheet.write(2, 0, 123) workbook.close()
  • 24.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, worksheet.write(1, worksheet.write(2, worksheet.write(3, workbook.close() 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456)
  • 25.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, worksheet.write(1, worksheet.write(2, worksheet.write(3, worksheet.write(4, workbook.close() 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format)
  • 26.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, worksheet.write(1, worksheet.write(2, worksheet.write(3, worksheet.write(4, worksheet.write(5, workbook.close() 0, 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format) '=PI()')
  • 27.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, worksheet.write(1, worksheet.write(2, worksheet.write(3, worksheet.write(4, worksheet.write(5, worksheet.write(6, workbook.close() 0, 0, 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format) '=PI()') 'http://python.com')
  • 28.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, worksheet.write(1, worksheet.write(2, worksheet.write(3, worksheet.write(4, worksheet.write(5, worksheet.write(6, worksheet.write(7, workbook.close() 0, 0, 0, 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format) '=PI()') 'http://python.com') True)
  • 29.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write(0, worksheet.write(1, worksheet.write(2, worksheet.write(3, worksheet.write(4, worksheet.write(5, worksheet.write(6, worksheet.write(7, workbook.close() 0, 0, 0, 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format) '=PI()') 'http://python.com') True)
  • 30.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write worksheet.write worksheet.write worksheet.write worksheet.write worksheet.write worksheet.write worksheet.write workbook.close() (0, (1, (2, (3, (4, (5, (6, (7, 0, 0, 0, 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format) '=PI()') 'http://python.com') True)
  • 31.
    Types from datetime importdate import xlsxwriter workbook = xlsxwriter.Workbook('types.xlsx') worksheet = workbook.add_worksheet() date_format = workbook.add_format({'num_format': 'd mmm yyyy'}) worksheet.write_string (0, worksheet.write_string (1, worksheet.write_number (2, worksheet.write_number (3, worksheet.write_datetime(4, worksheet.write_formula (5, worksheet.write_url (6, worksheet.write_boolean (7, workbook.close() 0, 0, 0, 0, 0, 0, 0, 0, 'Hello world') 'Это фраза на русском!') 123) 123.456) date(2013, 10, 13), date_format) '=PI()') 'http://python.com') True)
  • 32.
  • 33.
    Formulas worksheet.write_formula('A1', '=1+2') worksheet.write_formula('A2', '=A1') worksheet.write_formula('A3','{=SUM(B1:C1*B2:C2)}') worksheet.write_formula('A4', '=VLOOKUP("Acme", A2:D6, 3, FALSE)')
  • 34.
  • 35.
    Images import xlsxwriter workbook =xlsxwriter.Workbook('image.xlsx') worksheet = workbook.add_worksheet() worksheet.insert_image(0, 0, 'logo.png') workbook.close()
  • 36.
  • 37.
    Conditional Formatting import xlsxwriter wb= xlsxwriter.Workbook('conditional_format.xlsx') ws = wb.add_worksheet() high = wb.add_format({'bg_color': '#FFC7CE', 'font_color': '#9C0006'}) low = wb.add_format({'bg_color': '#C6EFCE', 'font_color': '#006100'}) data = [ [88, [24, [6, [73, [36, ] 25, 100, 57, 78, 54, 33, 20, 88, 1, 22, 23, 88, 28, 96, 66, 67, 29, 10, 26, 81, 13], 33], 26], 45], 90], for row, row_data in enumerate(data): ws.write_row(row, 0, row_data) ws.conditional_format('A1:F5', {'type': 'criteria': 'value': 'format': 'cell', '>=', 50, high}) ws.conditional_format('A1:F5', {'type': 'criteria': 'value': 'format': 'cell', '<', 50, low}) wb.close()
  • 38.
  • 39.
  • 40.
    Charts import xlsxwriter workbook =xlsxwriter.Workbook('chart.xlsx') worksheet = workbook.add_worksheet() # Add the worksheet data to be plotted. data = [10, 40, 50, 20, 10, 50] worksheet.write_column('A1', data) # Create a new chart object. chart = workbook.add_chart({'type': 'area'}) # Add a series to the chart. chart.add_series({'values': '=Sheet1!$A$1:$A$6'}) # Insert the chart into the worksheet. worksheet.insert_chart('C1', chart) workbook.close()
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
    Autofilters import xlsxwriter workbook =xlsxwriter.Workbook('autofilter.xlsx') worksheet = workbook.add_worksheet() # Add a format for the headers. header_format = workbook.add_format({'bold': 1, 'bg_color': '#C6EFCE'}) # Populate the worksheet data. # See the xlsxwriter docs for a full example. ... # Make the columns wider. worksheet.set_column('A:D', 12) # Format the header row. worksheet.set_row(0, 20, header_format) # Set the autofilter. worksheet.autofilter('A1:D51') workbook.close()
  • 55.
  • 56.
    Tables • • • Group a rangeof cells into a single entity Apply a uniform formatting across the cells Refer to the table in formulas worksheet.add_table('B3:F7', {options})
  • 57.
  • 58.
    Data Validation • • • Restrict dataentry to certain ranges Raise errors/warning within Excel Allow selection from drop down lists data_validation( 'B25', {'validate': 'integer', 'criteria': 'between', 'minimum': 1, 'maximum': 10})
  • 59.
  • 60.
    Cell Comments • Add commentsto cells worksheet.write('A1', 'Hello') worksheet.write_comment('A1', 'This is a comment')
  • 61.
  • 62.
    Sparklines • • Mini charts withincells to show trends Invented by Edward Tufte
  • 63.
    Code All theThings! • Lots of features
  • 64.
    Code All theThings! • • • • Lots of features Useful when you need them Ignore them when you don’t Plenty of examples and documentation to get you started
  • 65.
  • 66.
    How does itwork • 20% of a studio audience guessed Witchcraft
  • 67.
    How does itwork • • • • 20% of a studio audience guessed Witchcraft Actually a collection of XML files in a Zip file Can be unzipped using standard utilities Even modified in-place (if you are desperate)
  • 68.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx Archive: hello_world.xlsx inflating: hello_world/[Content_Types].xml inflating: hello_world/_rels/.rels inflating: hello_world/docProps/app.xml inflating: hello_world/docProps/core.xml inflating: hello_world/xl/sharedStrings.xml inflating: hello_world/xl/styles.xml inflating: hello_world/xl/workbook.xml inflating: hello_world/xl/_rels/workbook.xml.rels inflating: hello_world/xl/theme/theme1.xml inflating: hello_world/xl/worksheets/sheet1.xml
  • 69.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx Archive: hello_world.xlsx inflating: hello_world/[Content_Types].xml inflating: hello_world/_rels/.rels inflating: hello_world/docProps/app.xml inflating: hello_world/docProps/core.xml inflating: hello_world/xl/sharedStrings.xml inflating: hello_world/xl/styles.xml inflating: hello_world/xl/workbook.xml inflating: hello_world/xl/_rels/workbook.xml.rels inflating: hello_world/xl/theme/theme1.xml inflating: hello_world/xl/worksheets/sheet1.xml
  • 70.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx Archive: hello_world.xlsx inflating: hello_world/[Content_Types].xml inflating: hello_world/_rels/.rels inflating: hello_world/docProps/app.xml inflating: hello_world/docProps/core.xml inflating: hello_world/xl/sharedStrings.xml inflating: hello_world/xl/styles.xml inflating: hello_world/xl/workbook.xml inflating: hello_world/xl/_rels/workbook.xml.rels inflating: hello_world/xl/theme/theme1.xml inflating: hello_world/xl/worksheets/sheet1.xml
  • 71.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx Archive: hello_world.xlsx inflating: hello_world/[Content_Types].xml inflating: hello_world/_rels/.rels inflating: hello_world/docProps/app.xml inflating: hello_world/docProps/core.xml inflating: hello_world/xl/sharedStrings.xml inflating: hello_world/xl/styles.xml inflating: hello_world/xl/workbook.xml inflating: hello_world/xl/_rels/workbook.xml.rels inflating: hello_world/xl/theme/theme1.xml inflating: hello_world/xl/worksheets/sheet1.xml $ xmllint --format hello_world/xl/worksheets/sheet1.xml
  • 72.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml
  • 73.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="..." xmlns:r="..."> <dimension ref="A1"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"/> </sheetViews> <sheetFormatPr defaultRowHeight="15"/> <sheetData> <row r="1" spans="1:1"> <c r="A1" t="s"> <v>0</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet>
  • 74.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="..." xmlns:r="..."> <dimension ref="A1"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"/> </sheetViews> <sheetFormatPr defaultRowHeight="15"/> <sheetData> <row r="1" spans="1:1"> <c r="A1" t="s"> <v>0</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet>
  • 75.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="..." xmlns:r="..."> <dimension ref="A1"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"/> </sheetViews> <sheetFormatPr defaultRowHeight="15"/> <sheetData> <row r="1" spans="1:1"> <c r="A1" t="s"> <v>0</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet>
  • 76.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="..." xmlns:r="..."> <dimension ref="A1"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"/> </sheetViews> <sheetFormatPr defaultRowHeight="15"/> <sheetData> <row r="1" spans="1:1"> <c r="A1" t="s"> <v>0</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet>
  • 77.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="..." xmlns:r="..."> <dimension ref="A1"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"/> </sheetViews> <sheetFormatPr defaultRowHeight="15"/> <sheetData> <row r="1" spans="1:1"> <c r="A1" t="s"> <v>0</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet>
  • 78.
    How does itwork $ unzip -o -d hello_world hello_world.xlsx ... $ xmllint --format hello_world/xl/worksheets/sheet1.xml <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xmlns="..." xmlns:r="..."> <dimension ref="A1"/> <sheetViews> <sheetView tabSelected="1" workbookViewId="0"/> </sheetViews> <sheetFormatPr defaultRowHeight="15"/> <sheetData> <row r="1" spans="1:1"> <c r="A1" t="s"> <v>0</v> </c> </row> </sheetData> <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/> </worksheet>
  • 79.
    How does itwork • • It works well XlsxWriter does the hard work so you don’t have to
  • 80.
    close() • Next time youneed to write an Excel file with Python try XlsxWriter • Clone it on Github, submit issues, add stars http://github.com/jmcnamara/XlsxWriter • Read the documentation https://xlsxwriter.readthedocs.org PDF tutorial, cookbook and manual
  • 81.