Copy And Paste Excel / Clipboard Data To Gridview In ASP.net


Q Is there any means to copy the excel data to Gridview in ASP.net? It is obvious that you should use the native .net controls without borrowing any plugins /  custom controls from a third party.

A If you are .net 2.0+, then there is defenitely an easy way to achieve things. All you need is an Update panel and a Gridview which loads asyncronously after a single line of javascript that captures the data from the clipboard.

We build a page with an UpdatePanel and GridView inside it. Also we will have a HiddenField to hold our clipboard data.

<div> 

<asp:Button ID="ReloadCtl" runat="server" Text="Paste" OnClick="ReloadCtl_Click"
OnClientClick="return pasteContent();" />
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:HiddenField ID="ClipboardContent" runat="server" ClientIDMode="Static" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ReloadCtl" />
</Triggers>
</asp:UpdatePanel>
</div>

 We will have a simple javascript code which will read the clipboard data and paste it to the control. 

<script language="javascript" type="text/javascript"> 


function pasteContent() {
document.getElementById('ClipboardContent').value = window.clipboardData.getData('Text');
return (true);
}
</script>

Our next job would be to write a method which will get a excel / clipboard data and convert it to a datatable so that we can bind it to the gridview. 

public static DataTable GetDataTable(string content, bool IsFirstColumnHeader) 

{
DataTable value = new DataTable();
string[] rowValues;
string[] colValues;
int colIndex = 0;
int rowIndex = 0;

if (string.IsNullOrEmpty(content) || content == "null")
return null;

content = content.Replace("\r", "");
rowValues = content.Split(RowDelemiter);

foreach (string rowItem in rowValues)
{
if (string.IsNullOrEmpty(rowItem))
continue;

colValues = new string[rowItem.Split(ColumnDelemiter).Length];
colIndex = 0;

foreach (string colItem in rowItem.Split(ColumnDelemiter))
{
if (rowIndex == 0 && IsFirstColumnHeader)
value.Columns.Add(colItem);
else if (rowIndex == 0)
value.Columns.Add();

if ((rowIndex == 0 && !IsFirstColumnHeader) || rowIndex != 0)
colValues[colIndex] = colItem;

colIndex++;
}
if ((rowIndex == 0 && !IsFirstColumnHeader) || rowIndex != 0)
value.Rows.Add(colValues);

rowIndex++;
}

return value;
}

The above code is written to generate a datatable with / without the first row as header. This holds good when you are not using and entity pattern for your code. But, this is not true 99% of times as any efficient application would require a entity mapping to be done for your data. In that case we could use the below code which takes advantage of the reflection to fill the properties. 

public static List<T> GetData<T>(string content) 

{
List<T> value = new List<T>();
T obj;
string[] rowValues;
string[] colValues;
int colIndex = 0;
PropertyInfo pInfo;

if (string.IsNullOrEmpty(content) || content == "null")
return null;

content = content.Replace("\r", "");
rowValues = content.Split(RowDelemiter);

foreach (string rowItem in rowValues)
{
if (string.IsNullOrEmpty(rowItem))
continue;

colValues = new string[rowItem.Split(ColumnDelemiter).Length];
colIndex = 0;
obj = (T)Activator.CreateInstance(typeof(T));

foreach (string colItem in rowItem.Split(ColumnDelemiter))
{
pInfo = obj.GetType().GetProperties()[colIndex];
pInfo.SetValue(obj, colItem, null);
colIndex++;
}
value.Add(obj);
}

return value;
}

It’s obvious that the above code does not address any validation of the fields / properties but this gives you a better insight on how to work out this functionality so that you can customize to your neccessity.

How it Works

  1. Once you click the “Paste” button, the javascript copies the clipboard content to the hidden control and triggers an asynchronous postback.
  2. The code behind reads the content and converts to datatable or object list as per neccessity.
  3. Bind the datasource which is created.

Download the attachment for a sample project.

http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-39-00-Source+Codes/4477.ExcelToGridview.zip

Comments (9)

  1. JNewby says:

    Hey, first I'd like to say thanks for the code!  I really needed it for something I'm building.  That being said, I need to be able to limit the number of columns that the users may paste to say… 4 columns.  Would I accomplish this in GridView by setting AutoGenerateColumns="false", and then specifying <asp:BoundField> in between the column tags?  I need to be able to retrieve the pasted data, which can have a variable amount of rows but only four columns.    

    Thanks in advance,

    -Jake

  2. ravi says:

    its not working in my systeam  please provide fully code

  3. Robert Barnes says:

    javascript function pasteContent only works for IE.  

  4. I Margulies says:

    Thanks so much it is a beautiful tool to start with!

  5. Kariocecus says:

    Same issue as JNewby here, would love to know how to edit how many columns are displayed to the user.

  6. shailesh maheshwari says:

    Thanks for this code, dude u solved my problem… Thanks alot.

  7. as says:

    Same issue as JNewby here, would love to know how to edit how many columns are displayed to the user.

  8. Ajitesh says:

    Please tell how to edit how many columns are displayed to the user???

  9. Bruce says:

    Is there a way to target a specific column?