经常使用C#开发,总会接触到对Word文档的编辑操作,排除开.Net自带的Office操作组件不说,之所以不说是由于其运行时需要Word环境,且其资料相较比较完善,需要了解的看客可以自行去百度或阅读MSDN。 本文过程中产出的Demo代码,会放在CSDN与Git上。 CSDN中Demo路径为:https://download.csdn.net/download/a13407142317/12176058 其中VS版本为VS2019(使用改版本是要跟上.Net的更新步幅) 使用环境如下:emmm…也就是使用【.Net Framework 4】(之所以为这个是因为专业领域导致的研究支撑环境,望各位见谅) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220152955589.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
一、本段介绍的时C#中三种操作Word文档的开源组件
1.Docx
其官网网站为:[http://docx.codeplex.com/](http://docx.codeplex.com/)
git访问地址为:[https://github.com/xceedsoftware/DocX](https://github.com/xceedsoftware/DocX)
作者存放CSDN地址:
2.Aspose.Words
其网站地址为:[https://www.evget.com/product/564/update?uid=12720](https://www.evget.com/product/564/update?uid=12720)
作者存放CSDN地址:
3.NPOI
是的NPOI也可以导出Word
我将尽我所知道的从以下几点来比对和使用上述两种Word开源组件 1.介绍以及功能实现(本篇文章) 2.两者能支持的异同点 3.两者操作Word文档的效率 4.两者存在什么缺陷 其次在以上的基础上使用桥接模式封装出统一的操作对象。 最后共享自我实现一个输出Word的代码组织,欢迎大家斧正。
介绍以及功能实现。
一下为准备好的Demo代码,组织结构如下,前文中已经附上了资源连接,有需要的看客老爷可以下载
1.DocX的介绍以及功能实现
1.1. 简介
DocX是一个在不需要安装word的情况下对word进行操作的开源轻量级.net组件,是由爱尔兰的一个叫Cathal Coffey的博士生开发出来的。DocX使得操作word非常轻便,有利于减轻开发负担,提升程序效率。DocX在Codeplex和Github上都有开源。
1.2.安装与获取途径
http://docx.codeplex.com/releases下载获取 NUGET获取 在vs环境下,打开包管理控制台执行 Install-Package DocX【本文采用此方法】 https://github.com/WordDocX/DocX
1.3功能实现
1.3.1创建Word文档以及在Word文档中输入字符串信息
创建Docx文件
///
/// 创建Docx
///
/// 文件路径
///
public static bool CreateFile(string strFilePath)
{
try
{
DocX document = DocX.Create(strFilePath);
document.Save();
return true;
}
catch (Exception ex)
{
return false;
}
}
效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220162539596.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
创建文件并向其中输入信息
///
/// 创建文档并填充字符串信息
///
/// 文件路径
/// 字符串填充信息
///
public static bool CreateFileAndFillStringInfo(string strFilePath, string strFillInfo)
{
try
{
DocX document = DocX.Create(strFilePath);
Paragraph p = document.InsertParagraph();
p.Append(strFillInfo);
document.Save();
return true;
}
catch (Exception ex)
{
return false;
}
}
效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220163702620.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
1.3.2打开Word文档并对Word文档并进行编辑
///
/// 打开文件并填充信息
///
///
///
private void btnOpenFileAndFillInfo_Click(object sender, EventArgs e)
{
Docx_WordHelper pDocx_WordHelper = new Docx_WordHelper(ModleFilePath);
pDocx_WordHelper.AddStringInfo(FillInfo);
pDocx_WordHelper.SaveAs(DocxFileOutputPath);
}
-------------------------------------------------------------------
public Docx_WordHelper(string strFilePath)
{
CurrentDocument = DocX.Load(strFilePath);
}
public void AddStringInfo(string strInfo)
{
Paragraph p = CurrentDocument.InsertParagraph();
p.Append(strInfo);
}
///
/// 另存文件
///
///
///
public bool SaveAs(string strFilePath)
{
try
{
CurrentDocument.SaveAs(strFilePath);
return true;
}
catch (Exception ex)
{
return false;
}
}
效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220171042768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
1.3.2.1替换字符串
替换字符有很多重载函数,自行挖掘,此处就不一一列举了。
///
/// 替换字符
///
///
///
private void btnReplaceText_Click(object sender, EventArgs e)
{
CurrentDocx_WordHelper.ReplaceText("[Name]", "落霞与孤鹜齐飞,秋水共长天一色");
}
-----------------------------------------------------------------
#region 替换字符信息
public void ReplaceText(string strOldInfo, string strNewInfo)
{
CurrentDocument.ReplaceText(strOldInfo, strNewInfo);
}
#endregion
效果如下: 1.模板文件 替换后效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220174232771.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
1.3.2.2指定位置插入各类信息
字符串 在指定位置插入字符串信息,建议最好的方法便是替换字符串,一方便、二便是能够保留替换前字符串的样式。以下中通过width=0,使用最合适的宽度并同比例缩小高度。添加图片
private void btnAddImageByLocation_Click(object sender, EventArgs e)
{
CurrentDocx_WordHelper.FindLocationByText("[NameImage]");
CurrentDocx_WordHelper.AddImage(GoChinaFilePath);
CurrentDocx_WordHelper.ReplaceText("[NameImage]","");
}
-----------------------------------------------------------------------
///
/// 通过字符串定位
///
///
public void FindLocationByText(string strInfo)
{
CurrentParagraph = CurrentDocument.Paragraphs.First(a => a.Text == strInfo);
}
///
/// 添加图片
///
///
public void AddImage(string strImageFilePath, int Width = 0, int Height = 0)
{
Image img = CurrentDocument.AddImage(strImageFilePath);
Picture pic = img.CreatePicture();
if (Width != 0)
{
pic.Width = Width;
pic.Height = Height;
}
else
{
int dWidth = Convert.ToInt32(CurrentDocument.PageWidth - 250);
int dHeigth = Convert.ToInt32(pic.Height * dWidth / pic.Width);
pic.Width = dWidth;
pic.Height = dHeigth;
}
Paragraph p1 = CurrentParagraph.InsertPicture(pic);
}
效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220205858632.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
表与图标
private void btnAddTableByLocation_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn();
dc1.ColumnName = "字段一";
dt.Columns.Add(dc1);
DataColumn dc2 = new DataColumn();
dc2.ColumnName = "字段二";
dt.Columns.Add(dc2);
DataColumn dc3 = new DataColumn();
dc3.ColumnName = "字段三";
dt.Columns.Add(dc3);
for (int i = 0; i
dr[j] = j;
}
dt.Rows.Add(dr);
}
CurrentDocx_WordHelper.FindLocationByText("[FillTable]");
CurrentDocx_WordHelper.AddTable(dt);
CurrentDocx_WordHelper.ReplaceText("[FillTable]", "");
}
--------------------------------------------------------------------------------------------
///
/// 插入表
///
///
public void AddTable(DataTable dt)
{
Table table=CurrentParagraph.InsertTableAfterSelf(dt.Rows.Count + 1, dt.Columns.Count);
table.Design = TableDesign.ColorfulGridAccent2;
table.Alignment = Alignment.center;
for (int i = 0; i
for (int i = 0; i
public class AsposeWord_WordHelper
{
private Document CurrentDocument = null;
private DocumentBuilder CurrentDocumentBuilder = null;
///
/// 当前文档文件路径
///
public string CurrentStringFilePath
{
get;
private set;
}
public AsposeWord_WordHelper()
{
}
public AsposeWord_WordHelper(string strFilePath)
{
OpenFile(strFilePath);
}
///
/// 创建文件
///
///
///
public bool CreateFile(string strFilePath)
{
try
{
OpenFile(strFilePath);
return true;
}
catch (Exception ex)
{
return false;
}
}
///
/// 打开文件
///
///
public void OpenFile(string strFilePath)
{
CurrentStringFilePath = strFilePath;
CurrentDocument = new Document(strFilePath);
CurrentDocumentBuilder = new DocumentBuilder(CurrentDocument);
}
public void Save()
{
CurrentDocument.Save(CurrentStringFilePath);
}
public void SaveAs(string strFilePath)
{
CurrentDocument.Save(strFilePath);
}
#region 替换字符信息
public void ReplaceText(string strOldInfo, string strNewInfo)
{
CurrentDocument.Range.Replace(strOldInfo, strNewInfo, new FindReplaceOptions());
}
#endregion
#region 指定位置添加信息
///
/// 通过字符串定位
///
///
public void FindLocationByText(string strInfo)
{
CurrentDocumentBuilder.MoveToBookmark(strInfo);
}
///
/// 添加描述信息
///
///
public void AddString(string strInfo)
{
CurrentDocumentBuilder.Font.Size = 18;
CurrentDocumentBuilder.Font.Name = "宋体";
CurrentDocumentBuilder.Bold = true;
CurrentDocumentBuilder.Writeln(strInfo);
}
///
/// 通过书签添加字符串信息
///
///
///
public void AddStringByBookMark(string strBookmarkName, string strInfo)
{
CurrentDocumentBuilder.MoveToBookmark(strInfo);
CurrentDocumentBuilder.Font.Size = 18;
CurrentDocumentBuilder.Font.Name = "宋体";
CurrentDocumentBuilder.Bold = true;
CurrentDocumentBuilder.Writeln(strInfo);
}
///
/// 添加图片
///
///
public void AddImage(string strImageFilePath, int Width = 0, int Height = 0)
{
CurrentDocumentBuilder.InsertImage(strImageFilePath);
}
///
/// 通过书签添加图片
///
///
///
public void AddImageByBookMark(string strBookmarkName, string strImageFilePath, int Width = 0, int Height = 0)
{
CurrentDocumentBuilder.MoveToBookmark(strBookmarkName);
CurrentDocumentBuilder.InsertImage(strImageFilePath);
}
///
/// 添加超链接
///
///
public void AddLink(string strLinkAddress, string strLinkName)
{
CurrentDocumentBuilder.InsertHyperlink(strLinkAddress, strLinkName, false);
}
///
/// 通过书签添加超链接
///
///
///
public void AddLinkByBookMark(string strBookmarkName, string strLinkName, string strLinkAddress)
{
CurrentDocumentBuilder.MoveToBookmark(strBookmarkName);
CurrentDocumentBuilder.InsertHyperlink(strLinkAddress, strLinkName, false);
}
///
/// 插入表
///
///
public void AddTable(DataTable dt)
{
int RowIndex = 1;
CurrentDocumentBuilder.StartTable();
RowFormat rowf = CurrentDocumentBuilder.RowFormat;
rowf.Height = 40;
//设置单元格是否水平合并,None为不合并
CurrentDocumentBuilder.CellFormat.HorizontalMerge = CellMerge.None;
//设置单元格是否垂直合并,None为不合并
CurrentDocumentBuilder.CellFormat.VerticalMerge = CellMerge.None;
//设置单元格宽
CurrentDocumentBuilder.CellFormat.Width = 80;
//单元格垂直对齐方向
CurrentDocumentBuilder.CellFormat.VerticalAlignment = CellVerticalAlignment.Center;
//单元格水平对齐方向
CurrentDocumentBuilder.ParagraphFormat.Alignment = ParagraphAlignment.Center;
//单元格内文字设为多行(默认为单行,会影响单元格宽)
//单元格内添加文字
CurrentDocumentBuilder.CellFormat.FitText = true;
foreach (DataColumn dc in dt.Columns)
{
//插入一个单元格
CurrentDocumentBuilder.InsertCell();
CurrentDocumentBuilder.Write(dc.ColumnName);
}
CurrentDocumentBuilder.EndRow();
for (int i = 0; i
//插入一个单元格
CurrentDocumentBuilder.InsertCell();
CurrentDocumentBuilder.Write(dr[dc].ToString());
}
CurrentDocumentBuilder.EndRow(); //添加一行
}
CurrentDocumentBuilder.EndTable();
}
#endregion
}
}
Aspose的许可会发生什么问题,问题如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200220223521683.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMzQwNzE0MjMxNw==,size_16,color_FFFFFF,t_70)
至此本片文章结束 psCSDN的代码粘贴不能有空行,不然会出现bug
|