{"id":2348,"date":"2026-10-04T15:56:07","date_gmt":"2026-10-04T07:56:07","guid":{"rendered":"https:\/\/xlwings.net\/blog\/?p=2348"},"modified":"2026-03-29T09:43:30","modified_gmt":"2026-03-29T09:43:30","slug":"how-to-use-worksheetsort-in-the-xlwings-api-way","status":"publish","type":"post","link":"https:\/\/xlwings.net\/blog\/how-to-use-worksheetsort-in-the-xlwings-api-way\/","title":{"rendered":"How to use Worksheet.Sort in the xlwings API way"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <code>Sort<\/code> member of the <code>Worksheet<\/code> object in the xlwings library provides a powerful way to programmatically sort data ranges within an Excel worksheet. It directly leverages Excel&#8217;s native sorting capabilities, allowing for multi-key sorts with custom orders. This is essential for automating data organization tasks in reports or datasets directly from Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Functionality:<\/strong><br>The primary function is to sort a specified range of cells. You can define one or more sort keys (columns or rows to sort by), specify the sort order (ascending or descending), and, for advanced cases, even apply custom sort orders (like sorting by day-of-week or month name). It operates similarly to the sort functionality in the Excel UI but is controlled via code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Syntax:<\/strong><br>The basic syntax in xlwings is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>worksheet.api.Sort.SortFields.Clear()\nworksheet.api.Sort.SortFields.Add(\nKey=range_to_sort_by,\nSortOn=sort_on_parameter,\nOrder=sort_order,\nCustomOrder=custom_order,\nDataOption=data_option\n)\nworksheet.api.Sort.SetRange(range_to_sort)\nworksheet.api.Sort.Header = header_setting\nworksheet.api.Sort.MatchCase = match_case_setting\nworksheet.api.Sort.Orientation = orientation\nworksheet.api.Sort.SortMethod = sort_method\nworksheet.api.Sort.Apply()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Key parameters include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Key<\/code>: An xlwings <code>Range<\/code> object representing the column or row that serves as the sort key.<\/li>\n\n\n\n<li><code>Order<\/code>: Use <code>win32c.SortOrder.xlAscending<\/code> (1) or <code>win32c.SortOrder.xlDescending<\/code> (2).<\/li>\n\n\n\n<li><code>Header<\/code>: Specifies if the first row contains headers. Use <code>win32c.YesNoGuess.xlYes<\/code> (1), <code>xlNo<\/code> (2), or <code>xlGuess<\/code> (0).<\/li>\n\n\n\n<li><code>Orientation<\/code>: Defines if sorting is by column (<code>win32c.SortOrientation.xlSortColumns<\/code>, 1) or by row (<code>xlSortRows<\/code>, 2).<\/li>\n\n\n\n<li><code>SortOn<\/code>: Typically <code>win32c.SortOn.xlSortOnValues<\/code> (0).<\/li>\n\n\n\n<li><code>CustomOrder<\/code>: A string indicating a custom list (e.g., &#8220;Low,Medium,High&#8221;).<\/li>\n\n\n\n<li><code>SetRange<\/code>: The main <code>Range<\/code> object encompassing all cells to be sorted.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code Examples:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Simple Single-Column Sort:<\/strong><br>Sort data in range A1:C10 based on values in column A (the first column) in ascending order, assuming the first row is a header.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>import xlwings as xw\nfrom xlwings.constants import SortOrder, YesNoGuess\n\napp = xw.App(visible=False)\nwb = app.books.open('data.xlsx')\nws = wb.sheets&#91;'Sheet1']\nsort_range = ws.range('A1:C10')\n\nws.api.Sort.SortFields.Clear()\nws.api.Sort.SortFields.Add(Key=ws.range('A1:A10'), Order=SortOrder.xlAscending)\nws.api.Sort.SetRange(sort_range.api)\nws.api.Sort.Header = YesNoGuess.xlYes\nws.api.Sort.Apply()\n\nwb.save()\nwb.close()\napp.quit()<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Multi-Column Sort:<\/strong><br>Sort range A1:D100 first by column C (descending), then by column A (ascending).<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>import xlwings as xw\nfrom xlwings.constants import SortOrder, YesNoGuess\n\napp = xw.App(visible=False)\nwb = app.books.open('report.xlsx')\nws = wb.sheets&#91;0]\nmain_range = ws.range('A1:D100')\n\nws.api.Sort.SortFields.Clear()\n# First key: Column C\nws.api.Sort.SortFields.Add(Key=ws.range('C1:C100'), Order=SortOrder.xlDescending)\n# Second key: Column A\nws.api.Sort.SortFields.Add(Key=ws.range('A1:A100'), Order=SortOrder.xlAscending)\nws.api.Sort.SetRange(main_range.api)\nws.api.Sort.Header = YesNoGuess.xlYes\nws.api.Sort.Apply()\n\nwb.save()\napp.quit()<\/code><\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Sort with Custom Order:<\/strong><br>Sort a list in A1:A20 by the custom priority &#8220;High&#8221;, &#8220;Medium&#8221;, &#8220;Low&#8221;.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>import xlwings as xw\nfrom xlwings.constants import YesNoGuess\n\napp = xw.App(visible=False)\nwb = app.books.open('tasks.xlsx')\nws = wb.sheets&#91;'Priority']\n\nsort_range = ws.range('A1:A20')\nws.api.Sort.SortFields.Clear()\nws.api.Sort.SortFields.Add(Key=sort_range.api,\nCustomOrder=\"High,Medium,Low\")\nws.api.Sort.SetRange(sort_range.api)\nws.api.Sort.Header = YesNoGuess.xlNo # No header in this single column\nws.api.Sort.Apply()\n\nwb.save()\napp.quit()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The `Sort` member of the `Worksheet` object in the xlwings library provides a powerful way to progra&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25],"tags":[],"class_list":["post-2348","post","type-post","status-publish","format-standard","hentry","category-xlwings-api-reference"],"_links":{"self":[{"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/posts\/2348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/comments?post=2348"}],"version-history":[{"count":1,"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/posts\/2348\/revisions"}],"predecessor-version":[{"id":3579,"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/posts\/2348\/revisions\/3579"}],"wp:attachment":[{"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/media?parent=2348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/categories?post=2348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/xlwings.net\/blog\/wp-json\/wp\/v2\/tags?post=2348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}