View
6.363
Download
4
Category
Preview:
DESCRIPTION
Creating Excel files with Python and XlsxWriter. PyCon.ie 2013
Citation preview
Creating Excel files with Python and
XlsxWriter
John McNamaraEmutex Ltd
whoamiJohn 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 2003 : xls Excel 2007 : xlsx
Excel File Formats
xlwt
openpyxl
xlsxwriter
xlrd
ReadWrite
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?
• Other modules support some but not all features
• XlsxWriter adds support for:
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.xlsximport xlsxwriter
workbook = xlsxwriter.Workbook('hello_world.xlsx')worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'Hello world')
workbook.close()
Hello World.xlsximport xlsxwriter
workbook = xlsxwriter.Workbook('hello_world.xlsx')worksheet = workbook.add_worksheet()
worksheet.write(0, 0, 'Hello world')
workbook.close()
Hello World.xlsximport 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.xlsximport 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 Formattingimport 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 Formattingimport 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 Formattingimport 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 Formattingset_font_name()
set_font_size()
set_font_color()
set_bold()
set_italic()
set_underline()
set_font_strikeout()
set_font_script()
set_num_format()
set_locked()
set_hidden()
set_align()
set_center_across()
set_text_wrap()
set_rotation()
set_indent()
set_shrink()
set_text_justlast()
set_pattern()
set_bg_color()
set_fg_color()
set_border()
set_bottom()
set_top()
set_left()
set_right()
set_border_color()
set_bottom_color()
set_top_color()
set_left_color()
set_right_color()
Types
Typesfrom datetime import dateimport 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()
Typesfrom datetime import dateimport 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()
Typesfrom datetime import dateimport 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()
Typesfrom datetime import dateimport 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()
Typesfrom datetime import dateimport 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)worksheet.write(3, 0, 123.456)
workbook.close()
Typesfrom datetime import dateimport 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)worksheet.write(3, 0, 123.456)worksheet.write(4, 0, date(2013, 10, 13), date_format)
workbook.close()
Typesfrom datetime import dateimport 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)worksheet.write(3, 0, 123.456)worksheet.write(4, 0, date(2013, 10, 13), date_format)worksheet.write(5, 0, '=PI()')
workbook.close()
Typesfrom datetime import dateimport 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)worksheet.write(3, 0, 123.456)worksheet.write(4, 0, date(2013, 10, 13), date_format)worksheet.write(5, 0, '=PI()')worksheet.write(6, 0, 'http://python.com')
workbook.close()
Typesfrom datetime import dateimport 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)worksheet.write(3, 0, 123.456)worksheet.write(4, 0, date(2013, 10, 13), date_format)worksheet.write(5, 0, '=PI()')worksheet.write(6, 0, 'http://python.com')worksheet.write(7, 0, True)
workbook.close()
Typesfrom datetime import dateimport 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)worksheet.write(3, 0, 123.456)worksheet.write(4, 0, date(2013, 10, 13), date_format)worksheet.write(5, 0, '=PI()')worksheet.write(6, 0, 'http://python.com')worksheet.write(7, 0, True)
workbook.close()
Typesfrom datetime import dateimport 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)worksheet.write (3, 0, 123.456)worksheet.write (4, 0, date(2013, 10, 13), date_format)worksheet.write (5, 0, '=PI()')worksheet.write (6, 0, 'http://python.com')worksheet.write (7, 0, True)
workbook.close()
Typesfrom datetime import dateimport xlsxwriter
workbook = xlsxwriter.Workbook('types.xlsx')worksheet = workbook.add_worksheet()date_format = workbook.add_format({'num_format': 'd mmm yyyy'})
worksheet.write_string (0, 0, 'Hello world')worksheet.write_string (1, 0, 'Это фраза на русском!')worksheet.write_number (2, 0, 123)worksheet.write_number (3, 0, 123.456)worksheet.write_datetime(4, 0, date(2013, 10, 13), date_format)worksheet.write_formula (5, 0, '=PI()')worksheet.write_url (6, 0, 'http://python.com')worksheet.write_boolean (7, 0, True)
workbook.close()
Formulas
Formulasworksheet.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
Imagesimport xlsxwriter
workbook = xlsxwriter.Workbook('image.xlsx')worksheet = workbook.add_worksheet()
worksheet.insert_image(0, 0, 'logo.png')
workbook.close()
Conditional Formatting
Conditional Formattingimport 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, 25, 33, 23, 67, 13], [24, 100, 20, 88, 29, 33], [6, 57, 88, 28, 10, 26], [73, 78, 1, 96, 26, 45], [36, 54, 22, 66, 81, 90],]
for row, row_data in enumerate(data): ws.write_row(row, 0, row_data)
ws.conditional_format('A1:F5', {'type': 'cell', 'criteria': '>=', 'value': 50, 'format': high})
ws.conditional_format('A1:F5', {'type': 'cell', 'criteria': '<', 'value': 50, 'format': low})
wb.close()
Charts
ChartsAreastackedpercent_stacked
Barstackedpercent_stacked
Columnstackedpercent_stacked
Line
Pie
Radarwith_markersfilled
Scatterstraight_with_markersstraightsmooth_with_markerssmooth
Stock
Chartsimport 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()
Chartschart = workbook.add_chart({'type': 'area'})
Chartschart = workbook.add_chart({'type': 'bar'})
Chartschart = workbook.add_chart({'type': 'column'})
Chartschart = workbook.add_chart({'type': 'line'})
Chartschart = workbook.add_chart({'type': 'pie'})
Chartschart = workbook.add_chart({'type': 'radar'})
Charts
• Configurability
ChartsStacked chart with captions
ChartsChange chart styles
ChartsAdd trendlines to charts
ChartsFormat data points
ChartsSecondary axes
Autofilters
Autofiltersimport 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 formulasworksheet.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 listsdata_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 McNamaraEmutex Ltd
Recommended