Похоже, здесь есть две проблемы: сортировка и формула таблицы.
Сортировка - это то, что Excel выполняет во время выполнения, в приложении Excel, и не является свойством или чем-то, что можетбыть запущенным в формате файла. Поскольку XlsxWriter имеет дело только с форматом файла, он не может выполнять какую-либо сортировку. Однако данные могут быть отсортированы в Python / Pandas до их записи с помощью XlsxWriter.
Проблема с формулой связана с тем, что в Excel был оригинальный синтаксис [#This Row]
(Excel 2007) и более поздний * 1006. * синтаксис (Excel 2010+). См. Документы XlsxWriter по Работа с таблицами рабочих таблиц - столбцы :
Структурные ссылки в стиле Excel 2007 [#This Row]
и в стиле Excel 2010 @
поддерживаются в формуле. Однако другие добавления Excel 2010 к структурным ссылкам не поддерживаются, и формулы должны соответствовать формулам стиля Excel 2007.
Таким образом, в основном вам необходимо использовать синтаксис Excel 2007, поскольку именно он хранится в формате файла, даже если Excel отображает синтаксис Excel 2010+ извне.
Когда выДобавление формул с помощью метода add_table()
XlsxWriter выполняет преобразование за вас, но если вы добавляете формулы другим способом, например с помощью Pandas, вам необходимо использовать синтаксис Excel 2007. Таким образом, вместо формулы, подобной этой:
=CONCATENATE(Table1[@[column_a]], " ", Table1[@[column_b]])
Вам нужно добавить это:
=CONCATENATE(Table1[[#This Row],[column_a]], " ", Table1[[#This Row],[column_b]])
(Вы можете видеть, почему в более поздних версиях Excel перешли на более короткий синтаксис.)
Тогда ваша программа будет работать должным образом:
import pandas as pd
import xlsxwriter
input_df = pd.DataFrame({'column_a': ['x', 'y', 'z'],
'column_b': ['red', 'white', 'blue'],
'column_c': ['a', 'e', 'i'],
})
output_file = 'output.xlsx'
column_concatenation = '=CONCATENATE(Table1[[#This Row],[column_a]], " ", Table1[[#This Row],[column_b]])'
input_df['concatenation'] = column_concatenation
workbook = xlsxwriter.Workbook(output_file)
worksheet = workbook.add_worksheet("Sheet with formula")
desired_column_order = ['column_b', 'concatenation', 'column_c', 'column_a']
input_df = input_df[desired_column_order]
data = input_df
# Make the columns wider for clarity.
worksheet.set_column(0, 3, 16)
worksheet.add_table('A1:D4', {'data': data.values.tolist(),
'columns': [{'header': c} for c in data.columns.tolist()] +
[{'header': 'concatenation'}],
'style': 'Table Style Medium 9'})
workbook.close()
Вывод: