Ben Southgate
Ben Southgate

Reputation: 3808

Possible to alter worksheet order in xlsxwriter?

I have a script which creates a number of the following pairs of worksheets in order:

WorkSheet (holds data) -> ChartSheet using WorkSheet

After the script is finished, I am left with worksheets ordered as such:

Data1, Chart1, Data2, Chart2, Data3, Chart3, ...

Is it possible to re-order the worksheets at the end of the script (i.e. before workbook.close()) to obtain the following worksheet order in the final .xlsx file?

Chart1, Chart2, Chart3,...,ChartN, Data1, Data2, Data3,...

Upvotes: 16

Views: 20534

Answers (3)

jmcnamara
jmcnamara

Reputation: 41624

I'm the author of XlsxWriter. It is possible to do it but it isn't advisable.

Each worksheet has an internal index which is used by Excel to track the relationship of different workbook objects.

Sorting the worksheets might work in some simple cases but for more complex workbooks it could lead to problems.

Upvotes: 17

Pluto
Pluto

Reputation: 854

You can create dummy sheets in the order you want and them fill them up with real data in any order:

import pandas as pd
dummy = pd.DataFrame()
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
# Here go the dummy sheets in the order you want
dummy.to_excel(writer, sheet_name='Chart1')
dummy.to_excel(writer, sheet_name='Chart2')
dummy.to_excel(writer, sheet_name='Data1')
dummy.to_excel(writer, sheet_name='Data2')
# Then you fill-in the placeholders in whatever order:
data1.to_excel(writer, sheet_name='Data1')
chart1.to_excel(writer, sheet_name='Chart1')
data2.to_excel(writer, sheet_name='Data2')
chart2.to_excel(writer, sheet_name='Chart2')
writer.close()

Upvotes: 8

alecxe
alecxe

Reputation: 473943

Just sort workbook.worksheets_objs list:

import xlsxwriter


workbook = xlsxwriter.Workbook('test.xlsx')

sheet_names = ['Data1', 'Chart1', 'Data2', 'Chart2', 'Data3', 'Chart3']
for sheet_name in sheet_names:
    workbook.add_worksheet(sheet_name)

# sort sheets based on name
workbook.worksheets_objs.sort(key=lambda x: x.name)
workbook.close()

Upvotes: 20

Related Questions