Créer un fichier Excel sans Excel avec MyXls

Pour l’instant je suis sur un projet qui mélange InfoPath 2007 avec Sharepoint. Le formulaire InfoPath est utilisé comme template dans une « form Library ».

le gros problème que j’ai rencontré fut la création d’un fichier excel sans excel. La solution fût la librairie MyXls mais la documentation étant très sommaire, j’ai trouvé de l’aide sur un site chinois en chinois, j’ai décidé de faire un petit tuto sur cette librairie très intéressante.

Voici les étapes à suivre pour créer un fichier excel

//Créer un document
XlsDocument doc = new XlsDocument();
//créer une workSheet en lui donnant un nom
Worksheet ws = doc.Workbook.Worksheets.Add("sheetName");

A ce point on a un fichier vide avec une worksheet

Il y a deux façon de créer une cellule, la première est sans style

//Création d'une cellule sans style
rowNumber = 1;
cellNumber = 1;
Cells cells = ws.Cells;
Cell cell = cells.Add(rowNumber, cellNumber, "hello world");

la deuxième façon permet de mettre un style à la cellule et d’appliquer ce style à d’autre cellule si le besoin s’en fait sentir.

//création du style. la cellule aura un bord noir d'une épaisseur de 1
XF cellXF = doc.NewXF();
cellXF.BottomLineColor = Colors.Black;
cellXF.BottomLineStyle = 1;
cellXF.LeftLineColor = Colors.Black;
cellXF.LeftLineStyle = 1;
cellXF.TopLineColor = Colors.Black;
cellXF.TopLineStyle = 1;
cellXF.RightLineColor = Colors.Black;
cellXF.RightLineStyle = 1;

//Création d’une cellule avec style
rowNumber = 1;
cellNumber = 1;
Cells cells = ws.Cells;
Cell cell = cells.Add(rowNumber, cellNumber, « hello world », cellXF);

il reste encore deux choses à faire pour finir la création de notre premier document excel, un nom et un endroit pour le sauver.

Pour donner un nom il suffit d’utiliser la propriété FileName du document sans extension.

doc.FileName = "hello world";

Pour sauvegarder

doc.Save("c:\", true);

Save a deux paramètres, le premier est l’emplacement où la sauvegarde sera faite, ici, c:\. Le deuxième paramètre est un simple overwrite.

Maintenant j’ai mon document, par contre si j’avais voulu mettre un texte beaucoup plus long comme « Bonjour notre belle planète » j’aurais actuellement un problème de largeur de colonne. Pour résoudre ce problème il faut utiliser ColumnInfo et voici comment l’utiliser.

//doc = mon document excel et ws ma worksheet
ColumnInfo colInfo = new ColumnInfo(doc, ws);
//On indique à partir de quelle colonne on comment à appliquer la largeur et autres infos
colInfo.ColumnIndexStart = 0;
//On indique la dernière colonne où on applique la largeur et autres infos
colInfo.ColumnIndexEnd = 2;
//Je donne une largeur pour la colonne
colInfo.Width = 15 * 256;
//J'ajoute ce format de colonne à la worksheet
ws.AddColumnInfo(colInfo);

Il y a encore d’autres fonctionnalités telle  que mergeArea qui vous permet de fusionner des cellules entres elles.

Voila une première approche de cette librairie, mais si comme moi vous devez l’utiliser  avec sharepoint il serait préférable de télécharger les sources, de les signer puis les compiler.

Références

  • MyXls sur sourceforge, je vous conseil de télécharger les sources au lieu des dll. La version avec un SL est destiné à silverlight. Le seul problème c’est que la doc n’est pas bien fournie.
  • le site chinois où j’ai trouvé des exemples : MyXls
Publicités

Trouver le titre de votre site dans ProjectProperty

Je voudrais utiliser le titre de mon site qui est déclaré dans  « Site Settings > Title, Description, and Icon » pour cela dans la masterpage j’ai le tag <SharePoint:ProjectProperty ID= »ProjectProperty1″ Property= »Title » runat= »server » />.

le problème, récupérer le titre du site en C#.

Après quelques recherches j’ai trouvé la solution à mon problème.

Il faut faire appel à ProjectProperty qui se trouve dans l’assembly Microsoft.SharePoint.WebControls et l’utiliser comme ceci

var titre = ProjectProperty.GetContextWeb(Context).Title;

Voila un petit article vite fait

Search, Scope, Rules…

Comment créer un scope pour la recherche dans sharepoint avec C# ?

Vous prenez un peu de patience et quasi aucune doc sur le web 😉

Sinon c’est assez simple

On doit d’abord créer un scope

Qu’est-ce qu’un Scope?

Une scope est un conteneur de une ou plusieurs règles qui permet d’affiner le résultat d’une recherche retourné aux utilisateurs.

Scopes scopes = new Scopes(SearchContext.GetContext(SPContext.Current.Web.Site));
var newScope = scopes.AllScopes.Create(« TestScope », string.Empty, null, true, null, ScopeCompilationType.AlwaysCompile);

Une fois le Scope créé il faut lui adjoindre une règle.

Qu’est-ce qu’une règle ?

Une règle définit ce qui se trouve ou non dans le scope,  par exemple des documents, des pages, des listes, etc…

on reprend le scope que l’on vient de créer puis dans Rules on doit choisir le type de règle que l’on veut. Si on point sur une adresse web on utilisera CreateUrlRule,

si on veut une règle sur tous le contenu on utilisera CreateAllContentRule, si on veut une règle base sur une propriété on utilisera CreatePropertyQueryRule.

newScope.Rules.CreateUrlRule(ScopeRuleFilterBehavior.Include, UrlScopeRuleType.Folder, « http://votresite/sousSite/Lists/documents« );

Ici j’ai choisi l’option de pointer sur une adresse web et de mettre un filtre Include ce qui veut dire que tout object  qui correspond à cette règle sera inclut, sauf si cet objet est exclu par une autre règle. On peut voir que je point sur un Folder qui est une liste qui contient les documents sur lesquels je veux faire ma recherche


C’est grâce à l’article sur stsadm que j’ai trouvé comment faire

Référence

Le blog SharePoint Automation de Gary Lapointe

Scope : http://msdn.microsoft.com/fr-fr/library/bb428856.aspx

Sharepoint et des favoris !!!

Favoris … comment faire des favoris avec Sharepoint ? Voila la question que l’on me posait il y a pas si longtemps.

Ce que mon project owner entendait par favoris, c’est un système qui tiens informé quand une modification est faite sur un document, de pouvoir choisir quand je suis informé et de pouvoir désactiver le favoris ou de le réactiver à ma guise.

Après des recherches, je dois l’admettre, pas très fructueuse je me suis dit :  « On n’est jamais mieux servi que par soit même ». Donc… j’ai commencé à regarder ce que je pouvais faire avec l’élément « AlertMe » car il faisait déjà une grande partie du travail. Il ne me restait plus qu’à ajouter une interface et quelques options pour que ça ressemble à quelque chose.

J’ai créé plusieurs listes pour contenir les informations suivantes : Les différents filtres CAML utilisé avec Alert Me, les paramètres de l’utilisateur et la liste des différents favoris.

La liste des paramètres pour chaque utilisateur  est composé comme indiqué ci-dessous

  • UserName
  • FilterID me permet d’aller chercher le CAML spécifique au filtre que je veux faire
  • Frequency est l’id de référence par rapport à l’enum SPAlertFrequency.
  • Day id du jour par rapport à l’enum  DayOfWeek
  • Hours
  • document (boolean) ce champ est utile seulement pour indiquer si le document que l’on met en favoris doit être actif ou non

J’ai créé un webpart pour gérer cette partie comme ça l’utilisateur est toujours maitre de ses choix. On a choisi de mettre a jours tous les favoris avec les nouveaux paramètres de l’utilisateur a chaque fois qu’il les sauvegarde.

Les requêtes  CAML utilisées se trouvent dans une liste de filtre

  • FilterID
  • FilterName nom du filtre
  • CAML les différentes requêtes

les filtres utilisés sont les mêmes que ceux de base de l’alert me.

  • Quand on veut tout les changements la requête est simple puisqu’il ne faut pas mettre de CAML mais un espace.
  • Quand on veut être informé seulement des changements fais par les autres voila la CAML

<Query><Neq><Value type=’string’>{0}</Value><FieldRef Name=’Editor/New’/></Neq></Query> {0} est égal au nom de l’utilisateur qui fait le favoris.

  • Quand on veut être informé des changement fais les autres sur un document où j’étais le dernier ç avoir modifié quelque chose, on utilise ce CAML :

<Query><And><Eq><Value type=’string’>{0}</Value><FieldRef Name=’Editor/Old’/></Eq><Neq><Value type=’string’>{0}</Value><FieldRef Name=’Editor/New’/></Neq></And></Query> {0} est égal au nom de l’utilisateur qui fait le favoris

La dernière liste que j’ai créé est celle utilisé pour afficher la liste des favoris que l’utilisateur a.

  • Title nom du favoris affiché
  • UserName nom du user
  • documentid guid du document
  • Enable true si le favoris est actif (valeur par défaut : false)

Voila toutes les listes sont prête à être utilisée.

La façon dont on ajout un document au favoris de l’utilisateur est très simple, on a une liste qui affiche des documents en fonction d’une recherche et sur chaque document on a un menu style sharepoint dans lequel on a ajouté une entrée « Ajouter aux favoris ». En cliquant sur le lien on passe en paramètre l’id du document au système d’ajout de favoris.

Maintenant on va lier le tous avec un peu de code mais pas trop sinon c’est pas facile à digérer 😉

SPListItemCollection listItems = SPContext.Current.Web.Lists[docLibraryNameFav].Items;
SPListItem splistItem =
listItems .Add();
splistItem[« 
UserName« ] = user;le type de user est SPUser
splistItem[« FicheID« ] = ID;id du document
splistItem[« Title »] = GetFicheElement(ID, « Title »).ToString();ici je génère un titre
Utility.ExecuteUnsafeUpdates(() => splistItem.Update());

ici on vient de créé une nouvelle entrée dans les favoris mais on doit encore créé l’alerte. Il faut aussi récupérer les paramètres de l’utilisateur pour les appliquer à l’alert.

userParam est l’objet qui contient les paramètres de l’utilisateur

SPAlert alert = user.Alerts.Add();
alert.AlertType = SPAlertType.Item;
alert.Item = item;
ici l’item c’est un SPListItem qui représente le document suivi
alert.EventType = SPEventType.All;
alert.AlertFrequency = userParam.Frequency;
if (userParam.Frequency != SPAlertFrequency.Immediate)
alert.AlertTime = userParam.ATime;
on calcule la date à laquelle l’alerte est envoyer
alert.User = user;
if (userParam.IsEnable(item.Title)) 1
alert.Status = SPAlertStatus.On;
else
alert.Status = SPAlertStatus.Off;
SPAlertTemplate spat = new SPAlertTemplate();
spat.Name = « SPAlertTemplateType.DocumentLibrary »;
alert.AlertTemplate = spat;
alert.Filter = userParam.Filter.Filter;
alert.Title = « Titre de l’alerte »
;
alert.Update(false);
if (userParam.IsEnable(item.Title)) 2
ChangeStatusChapter(
documentID, user, item.Title, SPContext.Current.Web.ID, true);

  1. Cette fonction test si l’alerte doit être activée ou non, grâce aux paramètres de l’utilisateur
  2. Si l’alerte est active on change le statut du favoris à true

Dernier point, dans mon interface j’ai un tableau affichant la liste des favoris qui sont associés à mon compte. Chaque ligne comporte une étoile jaune pour actif ou grise pour inactif, quand on clique dessus le statut de l’alerte et du favoris changent. J’ai réalisé ça avec  un peu de code WCF et un peu de javascript mais j’expliquerai ça une prochaine fois.

J’attends vos commentaires constructif avec impatience. 😉

Référence vers l’article que j’ai utilisé.

How to create SharePoint alerts for lists or list items programmatically du blog The SharePoint’s Live for Me de Jérôme Noirfalise

Sharepoint mon ami …

Cela fait maintenant 9 mois que je fais du sharepoint 2007 et je dois dire que j’ai été agréablement surpris au début.

J’ai décidé d’écrire quelques articles sur le sujet, d’expliquer les problèmes que j’ai rencontré, les solutions que j’ai trouvé et les articles qui m’ont aidés.

A bientôt.

%d blogueurs aiment cette page :