copy list items from one list to another in sharepoint

前端 未结 11 2045
无人共我
无人共我 2020-12-14 20:35

In Sharepoint how can you copy a list item from one list to another list eg copy from \"List A\" to \"List B\" (both are at the root of the site)

I want this copying

相关标签:
11条回答
  • 2020-12-14 20:41
    private void CopyAttachmentsToList(SPListItem srcItem, SPListItem tgtItem)
    {
        try
        {
            //get source item attachments from the folder
            SPFolder srcAttachmentsFolder =
                srcItem.Web.Folders["Lists"].SubFolders[srcItem.ParentList.Title].SubFolders["Attachments"].SubFolders[srcItem.ID.ToString()];
    
            //Add items to the target item
            foreach (SPFile file in srcAttachmentsFolder.Files)
            {
                byte[] binFile = file.OpenBinary();
                tgtItem.Update();
                tgtItem.Attachments.AddNow(file.Name, binFile);
                tgtItem.Update();
            }
        }
        catch
        {
            //exception message goes here
        }
        finally
        {
            srcItem.Web.Dispose();
        }
    }
    

    Don't forget to add this line, tgtItem.Update();, else you will get an err.

    0 讨论(0)
  • 2020-12-14 20:43

    How to copy field and save versions:

    public static SPListItem CopyItem(SPListItem sourceItem, SPList destinationList)
                {
                    SPListItem targetItem = destinationList.AddItem();
    
                    //loop over the soureitem, restore it
                    for (int i = sourceItem.Versions.Count - 1; i >= 0; i--)
                    {
                        //set the values into the archive 
                        foreach (SPField sourceField in sourceItem.Fields)
                        {
                            SPListItemVersion version = sourceItem.Versions[i];
    
                            if ((!sourceField.ReadOnlyField) && (sourceField.InternalName != "Attachments"))
                            {
                                SetFields(targetItem, sourceField, version);
                            }
                        }
    
                        //update the archive item and 
                        //loop over the the next version
                        targetItem.Update();
                    }
    
                    foreach (string fileName in sourceItem.Attachments)
                    {
                        SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
                        targetItem.Attachments.Add(fileName, file.OpenBinary());
                    }
    
                    targetItem.SystemUpdate();
                    return targetItem;
                }
    
                private static bool SetFields(SPListItem targetItem, SPField sourceField, SPListItemVersion version)
                {
                    try
                    {
                        targetItem[sourceField.InternalName] = version.ListItem[sourceField.InternalName];
                        return true;
                    }
                    catch (System.ArgumentException)//field not filled
                    {
                        return false;
                    }
                    catch (SPException)//field not filled
                    {
                        return false;
                    }
                }
    
    0 讨论(0)
  • 2020-12-14 20:46

    Indeed as Lars said, it can be tricky to move items and retain versions and correct userinfo. I have done similar things with that before so if you need some code examples, let me know through a comment and can supply you with some guidance.

    The CopyTo method (if you decide to go with that) need an absolute Uri like: http://host/site/web/list/filename.doc

    So, if you are performing this in an event receiver you need to concatinate a string containing the elements needed. Something like (note that this can be done in other ways to):

    string dest= 
     siteCollection.Url + "/" + site.Name + list.Name + item.File.Name;
    
    0 讨论(0)
  • 2020-12-14 20:47

    Make sure you call CopyTo(url) method on SPFile, not on SPListItem. for example:

    ItemUpdated(SPItemEventProperties properties)
    { 
      //...
      string url = properties.Web.Site.Url + "/" + properties.Web.Name + "Lists/ListName/" + properties.ListItem.File.Name;
      //properties.ListItem.File.MoveTo(url);
      properties.ListItem.File.CopyTo(url);
      //...
    }
    
    0 讨论(0)
  • 2020-12-14 20:56

    Here is a powershell equivalent of Sylvian's that does allow for cross-site copy. His code could be modified similarly as well...

    param([string]$sourceWebUrl, [string]$sourceListName, [string]$destWebUrl, [string]$destListName)
    
    $sourceWeb = get-spweb $sourceWebUrl;
    $sourceList = $sourceWeb.Lists[$sourceListName];
    $destWeb = get-spweb $destWebUrl;
    $destList = $destWeb.Lists[$destListName];
    $sourceList.Items |%{
    $destItem = $destList.Items.Add();
    $sourceItem = $_;
    $sourceItem.Fields |%{
        $f = $_;
        if($f.ReadOnlyField -eq $false -and $f.InternalName -ne "Attachments" -and $sourceItem[$f.InternalName] -ne $null){
            $destItem[$f.InternalName] = $sourceItem[$f.InternalName];
        }
    }
    $destItem.Update();
    }
    

    To use, copy and past to a file copy-listitems.ps1 and run using Sharpoint powerhsell commandline...

    0 讨论(0)
  • 2020-12-14 20:58

    Copy List Items from one SharePoint List or library to Another SharePoint list or library using c# server side code

    //Itecollection is a collection of data from source list

     public void CopyItemsFromOneListToAnotherList(SPListItemCollection itemCollection)
     {  
     using (SPSite site = new SPSite(siteUrl))
     {
      using (SPWeb web = site.OpenWeb())
      {
         //Get destination list/library
         //destListName - Destination list/library name
       SPList destList = web.Lists.TryGetList(destListName);
    
       foreach (SPListItem sourceItem in itemCollection)
       {
        //Add new Item to list
        SPListItem destItem = destList.Items.Add();
    
        foreach (SPField field in sourceItem.Fields)
        {
         if (!field.ReadOnlyField && !field.Hidden && field.InternalName != "Attachments")
         {
          if (destItem.Fields.ContainsField(field.InternalName))
          {
           //Copy item to  destination library
             destItem[field.InternalName] = sourceItem[field.InternalName];
          }
         }
        }
        //Update item in destination  library or list
        destItem.Update();
        Console.WriteLine("Copied " + sourceItem["ID"] + "to destination list/library");
       }
      }
     }
    
     }
    
    0 讨论(0)
提交回复
热议问题