Sharepoint 2010

Ebook : Les usages et techniques de Yammer et Office 365

Posted on

Bonjour à tous,

Nous venons de sortir sur Technet un ebook sur : Les Usages et Techniques de Yammer et Office 365.

La réunion de plusieurs spécialistes (voir la liste des auteurs ci-après) Yammer et SharePoint 2013 ainsi que Office 365 a donné naissance à de nombreux échanges qui ont été consignés dans cet eBook.

Constitué de 12 chapitres cet eBook prend toute la théorie de Yammer en charge. Voici les chapitres de cet eBook écrit par les membres du UGSF:

  1. Introduction
  2. Au commencement Twitter et Facebook régnaient en maitre absolus du réseau social
  3. Pourquoi utiliser Yammer ?
  4. Quel Usage
  5. Sécurité, Risque et Conformité
  6. Yammer et Azure
  7. Qu’est-ce que le Graph?
  8. Le développement Yammer
  9. Yammer API
  10. La customisation Yammer
  11. Retours d’expériences
  12. Les annexes

Cet eBook a été écrit par plusieurs experts et MVP SharePoint avec le soutien du Product Manager Yammer et SharePoint!

  • Alexandre Cipriani [Microsoft]
  • Pierre Erol [SharePoint MVP]
  • Gokan Ozcifci [SharePoint MVP]
  • Nicolas GEORGEAULT [SharePoint MVP]
  • Nabil Babaci [SharePoint MVP]
  • Kevin Treholan [SharePoint MVP]
  • Guillaume Meyer [SharePoint MVP]
  • Soumaya Toumi
  • Michael Nokhamzon
  • Gilles Pommier [Office 365 MVP]
  • Jean-Luc Boucho [Azure MVP]
  • Etienne Legendre

[Ebook] SP|CAP : SharePoint Customer Auditing Process

Posted on

Bonjour  à tous,

Nous venons de rendre public un ouvrage numérique disponible sur Technet intitulé : SP|CAP – SharePoint Customer Auditing Process. Cet ouvrage vous permettra d’avoir une vue d’ensemble sur les outils et méthodologies à utiliser lors d’un audit SharePoint. Balayant des aspects IT ( SQL, Dimensionnement, Architecture) et de Développements ( Best Practices, Outils, SDL ..)

L’objectif étant de répondre en cinq points aux points suivants :

  • Identifier qu’une Ferme SharePoint est correctement configurée
  • Identifier les Performances en fonction du matériel et des configuration logicielles
  • Mesurer les niveaux de sécurité mis en place
  • Identifier l’infrastructure mise en place
  • Assurer une maintenance

Cet ouvrage a été co-écrit par 5 MVP SharePoint :

 

Interview : EMEA MVP Community

Posted on

Hello @ tous une petite interview faite sur le Facebook EMEA MVP Community (Un grand merci Martine Thiphaine)

Contenu en Anglais 🙂

A new week, a new interview! Let’s meet SharePoint Server MVP Nabil Babaci from France! #mvpbuzz

1. Tell us a little about yourself.

My name is Nabil Babaci and I’m a SharePoint Server MVP since 2012. Mainly, I work on development side of SharePoint Server which I find really interesting. Today, I work for a Software Service company in France.

2. What inspired you to be active in the community?

My drive for community engagement was due to a possibility of sharing my kno…wledge through speaking at conferences or writing technical articles, networking and exchanging ideas on SharePoint.

3. Brag! Tell us about something great you have been working on lately (either community-related or as a technical expert).

Today, I’m working on a Learning Management System project on SharePoint involving more than 100,000 users, but it’s not the only thing that I’m working on! Soon, SharePoint 2013 Cookbook, which I co-authored with 10 others for the French-speaking audience will be published (http://www.dunod.com/informatique-multimedia/systemes-dinformation-et-reseaux/strategie-et-systemes-dinformation/gestion-/cookbook-sharepoint). It was a great experience for me. Last but not least, I will be at the TechDays 2014 in France as a co-speaker delivering a session called “Hybrid Architecture and governance in SharePoint 2013” with another French MVP (Pierre-Erol Giraudy).

4. What is, in your opinion, the greatest advantage of being a Microsoft MVP?

In my opinion the greatest advantage of being a Microsoft MVP is to be at the center of everything. I mean, you have the possibility to discuss Microsoft technologies with a lot of high skilled people, sharing their knowledge, facing different point of view with the same goal : the passion of the technology.

5. What would you recommend to people who aspire to be an MVP?

I think the first quality of a MVP is that his/her capacity of delivering quality content and popularizing what he’s doing. Being a good communicator can help too.

Thanks, Nabil!

UGSF – Branding effort sous SharePoint 2013

Posted on

Hello @ tous

Les slides de la session ” Branding effort sous SharePoint 2013″ lors de la journée UGSF !

UGSF – USGF Design Starter Kit sur CodePlex

Posted on

Hello à Tous !

En vue de la prochaine rencontre SharePoint via le User Group SharePoint France (UGSF), Nous avons créé un projet CodePlex vous permettant de trouver tous les éléments, les étapes et les outils pour bien “Designer” votre interface !

Lien : https://ugsfdesignstarterkit.codeplex.com/

SharePoint 2013 : OpenXML Excel Generation sur CodePlex

Posted on

Et voilà le dernier projet faisant suite à la génération de document Excel sur CodePlex !

Lien : https://openxmlexcel.codeplex.com/

Enjoy !

SharePoint 2013 : OpenXML au service de SharePoint 4/5 et 5/5

Posted on

Quatrième de la série, après avoir vu la génération de document Word, puis PowerPoint, attaquons l’utilisation d’OpenXML avec Excel.

L’exemple présenté va nous permettre de générer des lignes de façon dynamique et de les remplir depuis nos listes SharePoint.

 

ExcelProcessing

Nous créons un simple document Excel de ce type :

image

 

Côté SharePoint, une liste simple avec 2 Champs ( Title & Description), une fois créée regardons le code.

Helper Class

Dans cette classe, nous retrouvons quelques méthode très utile qui vont nous permettre d’effectuer des manipulations dans notre tableau.

  • CreateCell : Création de cellule
  • InsertCellInWorksheet :  Insertion d’une cellule ( dépend de CreateCell)
  • InsertRow: Insertion d’une ligne
  • GetCellInWorksheet : Récupération d’une cellule
  • UpdateCell : Mise à jour d’une cellule
public static class Helper
    {
        public static Cell CreateCell(string text, string column, uint lineNumber,
        Worksheet wsheet)
        {
            Cell newCell = InsertCellInWorksheet(column, lineNumber, wsheet);
            newCell.CellValue = new CellValue(text);
            newCell.DataType = new EnumValue<CellValues>(CellValues.String);
            return newCell;
        }

        public static Cell InsertCellInWorksheet(string columnName, uint rowIndex,
       Worksheet worksheet)
        {
            SheetData sheetData = worksheet.GetFirstChild<SheetData>();
            string cellReference = columnName + rowIndex;
            Row row;
            Cell refCell = null;
            if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
            {
                row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
            }
            else
            {
                row = new Row() { RowIndex = rowIndex };
                sheetData.Append(row);
            }
            if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0)
            {
                refCell = row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
            }
            else
            {
                foreach (Cell cell in row.Elements<Cell>())
                {
                    if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
                    {
                        refCell = cell;
                        break;
                    }
                }

                Cell newCell = new Cell() { CellReference = cellReference };
                row.InsertBefore(newCell, refCell);


                refCell = newCell;
                worksheet.Save();
            }

            return refCell;
        }
        public static void InsertRow(Worksheet worksheet)
        {
            SheetData sheetData = worksheet.GetFirstChild<SheetData>();
            Row lastRow = sheetData.Elements<Row>().LastOrDefault();

            if (lastRow != null)
            {
                sheetData.InsertAfter(new Row() {
                RowIndex = (lastRow.RowIndex + 1) }, lastRow);
            }

        }

        public static void UpdateCell(Worksheet worksheet, string text, uint rowIndex,
        string columnName)
        {
            if (worksheet != null)
            {
                Cell cell = GetCellInWorksheet(columnName, rowIndex, worksheet);

                cell.CellValue = new CellValue(text);
                cell.DataType = new EnumValue<CellValues>(CellValues.String);


            }

        }
        public static Cell GetCellInWorksheet(string columnName, uint rowIndex,
        Worksheet worksheet)
        {
            SheetData sheetData = worksheet.GetFirstChild<SheetData>();
            string cellReference = columnName + rowIndex;
            Row row;
            Cell refCell = null;
            if (sheetData.Elements<Row>().
                          Where(r => r.RowIndex == rowIndex).Count() != 0)
                row = sheetData.Elements<Row>().
                            Where(r => r.RowIndex == rowIndex).First();
            else
                return null;

            if (row.Elements<Cell>().
              Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0)
                refCell = row.Elements<Cell>().
                Where(c => c.CellReference.Value == cellReference).First();

            return refCell;
        }
    }

 

Code de génération

Maintenant il ne nous reste à appliquer ces méthodes dans notre code :

 

using (SpreadsheetDocument outDoc = SpreadsheetDocument.Open(docstream, true))
     {
          WorkbookPart wbPart = outDoc.WorkbookPart;
          Sheet tabSheet = wbPart.Workbook.Descendants<Sheet>().
          Where(s => s.Name != null && s.Name.Value.ToString().Trim() == "Demo").FirstOrDefault();

          if (tabSheet != null)
            {
                Worksheet wsheet = ((WorksheetPart)(wbPart.GetPartById(tabSheet.Id))).Worksheet;
                 SheetData sheetData = wsheet.GetFirstChild<SheetData>();
                 SPList spList = web.Lists.TryGetList("demo");
                  if (spList != null)
                  {
                     SPQuery qry = new SPQuery();
                     qry.ViewFields = @"<FieldRef Name='Description' /><FieldRef Name='Title' />";
                     SPListItemCollection listitems = spList.GetItems(qry);

                     uint startline = 6;

                     foreach (SPListItem item in listitems)
                    {
                       Helper.InsertRow(wsheet);//Insert after the last row
                       Cell cellA = Helper.CreateCell(item["Title"].ToString(), "A", startline , wsheet);
                       Cell cellB = Helper.CreateCell(item["Description"].ToString(), "B", startline, wsheet);
                        startline++;
                    }
                }
              //Update a Simple Cell
             Helper.UpdateCell(wsheet, "New Value in Cell", 3, "A");
             wsheet.Save();
}}

Résultat :

image

SharePoint 2013 : OpenXML Word AltChunk sur CodePlex

Posted on

Hello,

Faisant suite à l’article sur l’utilisation de l ‘API Open XML 2.5 pour générer des documents WORD avec l’utilisation du ALTCHUNK via SharePoint 2013, je vous met à disposition le projet CodePlex.

Lien ici : http://openxmlaltchunk.codeplex.com/

Enjoy !

SharePoint 2013 : OpenXML au Service de SharePoint 3/5

Posted on

Troisième article de notre série consacré à l’utilisation d’OpenXML avec SharePoint 2013 ou 2010, celui-ci sera dédié

à l’utilisation des AltChunk dans nos générations de document WORD.

La problématique est la suivante, comment intégrer du contenu HTML provenant de SharePoint et l’injecter dans notre document.

 

AltChunk Késako ?

 

Dans l’univers OpenXML et normalisé ISO/IEC-29500 Standard Compliance, AltChunk  est défini comme une possibilité d’intégrer des Contenus Externe.

En l’occurrence tout type de format, puisque AltChunk va simplement dans le cadre de document externe établir un lien de relation propre

à l’unicité du Altchunk.  Si l’on schématise cela donne :

image

WordAltChunkProcessing

Dans notre démo nous allons créer un document Word Template en y ajoutant un Content Control en mode Bounding Box :

image

Côté SharePoint, une liste avec une colonne de type HTML où j’ai ajouté un tableau.

image

Dans un premier temps je déclare une classe HTMLBUILDER qui me permettra de mettre mon code SharePoint entre mes balises HTML, dans cette classe j’y déclare une méthode StringBuilder.

public StringBuilder BuilderHtml(string paramhtml)
        {
            StringBuilder xhtmlBuilder = new StringBuilder();
            xhtmlBuilder.Append("<html>");
            xhtmlBuilder.Append("<body>");
            xhtmlBuilder.Append(paramhtml);
            xhtmlBuilder.Append("</body>");
            xhtmlBuilder.Append("</html>");

            return xhtmlBuilder;
        }

 

Une fois ma classe mise en place, j’entame la création d’une méthode qui s’intitule AltChunkMethod

qui aura la capacité de lire mon document word, de récupérer le ContentControl avec

l’alias défini et ensuite de renseigner un nom (ID, de préférence unique) pour créer un altchunk.

    protected static void AltChunkMethod(WordprocessingDocument outDoc, string htmlbuilder, string alias,
string chunkid)
        {
            string altChunkId = chunkid;//se doit d'être unique
            AlternativeFormatImportPart chunk = outDoc.MainDocumentPart.AddAlternativeFormatImportPart
                (AlternativeFormatImportPartType.Xhtml, altChunkId);
            //Utilisation en mémoire d'html
            using (MemoryStream xhtmlStream = new MemoryStream(Encoding.UTF8.GetBytes(htmlbuilder)))
            {
                chunk.FeedData(xhtmlStream);//Injection html

                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;

                //Parcours dans le document à la recherche d'alias
                var resprocess = from bm in outDoc.MainDocumentPart.Document.Body.Descendants<SdtAlias>()
                                 where bm.Val.Value == alias
                                 select bm;
                var process = resprocess.SingleOrDefault();
                var parent = process.Parent;

                parent.InsertAfterSelf(altChunk);//Insertion dans le ContentControl

            }
        }

Il ne me reste plus qu’a injecter mon contenu HTML. de la façon suivante :

foreach (SPListItem item in listitems)
 {
    /*HTML-RTE*/
    HtmlBuilder html_builder = new HtmlBuilder();
    StringBuilder xhtmlBuilder = html_builder.BuilderHtml(item["Description"].ToString());
    AltChunkMethod(outDoc, xhtmlBuilder.ToString(), "altchunk", "chunkid");
}

Résultat

image

Remarques

Si vous avez plusieurs ContentControl pouvant héberger de l’html, vous vous devrez de rendre l’id du Altchunk unique à chaque parcours, ainsi lors du parcours des items de la liste,vous ne vous retrouverez pas avec toutes vos données dans un seul ContentControl

Projet CodePlex

Vous pouvez trouvez les ressources sur codeplex : http://openxmlaltchunk.codeplex.com/

SharePoint 2013 : OpenXML PowerPoint Generation sur CodePlex

Posted on

Faisant suite à l’article sur l’utilisation de l ‘API Open XML 2.5 pour générer des documents PowerPoint via SharePoint 2013, je vous met à disposition le projet CodePlex, vous permettant de mieux apprendre la techno.

Lien ici : http://openxmlppt.codeplex.com/

Enjoy !