2009-07-02 42 views
15

En Sharepoint cómo puede copiar un elemento de lista de una lista a otra lista por ejemplo copiar de "Lista A" a "Lista B" (ambos están en la raíz del sitio)copie los elementos de la lista de una lista a otra en sharepoint

quiero que esta copia que se produzca cuando se añade un nuevo elemento de la lista de la "lista a"

he intentado utilizar el método CopyTo() de un SPListItem dentro del receptor de eventos ItemAdded pero no podía averiguar la url copiar a.

+0

Ver también http://stackoverflow.com/questions/4508211/automatically-copy-list-data-from-one-list-to-another-list-after-1-month – SteveC

Respuesta

5

De hecho, como dijo Lars, puede ser difícil de mover elementos y retener versiones y userinfo correcta. He hecho cosas similares con eso antes, así que si necesita algunos ejemplos de código, hágamelo saber a través de un comentario y puede proporcionarle alguna orientación.

El método CopyTo (si usted decide ir con eso) necesitan una URI absoluta como: http://host/site/web/list/filename.doc

Por lo tanto, si va a realizar esto en un receptor de eventos que necesita para contatenar una cadena que contiene los elementos necesarios. Algo así como (tenga en cuenta que esto se puede hacer de otras maneras):

string dest= 
siteCollection.Url + "/" + site.Name + list.Name + item.File.Name; 
+1

+1 para CopyTo. @raklos Igual que su pregunta http://stackoverflow.com/questions/1059175 –

+0

Nunca he podido hacer que CopyTo funcione para elementos de lista simples. Funciona para bibliotecas de documentos, pero no listas como publicaciones de blog, tareas, etc. – Daniel

+0

Esto es genial. Pero, ¿hay forma de convertir ese documento en un archivo adjunto? Quiero copiar los archivos adjuntos de la lista de un elemento de la lista a otro. ¿Es posible? – Mihir

1

Copiar y mover archivos, elementos y carpetas en SharePoint puede ser complicado si desea conservar todos los metadatos, marcas de tiempo, información del autor e historial de versiones. Eche un vistazo a CopyMove for SharePoint - también tiene una API de servicio web.

+0

De manera bastante interesante me encuentro ante una situación en la que ahora tengo que escribir un servicio de movimiento para superar las limitaciones de CopyMove para Sharepoint;) qué irónico. –

0

Entonces, ¿las listas tienen exactamente las mismas columnas o columnas similares? De cualquier manera, puede crear un flujo de trabajo simple que se ejecute automáticamente cuando se crea un elemento en "Lista A". Como el flujo de trabajo en cuestión es relativamente simple, recomendaría usar SharePoint Designer (que es gratis) para crearlo, ya que puede hacer coincidir fácilmente las columnas de las dos listas. El recorrido a continuación debería ser capaz de ayudarlo a comenzar.

Create a Workflow - SharePoint Designer

17

Aquí está el código que uso. Pase un SPlistItem y el nombre de la lista de destinos como se ve en Sharepoint (No la URL). La única restricción es que tanto la lista debe estar en el mismo sitio:

private SPListItem CopyItem(SPListItem sourceItem, string destinationListName) { 
     //Copy sourceItem to destinationList 
     SPList destinationList = sourceItem.Web.Lists[destinationListName]; 
     SPListItem targetItem = destinationList.Items.Add(); 
     foreach (SPField f in sourceItem.Fields) { 
      //Copy all except attachments. 
      if (!f.ReadOnlyField && f.InternalName != "Attachments" 
       && null != sourceItem[f.InternalName]) 
      { 
       targetItem[f.InternalName] = sourceItem[f.InternalName]; 
      } 
     } 
     //Copy attachments 
     foreach (string fileName in sourceItem.Attachments) { 
      SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName); 
      byte[] imageData = file.OpenBinary(); 
      targetItem.Attachments.Add(fileName, imageData); 
     } 

     return targetItem; 
    } 
+1

¿Y las versiones de los artículos? – Evgeny

0

que tenían el mismo problema.

Después de experimentar un poco en lugar de

targetItem[f.InternalName] = sourceItem[f.InternalName];

utilicé:

targetItem[childField.Title] = sourceItem[parentField.Title];

0

Aquí es una PowerShell equivalente de Sylvian de que sí permite la copia en varios sitios web. Su código podría ser modificado de manera similar también ...

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(); 
} 

Para utilizar, copiar y pegar a una copia-listitems.ps1 archivo y ejecutar comandos usando Sharpoint powerhsell ...

0

Cómo copiar campo y guardar versiones:

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; 
       } 
      } 
1

Hacer Asegúrese de llamar al método CopyTo (url) en SPFile, no en SPListItem. por ejemplo:

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); 
    //... 
} 
1
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(); 
    } 
} 

No se olvide de añadir esta línea, tgtItem.Update();, de lo contrario obtendrá un err.

0

lista de copias de artículos de la lista uno o biblioteca de SharePoint a otra lista o biblioteca de SharePoint usando C# código del lado del servidor

// Itecollection es una colección de datos de la lista fuente

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"); 
    } 
    } 
} 

} 
Cuestiones relacionadas