Upload
jmncnamara
View
6.363
Download
4
Embed Size (px)
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 [email protected]: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