Essential DocIO
.NET库,能够读写Microsoft Word文件。该组件是一个对象模型,同Microsoft Office COM类库相似,它不采用COM interop,以C#编写。如果系统内没有安装Microsoft Word,可以考虑该组件。
创建新的MS Word文档:支持创建包含文本、图片、图表、页面和页脚的MS Word文档。
文档格式化:支持格式化为通用的MS Word 报告。
文档生成基于模板:基于模板生成文档,可以使用MS Word GUI设计文档报告,然后使用DocIO向模板文件内动态填充数据。
文档属性:读写Word文档的属性设置。
转换:支持使用Essential PDF将MS Word文档转换为PDF。
高级特性:支持复制和合并多个MS Word文档为单个文档。
转换HTML到word
public
static
byte
[] ConvertHtmlToDoc(
string
html)
{
var document = new WordDocument();
IWSection section = document.AddSection();
IWParagraph para = section.AddParagraph();
string errorMessage = "" ;
bool valid = section.Body.IsValidXHTML(html, XHTMLValidationType.Strict, out errorMessage);
if ( ! valid)
throw new InvalidCastException(errorMessage + " <hr> " + html) ;
document.XHTMLValidateOption = XHTMLValidationType.Strict;
section.Body.InsertXHTML(html);
var outMem = new MemoryStream();
document.Save(outMem, FormatType.Doc);
outMem.Seek( 0 , SeekOrigin.Begin);
var content = new byte [outMem.Length];
outMem.Read(content, 0 , content.Length);
outMem.Dispose();
document.Close();
return content;
}
{
var document = new WordDocument();
IWSection section = document.AddSection();
IWParagraph para = section.AddParagraph();
string errorMessage = "" ;
bool valid = section.Body.IsValidXHTML(html, XHTMLValidationType.Strict, out errorMessage);
if ( ! valid)
throw new InvalidCastException(errorMessage + " <hr> " + html) ;
document.XHTMLValidateOption = XHTMLValidationType.Strict;
section.Body.InsertXHTML(html);
var outMem = new MemoryStream();
document.Save(outMem, FormatType.Doc);
outMem.Seek( 0 , SeekOrigin.Begin);
var content = new byte [outMem.Length];
outMem.Read(content, 0 , content.Length);
outMem.Dispose();
document.Close();
return content;
}
生成Word的时候替换指定的文字
///
<summary>
/// 生成Word的时候替换指定的文字
/// </summary>
/// <param name="templatePath"></param>
/// <param name="FileName"></param>
/// <param name="replaysDictionary"></param>
public static void ReplaceDocContent( string templateFileName, string newFileName,
Dictionary < string , string > replaysDictionary)
{
IWordDocument document = new WordDocument();
document.Open(templateFileName, FormatType.Doc);
foreach (var rd in replaysDictionary)
{
if ( string .IsNullOrEmpty(document.GetText())) continue ;
document.Replace(rd.Key, rd.Value, false , false );
while (document.GetText().IndexOf(rd.Key) != - 1 )
document.Replace(rd.Key, rd.Value, false , false );
}
document.Save(newFileName, FormatType.Doc);
}
/// 生成Word的时候替换指定的文字
/// </summary>
/// <param name="templatePath"></param>
/// <param name="FileName"></param>
/// <param name="replaysDictionary"></param>
public static void ReplaceDocContent( string templateFileName, string newFileName,
Dictionary < string , string > replaysDictionary)
{
IWordDocument document = new WordDocument();
document.Open(templateFileName, FormatType.Doc);
foreach (var rd in replaysDictionary)
{
if ( string .IsNullOrEmpty(document.GetText())) continue ;
document.Replace(rd.Key, rd.Value, false , false );
while (document.GetText().IndexOf(rd.Key) != - 1 )
document.Replace(rd.Key, rd.Value, false , false );
}
document.Save(newFileName, FormatType.Doc);
}
给文档加密码保护
public
static
Stream SetDocProtect(
byte
[] docContent,
string
key)
{
var mem = new MemoryStream(docContent);
mem.Seek( 0 , SeekOrigin.Begin);
IWordDocument document = new WordDocument(mem, FormatType.Automatic);
document.Protect(ProtectionType.AllowOnlyFormFields, key);
var outMem = new MemoryStream();
document.Save(outMem, FormatType.Doc);
outMem.Seek( 0 , SeekOrigin.Begin);
return outMem;
}
{
var mem = new MemoryStream(docContent);
mem.Seek( 0 , SeekOrigin.Begin);
IWordDocument document = new WordDocument(mem, FormatType.Automatic);
document.Protect(ProtectionType.AllowOnlyFormFields, key);
var outMem = new MemoryStream();
document.Save(outMem, FormatType.Doc);
outMem.Seek( 0 , SeekOrigin.Begin);
return outMem;
}
在书签位置创建一个表格
public
static
IWTable ReplaceTable(WordDocument document,
string
bookmarkName, DataTable data,
string
mergeColName , List
<
List
<
string
>>
mutilTableCaption)
{
if (document == null ) throw new ArgumentNullException( " document " );
if (bookmarkName == null ) throw new ArgumentNullException( " bookmarkName " );
if (data == null ) throw new ArgumentNullException( " data " );
if (data.Columns.Count < 1 ) throw new ArgumentNullException( " data " );
int captionCount = mutilTableCaption != null && mutilTableCaption.Count > 0 ? mutilTableCaption.Count : 1 ;
WTable table = new WTable(document, true );
table.ResetCells(data.Rows.Count + captionCount, data.Columns.Count);
for (var colCount = 0 ; colCount < captionCount; colCount ++ )
{
for (var col = 0 ; col < data.Columns.Count; col ++ )
{
var paragraph = table.Rows[colCount].Cells[col].AddParagraph();
var caption = data.Columns[col].ColumnName;
if (mutilTableCaption != null && mutilTableCaption.Count > 0 )
caption = mutilTableCaption[colCount][col];
var text = paragraph.AppendText(caption);
paragraph.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Center;
text.CharacterFormat.FontName = " 宋体 " ;
text.CharacterFormat.Bold = false ;
text.CharacterFormat.FontSize = 10.5f ;
}
}
for (var row = captionCount; row <= data.Rows.Count; row ++ )
for (var col = 0 ; col < data.Columns.Count; col ++ )
{
var paragraph = table.Rows[row].Cells[col].AddParagraph();
var text = paragraph.AppendText(data.Rows[row - captionCount][col] + "" );
text.CharacterFormat.FontName = " 宋体 " ;
text.CharacterFormat.FontSize = 9f;
double val = 0 ;
if ( double .TryParse(text.Text, out val))
{
text.Text = Math.Round(val, 2 ) + "" ;
// align right
paragraph.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Right;
table.Rows[row].Cells[col].CellFormat.VerticalAlignment = VerticalAlignment.Middle;
table.Rows[row].Cells[col].CellFormat.TextWrap = false ;
}
}
// 合并单元格,向下合并
if ( ! string .IsNullOrEmpty(mergeColName))
for (var row = captionCount; row < table.Rows.Count; row ++ )
{
var cell = table.Rows[row].Cells[data.Columns[mergeColName].Ordinal];
cell.CellFormat.VerticalMerge = CellMerge.Start;
var text = data.Rows[row - captionCount][mergeColName] + "" ;
if (row > captionCount)
{
var priorCell = table.Rows[row - captionCount].Cells[data.Columns[mergeColName].Ordinal];
var findText = data.Rows[row - captionCount - 1 ][mergeColName] + "" ;
if (text.Equals(findText))
cell.CellFormat.VerticalMerge = CellMerge.Continue;
}
}
BookmarksNavigator bk = new BookmarksNavigator(document);
bk.MoveToBookmark(bookmarkName);
TextBodyPart body = bk.GetBookmarkContent();
bk.DeleteBookmarkContent( true );
bk.InsertTable(table);
return table;
}
{
if (document == null ) throw new ArgumentNullException( " document " );
if (bookmarkName == null ) throw new ArgumentNullException( " bookmarkName " );
if (data == null ) throw new ArgumentNullException( " data " );
if (data.Columns.Count < 1 ) throw new ArgumentNullException( " data " );
int captionCount = mutilTableCaption != null && mutilTableCaption.Count > 0 ? mutilTableCaption.Count : 1 ;
WTable table = new WTable(document, true );
table.ResetCells(data.Rows.Count + captionCount, data.Columns.Count);
for (var colCount = 0 ; colCount < captionCount; colCount ++ )
{
for (var col = 0 ; col < data.Columns.Count; col ++ )
{
var paragraph = table.Rows[colCount].Cells[col].AddParagraph();
var caption = data.Columns[col].ColumnName;
if (mutilTableCaption != null && mutilTableCaption.Count > 0 )
caption = mutilTableCaption[colCount][col];
var text = paragraph.AppendText(caption);
paragraph.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Center;
text.CharacterFormat.FontName = " 宋体 " ;
text.CharacterFormat.Bold = false ;
text.CharacterFormat.FontSize = 10.5f ;
}
}
for (var row = captionCount; row <= data.Rows.Count; row ++ )
for (var col = 0 ; col < data.Columns.Count; col ++ )
{
var paragraph = table.Rows[row].Cells[col].AddParagraph();
var text = paragraph.AppendText(data.Rows[row - captionCount][col] + "" );
text.CharacterFormat.FontName = " 宋体 " ;
text.CharacterFormat.FontSize = 9f;
double val = 0 ;
if ( double .TryParse(text.Text, out val))
{
text.Text = Math.Round(val, 2 ) + "" ;
// align right
paragraph.ParagraphFormat.HorizontalAlignment = Syncfusion.DocIO.DLS.HorizontalAlignment.Right;
table.Rows[row].Cells[col].CellFormat.VerticalAlignment = VerticalAlignment.Middle;
table.Rows[row].Cells[col].CellFormat.TextWrap = false ;
}
}
// 合并单元格,向下合并
if ( ! string .IsNullOrEmpty(mergeColName))
for (var row = captionCount; row < table.Rows.Count; row ++ )
{
var cell = table.Rows[row].Cells[data.Columns[mergeColName].Ordinal];
cell.CellFormat.VerticalMerge = CellMerge.Start;
var text = data.Rows[row - captionCount][mergeColName] + "" ;
if (row > captionCount)
{
var priorCell = table.Rows[row - captionCount].Cells[data.Columns[mergeColName].Ordinal];
var findText = data.Rows[row - captionCount - 1 ][mergeColName] + "" ;
if (text.Equals(findText))
cell.CellFormat.VerticalMerge = CellMerge.Continue;
}
}
BookmarksNavigator bk = new BookmarksNavigator(document);
bk.MoveToBookmark(bookmarkName);
TextBodyPart body = bk.GetBookmarkContent();
bk.DeleteBookmarkContent( true );
bk.InsertTable(table);
return table;
}