Listing 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using System.IO;
using System.IO.Packaging;
using System.Xml;
using System.Xml.Linq;
namespace DocxDemo
{
class Program
{
static void Main(string[] args)
{
using (SPSite site = new SPSite("http://localhost"))
using (SPWeb web = site.OpenWeb())
{
SPDocumentLibrary templateLib =
web.Lists.Cast<SPList>().FirstOrDefault(list =>
list.RootFolder.Name == "WordTemplates") as SPDocumentLibrary;
SPDocumentLibrary reportLib =
web.Lists.Cast<SPList>().FirstOrDefault(list =>
list.RootFolder.Name == "WordReports") as SPDocumentLibrary;
SPList dataList = web.Lists.Cast<SPList>().FirstOrDefault(list =>
list.RootFolder.Name == "Finances");
string templateName = "ReportTemplate.docx";
string reportName = String.Format("DailyReport{0}.docx",
DateTime.Now.ToShortDateString());
string documentUrl =
SPUrlUtility.CombineUrl(web.Site.MakeFullUrl
(templateLib.RootFolder.Url), templateName);
SPFile template = templateLib.RootFolder.Files[documentUrl];
Stream templateStream = template.OpenBinaryStream();
Stream documentStream = new MemoryStream();
BinaryReader templateReader = new BinaryReader(templateStream);
BinaryWriter documentWriter = new BinaryWriter(documentStream);
documentWriter.Write(templateReader.ReadBytes((int)templateStream.Length));
documentWriter.Flush();
templateReader.Close();
templateStream.Dispose();
Package package = Package.Open(documentStream, FileMode.Open,
FileAccess.ReadWrite);
Uri uri = new Uri("/word/document.xml", UriKind.Relative);
PackagePart part = package.GetPart(uri);
Stream partStream = part.GetStream(FileMode.OpenOrCreate,
FileAccess.ReadWrite);
XmlReader xmlReader = XmlReader.Create(partStream);
XDocument doc = XDocument.Load(xmlReader);
xmlReader.Close();
XElement tablePlaceHolder = doc.Descendants(W.sdt)
.FirstOrDefault(x => x.Element(W.sdtContent) .Descendants(W.sdt)
.FirstOrDefault() != null);
XElement prototype = tablePlaceHolder.Element(W.sdtContent)
.Descendants(W.tr) .Where(x => x.Descendants(W.sdt)
.FirstOrDefault() != null) .FirstOrDefault();
IEnumerable<SPListItem> allItems = dataList.GetItems(new
SPQuery()).Cast<SPListItem>();
prototype.Parent.Add(allItems.Select(li =>
{
var result = new XElement(prototype);
foreach (var placeholder in result.Descendants(W.sdt))
{
string celltag = placeholder.Element(W.sdtPr)
.Element(W.tag) .Attribute(W.val) .Value;
if (li.Fields.ContainsField(celltag))
{
placeholder.Element(W.sdtContent) .Descendants(W.t)
.Single() .Value = String.Format("{0}", li[celltag]);
}
else
{
placeholder.Element(W.sdtContent) .Descendants(W.t)
.Single() .Value = String.Empty;
}
}
return result;
}));
prototype.Remove();
partStream.SetLength(0);
XmlWriter writer = XmlWriter.Create(partStream); doc.WriteTo(writer);
writer.Close(); package.Flush();
string reportUrl =
SPUrlUtility.CombineUrl(web.Site.MakeFullUrl(reportLib.RootFolder.Url),
templateName);
SPFile report = reportLib.RootFolder.Files.Add(reportUrl,
documentStream, true);
SPListItem reportItem = report.Item;
reportItem["Title"] = reportName; // Set Metadata reportItem.Update();
}
}
}
}