Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Thajunniza
Advisor
Advisor
Recently, we got a requirement from customer to copy the table column data as we do in ALV report.

The Copy option should be provided to all the columns of the table individually.

In responsive table we have an option to export the whole table data in an excel but there is no option to copy individual column data.

To achieve I have written the below custom logic to copy the whole column data and it works when the data is filtered or sorted as well.

I have created a custom ui5 project by using Northwind OData service to display the product details in a responsive table.

And in table columns I have add a button icon for copy the data with an action “onCopy”.

 

View:


<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" controllerName="table.controller.View1" displayBlock="true">
<Shell id="shell">
<App id="app">
<pages>
<Page id="page" title="{i18n>title}">
<content>
<FlexBox direction="Column" class="sapUiLargeMargin">
<SearchField liveChange=".onSearch" width="50%"/>
<Table id="__Table" items="{path: 'oNWModel>/Products'}" growing="true" growingThreshold="10" enableBusyIndicator="true" class="sapUiSmallMarginTopBottom" >
<columns>
<Column hAlign="Center">
<FlexBox alignItems="Center">
<Text text="Id"/>
<Button icon="sap-icon://copy" press="onCopy" tooltip="Copy Data" type="Transparent" class="sapUiTinyMarginBegin" />
</FlexBox>
</Column>
<Column >
<FlexBox alignItems="Center">
<Text text="Name"/>
<Button icon="sap-icon://copy" press="onCopy" tooltip="Copy Data" type="Transparent" class="sapUiTinyMarginBegin"/>
</FlexBox>
</Column>
<Column hAlign="Center">
<FlexBox alignItems="Center">
<Text text="Price"/>
<Button icon="sap-icon://copy" press="onCopy" tooltip="Copy Data" type="Transparent" class="sapUiTinyMarginBegin"/>
</FlexBox>
</Column>
</columns>
<items>
<ColumnListItem vAlign="Middle">
<cells>
<Text text="{oNWModel>ProductID}"/>
<Text text="{oNWModel>ProductName}"/>
<Text text="{oNWModel>UnitPrice}"/>
</cells>
</ColumnListItem>
</items>
</Table>
</FlexBox>
</content>
</Page>
</pages>
</App>
</Shell>
</mvc:View>

Controller function for onCopy:


Based on the triggered event I have fetched the column properties, as my copy button is embedded inside a flexbox I have used getParent() method twice to fetch the column property.

Used ‘/n’ line breaks for a new row. Pasting text like this in an Excel, OpenOffice / LibreOffice Calc spreadsheet, it will detect it as multiple cells. It also works with Google Docs.

navigator.clipboard is used to access the system clipboard in order to write the contents of the clipboard
 onCopy: function (oEvent) {
//Fetch the Column from where the event is triggered
var oCol = oEvent.getSource().getParent().getParent();
// Fetch the Table properties
var oTable = oCol.getTable();
//Get the items of the table
var oItems = oTable.getItems();
//You need the index of the column to get the exact cell of the item
var iIndex = oCol.getIndex() - 1;
//Column separtor to seggregate the data in table
var colSeparator = '\n';
var sCopy = "";
oItems.forEach(oItem => {
var oCell = oItem.getCells()[iIndex];
var sText = oCell.getText();
sCopy += sText + colSeparator;
});

//Copy the data to the clipboard
navigator.clipboard.writeText(sCopy).then(function () {
MessageToast.show("Column Copied");
}, function (err) {
console.error('Async: Could not copy text: ', err);
});
}

 

UI Screen:



 

Pasting in Excel:



 

Wrap Up :


In this blog post we went through a simple example of copy column text from a responsive table. However, you can use it to make much more elaborate changes to your applications.

I would love to hear from you! Please leave your feedback below.

 
4 Comments