Blog
How To Use SetElement Method Using xlwings?
【Method】
The `SetElement` method of the `Chart` object allows you to set chart elements for the specified chart. The method has one parameter that provides options for setting. The possible values of the parameter are shown in the table below.
|
Name |
Value |
Description |
|
msoElementChartFloorNone |
1200 |
Do not display chart floor |
|
msoElementChartFloorShow |
1201 |
Display chart floor |
|
msoElementChartTitleAboveChart |
2 |
Display title above the chart |
|
msoElementChartTitleCenteredOverlay |
1 |
Display title centered as overlay |
|
msoElementChartTitleNone |
0 |
Do not display chart title |
|
msoElementChartWallNone |
1100 |
Do not display chart background wall |
|
msoElementChartWallShow |
1101 |
Display chart background wall |
|
msoElementDataLabelBestFit |
210 |
Use best fit data labels |
|
msoElementDataLabelBottom |
209 |
Display data labels at the bottom |
|
msoElementDataLabelCallout |
211 |
Display data labels as callouts |
|
msoElementDataLabelCenter |
202 |
Centered data labels |
|
msoElementDataLabelInsideBase |
204 |
Display data labels inside the base |
|
msoElementDataLabelInsideEnd |
203 |
Display data labels inside the end |
|
msoElementDataLabelLeft |
206 |
Display data labels on the left |
|
msoElementDataLabelNone |
200 |
Do not display data labels |
|
msoElementDataLabelOutSideEnd |
205 |
Display data labels outside the end |
|
msoElementDataLabelRight |
207 |
Display data labels on the right |
|
msoElementDataLabelShow |
201 |
Display data labels |
|
msoElementDataLabelTop |
208 |
Display data labels at the top |
|
msoElementDataTableNone |
500 |
Do not display data table |
|
msoElementDataTableShow |
501 |
Display data table |
|
msoElementDataTableWithLegendKeys |
502 |
Display data table with legend keys |
|
msoElementErrorBarNone |
700 |
Do not display error bars |
|
msoElementErrorBarPercentage |
702 |
Display percentage error bars |
|
msoElementErrorBarStandardDeviation |
703 |
Display standard deviation error bars |
|
msoElementErrorBarStandardError |
701 |
Display standard error error bars |
|
msoElementLegendBottom |
104 |
Display legend at the bottom |
|
msoElementLegendLeft |
103 |
Display legend on the left |
|
msoElementLegendLeftOverlay |
106 |
Overlay legend on the left |
|
msoElementLegendNone |
100 |
Do not display legend |
|
msoElementLegendRight |
101 |
Display legend on the right |
|
msoElementLegendRightOverlay |
105 |
Overlay legend on the right |
|
msoElementLegendTop |
102 |
Display legend at the top |
|
msoElementLineDropHiLoLine |
804 |
Display drop line and high/low lines |
|
msoElementLineDropLine |
801 |
Display drop line |
|
msoElementLineHiLoLine |
802 |
Display high/low line |
|
msoElementLineNone |
800 |
Do not display lines |
|
msoElementLineSeriesLine |
803 |
Display series lines |
|
msoElementPlotAreaNone |
1000 |
Do not display plot area |
|
msoElementPlotAreaShow |
1001 |
Display plot area |
How to use Application.DoubleClick in the xlwings API way
In the Excel object model, the Application.DoubleClick method is a powerful feature that simulates a double-click action on the active cell in Excel. This action can trigger various Excel behaviors, such as entering cell edit mode, opening a cell for formula editing, or activating specific cell features like data validation lists. In xlwings, this functionality is accessible through the api property, which provides direct access to the underlying Excel COM object. This allows Python scripts to automate user interactions that typically require manual double-clicks, enhancing automation workflows in data processing and analysis.
The syntax for using DoubleClick in xlwings is straightforward, as it is called as a method without any parameters. Since it operates on the active cell, it requires that a cell is selected or active in the Excel application. In xlwings, you typically access this through the Application object, which represents the Excel instance. The method is invoked as follows:
app.api.DoubleClick()
Here, app refers to the xlwings App instance connected to Excel. The api property exposes the native Excel COM interface, allowing direct calls to methods like DoubleClick. This method does not take any arguments; it simply performs the double-click action on whatever cell is currently active in Excel. It is important to note that the effectiveness of this method depends on the context—for example, if the active cell contains a formula, double-clicking might place the cursor in the formula bar for editing, while in a cell with data validation, it might open a drop-down list.
To use Application.DoubleClick in xlwings, you must first ensure an Excel application is running and a workbook is open. Below are practical code examples demonstrating its usage:
Example 1: Basic double-click to edit a cell. This example opens Excel, selects a specific cell, and simulates a double-click to enter edit mode.
import xlwings as xw
# Connect to the active Excel instance or start a new one
app = xw.apps.active if xw.apps.active else xw.App()
wb = app.books.active if app.books else app.books.add()
ws = wb.sheets.active
# Select cell A1 and activate it
ws.range('A1').select()
app.api.DoubleClick() # Simulate double-click on A1
# This may allow editing of the cell content in Excel
Example 2: Using double-click in a loop to process multiple cells. This can be useful for automating tasks like checking data validation or triggering macros tied to cell events.
import xlwings as xw
app = xw.apps.active
if app:
ws = app.books.active.sheets.active
for cell in ws.range('B1:B5'):
cell.select() # Make each cell active
app.api.DoubleClick() # Double-click to interact with each cell
# Add a pause or other operations as needed, e.g., app.wait(1)
Example 3: Combining with other xlwings features to log actions. This example double-clicks on a cell and then updates another cell with a timestamp.
import xlwings as xw
from datetime import datetime
app = xw.apps.active
if app:
ws = app.books.active.sheets.active
target_cell = ws.range('C3')
target_cell.select()
app.api.DoubleClick() # Trigger double-click on C3
# Record the action in cell D3
ws.range('D3').value = f'Double-clicked at {datetime.now().strftime("%H:%M:%S")}'
How to use Application.DisplayXMLSourcePane in the xlwings API way
The DisplayXMLSourcePane member of the Application object in Excel is a property that controls the visibility of the XML Source task pane. This pane is used when working with XML maps in Excel, allowing users to view and manage XML elements mapped to cells or ranges in a workbook. It is particularly useful for developers and advanced users who handle XML data integration, enabling them to see the structure of XML data and its mappings directly within the Excel interface. In xlwings, this property can be accessed and manipulated to programmatically show or hide the XML Source pane, enhancing automation in workflows involving XML data processing.
In terms of syntax, the DisplayXMLSourcePane property is accessed through the Application object in xlwings. The xlwings API provides a Pythonic way to interact with Excel’s object model. The property is a boolean value, where True indicates that the XML Source pane is visible, and False indicates it is hidden. The xlwings call format is straightforward: you reference the Application object and set or get the DisplayXMLSourcePane property. For example, to retrieve the current state, you use app.api.DisplayXMLSourcePane, and to change it, you assign a boolean value like app.api.DisplayXMLSourcePane = True. Note that in xlwings, the api attribute is used to access the underlying Excel object model properties and methods directly, ensuring compatibility with Excel’s native functionality.
Here are some code examples demonstrating the use of DisplayXMLSourcePane with xlwings. First, ensure you have xlwings installed and an Excel instance running. You can use the following snippets in a Python script or interactive environment. In the first example, we check if the XML Source pane is currently visible and print its status:
import xlwings as xw
# Connect to the active Excel instance
app = xw.apps.active
# Get the current state of the DisplayXMLSourcePane property
is_visible = app.api.DisplayXMLSourcePane
print(f"The XML Source pane is visible: {is_visible}")
To show the XML Source pane, set the property to True:
# Show the XML Source pane
app.api.DisplayXMLSourcePane = True
print("XML Source pane is now visible.")
To hide it, set the property to False:
# Hide the XML Source pane
app.api.DisplayXMLSourcePane = False
print("XML Source pane is now hidden.")
You can also toggle the visibility based on its current state. This is useful in automation scripts where you might need to ensure the pane is visible before performing XML-related operations:
# Toggle the visibility of the XML Source pane
current_state = app.api.DisplayXMLSourcePane
app.api.DisplayXMLSourcePane = not current_state
print(f"Toggled XML Source pane visibility to: {not current_state}")
How To Set Axis Reversing Using xlwings?
【Method】
axs.ReversePlotOrder=True
axs2.ReversePlotOrder=True
【Example】

【Code】
import xlwings as xw
import os
root=os.getcwd()
app=xw.App(visible=True,add_book=False)
wb=app.books.open(root+r'/data2.xlsx',read_only=False)
sht=wb.sheets('Sheet1')
sht.api.Range('A1:B7').Select() #
shp=sht.api.Shapes.AddChart() #
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1) #
axs.Border.ColorIndex=3 #
axs.Border.Weight=3 #
axs2=cht.Axes(2) #
axs.ReversePlotOrder=True
axs2.ReversePlotOrder=True
#wb.save()
#app.kill()

How to use Application.DeleteCustomList in the xlwings API way
The DeleteCustomList member of the Application object in Excel VBA is used to remove a previously defined custom autofill or sort list. In xlwings, which provides a Pythonic interface to Excel’s object model, this functionality can be accessed through the api property of an App or Book object, which exposes the underlying VBA object model. This is particularly useful for managing custom lists programmatically, such as cleaning up temporary lists or resetting configurations in automated Excel tasks.
Functionality
The primary purpose of DeleteCustomList is to delete a custom list that has been added to Excel. Custom lists are often used for custom sorting orders or to define autofill sequences (e.g., a list of department names or project stages). Deleting a list can help maintain a clean Excel environment, especially when lists are created dynamically during a script’s execution and are no longer needed afterward.
Syntax in xlwings
In xlwings, you call this method via the Application object obtained from an xlwings App instance. The syntax is:
app.api.DeleteCustomList(ListNum)
app: This is an xlwingsAppobject, representing the Excel application.api: This property provides direct access to the VBAApplicationobject.DeleteCustomList: The method being called.ListNum: A required parameter of typeInteger. It specifies the index number of the custom list to delete. The index corresponds to the position of the list in Excel’s custom lists collection, where custom lists are numbered sequentially starting from 1. Note that Excel’s built-in lists (like days and months) cannot be deleted and are not included in this count; the indexing applies only to user-defined custom lists.
To determine the correct ListNum for a specific list, you may need to retrieve it from Excel’s list collection. This can be done by using the GetCustomListNum method or by iterating through custom lists if you know the list’s contents. However, DeleteCustomList itself does not identify lists by name; it requires the numerical index.
Code Example
Below is an example demonstrating how to use DeleteCustomList in xlwings. This script adds a custom list, confirms its addition, and then deletes it. Note that error handling is important because attempting to delete a non-existent list or an out-of-range index will raise a com error.
import xlwings as xw
# Start or connect to Excel application
app = xw.App(visible=False) # Set visible=True to see Excel interface
try:
# First, add a custom list for demonstration
custom_list = ["North", "South", "East", "West"]
app.api.AddCustomList(ListArray=custom_list)
print("Custom list added successfully.")
# Assume we want to delete the most recently added list.
# In a real scenario, you might need to find the index dynamically.
# Here, we use index 1, assuming it's the first user-defined list.
# Note: This might fail if other custom lists exist.
list_num = 1 # Index for the custom list to delete
app.api.DeleteCustomList(ListNum=list_num)
print(f"Custom list at index {list_num} deleted.")
except Exception as e:
print(f"An error occurred: {e}")
finally:
# Close Excel
app.quit()
In this example, list_num is hard-coded as 1 for simplicity. In practice, to reliably delete a specific list, you might first use GetCustomListNum to find its index based on the list array, or maintain a record of list indices when creating them. The AddCustomList method returns the index of the newly created list, which can be stored for later deletion. For instance:
# When adding a list, store the returned index
new_list_index = app.api.AddCustomList(ListArray=custom_list)
# Later, delete using the stored index
app.api.DeleteCustomList(ListNum=new_list_index)
How To Set Crosses Using xlwings?
【Method】
Use the **AxisBetweenCategories** property of the **Axis** object to set the intersection point between the value axis and the category axis. If the value is `True`, the intersection occurs in the middle of the categories; if it is `False`, the intersection occurs at the middle point of the categories.
The **Crosses** property of the **Axis** object returns or sets the point at which the axis intersects with another axis. The possible values for this property are as follows:
|
Name |
Value |
Description |
|
xlAxisCrossesAutomatic |
-4105 |
Automatically set by Excel |
|
xlAxisCrossesCustom |
-4114 |
Set by **CrossesAt** property |
|
xlAxisCrossesMaximum |
2 |
Axis crosses at maximum value |
|
xlAxisCrossesMinimum |
4 |
Axis crosses at minimum value |
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
axs2=cht.Axes(2)
axs2.Crosses=2
#axs2.Crosses=-4114
#axs2.CrossesAt=50
【Example】

【Code】
import xlwings as xw
import os
root=os.getcwd()
app=xw.App(visible=True,add_book=False)
wb=app.books.open(root+r'/data2.xlsx',read_only=False)
sht=wb.sheets('Sheet1')
sht.api.Range('A1:B7').Select() #
shp=sht.api.Shapes.AddChart() #
shp.Left=20
cht=shp.Chart
axs=cht.Axes(1) #
axs.Border.ColorIndex=3 #
axs.Border.Weight=3 #
axs2=cht.Axes(2) #
axs.Crosses=xw.constants.AxisCrosses.xlAxisCrossesMaximum
axs2.CrossesAt=10
#wb.save()
#app.kill()

How to use Application.DDETerminate in the xlwings API way
The DDETerminate member of the Application object in Excel is used to manually close a specific Dynamic Data Exchange (DDE) channel that was previously established using the DDEInitiate method. DDE is an older inter-process communication protocol that allows Windows applications to exchange data in real-time. While modern applications often use more advanced technologies like COM or Office Add-ins, DDE is still occasionally used for legacy integrations. The DDETerminate method ensures that DDE channels are properly closed, freeing up system resources and preventing potential memory leaks or application instability. In xlwings, which provides a Pythonic interface to Excel’s COM automation, you can access this method through the Application object to manage DDE channels programmatically.
Syntax in xlwings:
The xlwings API mirrors the Excel Object Model, allowing direct calls to Excel methods. For DDETerminate, the syntax is:
app.api.DDETerminate(Channel)
- Channel (required, Long): An integer that specifies the DDE channel number to close. This channel number is returned by the DDEInitiate method when a DDE conversation is started. It uniquely identifies the open connection between Excel and another application.
To use this, you typically first initiate a DDE channel with DDEInitiate, perform data exchanges, and then terminate it. The parameter must be a valid, open channel number; passing an invalid number may result in a runtime error. Note that DDE channels can also close automatically when the workbook is closed, but explicit termination is recommended for clean resource management.
Example:
Suppose you have a DDE link to another application, such as a financial data server. Below is an xlwings code example that demonstrates initiating and terminating a DDE channel. This example assumes you have an existing Excel application instance and a workbook open.
import xlwings as xw
# Connect to the active Excel instance
app = xw.apps.active
# Initiate a DDE channel to an application (e.g., a hypothetical server "FINANCE" with topic "DATA")
# In practice, replace "FINANCE" and "DATA" with valid application and topic names for your DDE server.
try:
channel = app.api.DDEInitiate("FINANCE", "DATA")
print(f"DDE channel initiated with channel number: {channel}")
# Perform DDE operations here, such as requesting data using app.api.DDERequest or app.api.DDEPoke
# Example: request data from item "PRICE" on the channel
# data = app.api.DDERequest(channel, "PRICE")
# print(f"Received data: {data}")
# Terminate the DDE channel explicitly when done
app.api.DDETerminate(channel)
print("DDE channel terminated successfully.")
except Exception as e:
print(f"An error occurred: {e}")
How To Set Logarithmic Scale Chart Using xlwings?
【Method】
The **ScaleType** property of the **Axis** object returns or sets the scale type for the value axis, as shown in the table below. When the **ScaleType** property is set to `xw.constants.ScaleType.xlScaleLogarithmic`, the axis uses a logarithmic scale, allowing you to create a logarithmic scale chart.
|
Name |
Value |
Description |
|
xlScaleLinear |
-4132 |
Linear scale |
|
xlScaleLogarithmic |
-4133 |
Logarithmic scale |
sht.api.Range(‘A1:B7’).Select()
cht=sht.api.Shapes.AddChart().Chart
cht.Axes(2).ScaleType=xw.constants.ScaleType.xlScaleLogarithmic #Logarithmic scale
cht.Axes(2).HasMinorGridlines=True
【Example】

【Code】
#Coordinate system - Logarithmic scale chart
import xlwings as xw
import os
root = os.getcwd()
app = xw.App(visible=True, add_book=False)
wb=app.books.open(root+r'/P1P2.xlsx',read_only=False)
sht=wb.sheets(1)
sht.api.Range('A1:B7').Select()
cht=sht.api.Shapes.AddChart().Chart
cht.Axes(2).ScaleType=xw.constants.ScaleType.xlScaleLogarithmic #Logarithmic scale
cht.Axes(2).HasMinorGridlines=True
#wb.save()
#wb.close()
#app.kill()

How to use Application.DDERequest in the xlwings API way
The DDERequest method of the Application object in Excel is a legacy function used to retrieve data from an external application via Dynamic Data Exchange (DDE). This method allows Excel to act as a DDE client, requesting specific information from a DDE server application. While DDE is an older technology largely superseded by more modern methods like COM or various APIs, understanding DDERequest can be crucial for maintaining or interfacing with legacy systems that still rely on DDE communication channels. In the context of xlwings, which provides a Pythonic way to automate Excel, you can access this method through the Application object.
Functionality
The primary function of DDERequest is to establish a DDE conversation with a server application and request a specific data item. It is used to fetch real-time or static data from programs that support DDE, such as some financial data feeds, scientific instruments, or older database systems. The method initiates a request for a particular item within an established DDE channel.
Syntax
In xlwings, the DDERequest method is accessed via the Application object. The general syntax is as follows:
app.application.DDERequest(Channel, Item)
- Channel (Required): A Long integer that represents the channel number returned by a previous DDEInitiate call. This channel identifies an open DDE conversation with a server application.
- Item (Required): A String that specifies the data item being requested from the DDE server. The format and meaning of this string are defined by the server application. It often resembles a cell reference (e.g., “R1C1”) or a named range specific to the server.
Parameters and Usage
The method requires a pre-established DDE channel. Typically, you use the DDEInitiate method first to open a channel to a specific server and topic. The Item parameter is entirely dependent on the DDE server’s protocol. Common examples include requesting specific stock prices, instrument readings, or database fields. The method returns a Variant containing the requested data, which could be a number, string, or array.
Code Example
The following xlwings code example demonstrates how to use DDERequest to request data from a hypothetical DDE server. The example assumes a server application named “MyServer” with a topic “Prices”, and requests the item “StockXYZ”.
import xlwings as xw
# Connect to the active Excel instance or start a new one
app = xw.apps.active
# First, initiate a DDE channel (this is typically done via Excel's DDEInitiate method).
# Note: xlwings does not have a direct wrapper for DDEInitiate, so we use the underlying API.
# This requires the channel number from a successful DDEInitiate call.
# For demonstration, we assume channel number 5 is already open.
channel_number = 5 # This would come from a prior DDEInitiate call.
# Use DDERequest to get data for the item "StockXYZ"
try:
requested_data = app.api.DDERequest(Channel=channel_number, Item="StockXYZ")
print(f"Data received via DDE: {requested_data}")
except Exception as e:
print(f"DDERequest failed: {e}")
# In a real-world scenario, you would also close the channel using DDETerminate.
# app.api.DDETerminate(Channel=channel_number)
How To Set Multiple Axes Chart Using xlwings?
【Method】
– Bind a series to the primary or secondary axis
The **AxisGroup** property of the **Series** object is used to assign a series to either the primary axis (when the value is 1) or the secondary axis (when the value is 2).
– Set up the axes
You can access the **Axis** object through the **Chart** object with the following syntax:
axs=cht.Axes(Type,AxisGroup)
Where `cht` is the **Chart** object. The **Type** parameter indicates the type of axis. A value of 1 means a category axis, while 2 means a value axis. The **AxisGroup** parameter specifies whether the axis is primary (1) or secondary (2). By default, the primary axis is displayed on the left, and the secondary axis is displayed on the right. This allows the creation of a dual-axis chart, where two charts are overlaid using the same horizontal axis and different vertical axes.
sht.api.Range(‘A1:B7’).Select() #Data
cht=sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,\
20,20,350,200,True).Chart
cht.SeriesCollection(1).AxisGroup=1 #Y axis for series 1
cht.SeriesCollection(2).AxisGroup=2 #Y axis for series 2
cht.SeriesCollection(2).ChartType=xw.constants.ChartType.xlLine
cht.SeriesCollection(2).MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle
cht.SeriesCollection(2).MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255))
cht.SeriesCollection(2).MarkerSize=8
cht.SeriesCollection(2).HasDataLabels=True
cht.SeriesCollection(1).HasDataLabels=True
axs1=cht.Axes(2,1)
axs1.MinimumScale=0
axs1.MaximumScale=60
axs1.HasTitle=True
axs1.AxisTitle.Text=’Y Axis 1′
axs2=cht.Axes(2,2)
axs2.MinimumScale=10
axs2.MaximumScale=160
axs2.HasTitle=True
axs2.AxisTitle.Text=’Y Axis 2′
【Example】

【Code】
#Coordinate system - Multi-axis chart
import xlwings as xw
import os
root=os.getcwd()
app=xw.App(visible=True,add_book=False)
wb=app.books.open('multiaxis.xlsx',read_only=False)
sht=wb.sheets('Sheet1')
sht.api.Range('A1:B7').Select() #Data
cht=sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,\
20,20,350,200,True).Chart
cht.SeriesCollection(1).AxisGroup=1 #Y axis for series 1
cht.SeriesCollection(2).AxisGroup=2 #Y axis for series 2
cht.SeriesCollection(2).ChartType=xw.constants.ChartType.xlLine
cht.SeriesCollection(2).MarkerStyle=xw.constants.MarkerStyle.xlMarkerStyleTriangle
cht.SeriesCollection(2).MarkerForegroundColor=xw.utils.rgb_to_int((0,0,255))
cht.SeriesCollection(2).MarkerSize=8
cht.SeriesCollection(2).HasDataLabels=True
cht.SeriesCollection(1).HasDataLabels=True
axs1=cht.Axes(2,1)
axs1.MinimumScale=0
axs1.MaximumScale=60
axs1.HasTitle=True
axs1.AxisTitle.Text='Y Axis 1'
axs2=cht.Axes(2,2)
axs2.MinimumScale=10
axs2.MaximumScale=160
axs2.HasTitle=True
axs2.AxisTitle.Text='Y Axis 2'
cht.ChartTitle.Caption='Multi-axis Plot'
#wb.save()
#wb.close()
#app.kill()
