User Word Automation Services and Open XML SDK to generate word files in SharePoint2010

简介:

SharePoint 2010 has established a new service called “Word Automation Services” to operate word files. This service will be installed when install SharePoint 2010. It is useful for archive documents or convert word format in server. But we need initialize and configure this service on Central Administration or PowerShell.(How to set up Word Automation Services? see:http://msdn.microsoft.com/en-us/library/ee557330(v=office.14).aspx)

After initialized, SharePoint 2010 will setup a database named:”WordAutomationServices_XXXX”. We can find the service status in Central Administration->Application Management->Service Applications->Manage services on server:

image

Make sure the service is started.

Call Word Automation Services

Next, we can use C# code to call the Word Automation Services. For example, this is a word file in Shared Documents, we need to convert the word file to pdf format and saved in another document library (named Docs), we can write code like this:

string siteUrl = "http://localhost";
string wordAutomationServiceName = "Word Automation Services";
using (SPSite spSite = new SPSite(siteUrl))
{
 ConversionJob job = new ConversionJob(wordAutomationServiceName);
 job.UserToken = spSite.UserToken;
 job.Settings.UpdateFields = true;
 job.Settings.OutputFormat = SaveFormat.PDF;
 job.AddFile(siteUrl + "/Shared%20Documents/Contract%20Management.docx",
 siteUrl + "/Docs/Contract%20Management.pdf");
 job.Start();
}

Note: Word Automation Services use a timer to process our job, so even we finished our process in code, we still cannot find the pdf file in document library. After a few minutes, the timer will complate our job, refresh the document library page we can see the pdf file. If we want to make the timer work frequently, we can go to Central Administration->Monitoring->Timer Jobs->Review job definitions, click the “Word Automation Services Timer Job”, change the “Recurring Schedule” value such as 1 minute. If we want to run the job immediately, we can click the "Run Now” button.

image

User Open XML SDK to generate word file

Open XML is a common standard format for Office files since Office 2007. We can use Open XML SDK to develop the application that combine the user define template and data (from database, SharePoint list, interface or other user input).

Open XML SDK is not contained in Visual Studio by default, so we must download the SDK from Microsoft.(Download address:http://www.microsoft.com/en-us/download/details.aspx?id=5124) After install the SDK, we can reference the component: DocumentFormat.OpenXml and WindowsBase.

In the code, we can read the template from disk or SharePoint document library. The template contains some special word than we will replace them by user data.

For example, there is a template, we need to fill the vender name, amount and date, so we can define the template like this:

Purchasing Contract

Vender:$Vender,

Description:bala bala~~~

Total Amount: $Amount

Signature Date:$Today

We save the template as a docx file in disk, and we can read the template by Open XML SDK and replace the words like this:

FileStream fs=new FileStream("Template.docx",FileMode.Open,FileAccess.Read);
byte[] byteArray = new byte[fs.Length];
fs.Read(byteArray, 0, (int)(fs.Length));


using (MemoryStream memStr = new MemoryStream())
{
 memStr.Write(byteArray, 0, byteArray.Length);
 using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(memStr, true))
 {

 string docText = null;
 using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
 {
 docText = sr.ReadToEnd();
 }
 docText = docText.Replace("$Vender", "Microsoft");
 docText = docText.Replace("$Amount", "1234.56");
 docText = docText.Replace("$Today", DateTime.Today.ToShortDateString());

 using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
 {
 sw.Write(docText);
 }
}
Console.WriteLine("Saving");
//save new file from stream memStr...

Run this code, we can find the result document content like this:

Purchasing Contract

Vender:Microsoft,

Description:bala bala~~~

Total Amount: 1234.56

Signature Date:2013/9/27

Use both the Word Automation Services and Open XML SDK, we can generate the word document by template and user data, and convert the result as a pdf file and save to another document library.

This my example code:

string siteUrl = "http://localhost";
using (SPSite spSite = new SPSite(siteUrl))
{
 //Querying for Template.docx
 SPList list = spSite.RootWeb.GetList("http://localhost/Shared%20Documents");
 SPQuery query = new SPQuery();
 query.ViewFields = @"<FieldRef Name='FileLeafRef' />";
 query.Query =
 @"<Where>
<Eq>
<FieldRef Name='FileLeafRef' />
<Value Type='Text'>Template.docx</Value>
</Eq>
</Where>";
 SPListItemCollection collection = list.GetItems(query);
 if (collection.Count != 1)
 {
 Console.WriteLine("Test.docx not found");
 Environment.Exit(0);
 }
 Console.WriteLine("Opening");
 SPFile file = collection[0].File;
 byte[] byteArray = file.OpenBinary();

 using (MemoryStream memStr = new MemoryStream())
 {
 memStr.Write(byteArray, 0, byteArray.Length);
 using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(memStr, true))
 {

 string docText = null;
 using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
 {
 docText = sr.ReadToEnd();
 }
 docText = docText.Replace("$Vender", "Microsoft");
 docText = docText.Replace("$Amount", "1234.56");
 docText = docText.Replace("$Today", DateTime.Today.ToShortDateString());

 using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
 {
 sw.Write(docText);
 }
 }
 Console.WriteLine("Saving");
 string newDocName = "MicrosoftContract.docx";
 file.ParentFolder.Files.Add(newDocName, memStr, true);
 Console.WriteLine("Starting conversion job");
 string wordAutomationServiceName = "Word Automation Services";
 ConversionJob job = new ConversionJob(wordAutomationServiceName);
 job.UserToken = spSite.UserToken;
 job.Settings.UpdateFields = true;
 job.Settings.OutputFormat = SaveFormat.PDF;
 job.AddFile(siteUrl + "/Shared%20Documents/"+newDocName,
 siteUrl + "/Docs/MicrosoftContract.pdf");
 job.Start();
 }
}
目录
相关文章
|
XML Android开发 数据格式
【Android错误集锦】AppBarLayout is overlapping the RecyclerView in one of my xml files.
问题现象:recyclerview 中的顶部数据被appbar遮盖,如下图红框所示 解决方法: 在activity_main.xml里面CoordinatorLayout布局下 即与AppBarLayout布局并列下加上 如下代码 <!--app:layout_beh.
1557 0
|
Web App开发 安全 Java
异常:The absolute uri: http://www.springframework.org/security/tags cannot be resolved in either web.xml or the jar files deployed with this application
The absolute uri: http://www.springframework.org/security/tags cannot be resolved in either web.xml or the jar files deployed with this application   需要添加spring-security-taglibs-3.
1664 0
|
3月前
|
安全 开发工具 Android开发
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
248 0
|
6月前
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
146 0
|
Java 语音技术 开发工具
Android 讯飞离线语音听写/离线语音识别SDK
Android 讯飞离线语音听写/离线语音识别SDK
389 0
Android 讯飞离线语音听写/离线语音识别SDK
|
3月前
|
开发工具 Android开发
Android获取SDK的版本信息
Android获取SDK的版本信息
39 0
|
4月前
|
编解码 Java 开发工具
Android端接入视频生产 Java SDK
Android端接入视频生产 Java SDK
40 1
|
8月前
|
Java 开发工具 Android开发
逻辑清晰,详解社交源码Android开发SDK
前篇我们讲解了有关如何在IOS平台开发集成SDK,那么今天来给大家简单讲解下如何在社交源码Android客户端上开发集成 SDK。
逻辑清晰,详解社交源码Android开发SDK
|
8月前
|
Java 开发工具 Android开发
Android Studio (Android SDK) 配置与使用
Android Studio (Android SDK) 配置与使用
1018 0
|
9月前
|
API 开发工具 Android开发
Android(二) 基于 eclipse 的 Android配置 安装SDK ADT
Android(二) 基于 eclipse 的 Android配置 安装SDK ADT
266 0