视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
.NET中开源文档操作组件DocX的介绍与使用
2020-11-27 22:36:21 责编:小采
文档

前言

相信大家应该都有所体会,在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息。由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量。

在.NET项目中如果用户提出了相关文档操作的需求,开发者较多的会使用到微软自行提供的插件,在一定程度上简化了开发人员的工作量,但是同时也给用户带来了一些困扰,例如需要安装庞大的office,在用户体验性就会降低很多,并且在国内,很多人都还是使用wps,这就导致一部分只安装了wps的使用者很是为难,在对Excel的操作方面,有一个NPOI组件。那么可能会有人问有没有什么办法让这些困扰得到解决,答案是肯定的,那就是今天需要介绍的“DocX”组件,接下来我们就来了解一下这个组件的功能和用法。

一.DocX组件概述:

DocX是一个.NET库,允许开发人员以简单直观的方式处理Word 2007/2010/2013文件。 DocX是快速,轻量级,最好的是它不需要安装Microsoft Word或Office。DocX组件不仅可以完成对文档的一般要求,例如创建文档,创建表格和文本,并且还可以创建图形报表。DocX使创建和操作文档成为一个简单的任务。

它不使用COM库,也不需要安装Microsoft Office。在使用DocX组件时,你需要安装为了使用DocX是.NET框架4.0和Visual Studio 2010或更高版本。

   DocX的主要特点:

     (1).在文档中插入,删除或替换文本。所有标准文本格式都可用。 字体{系列,大小,颜色},粗体,斜体,下划线,删除线,脚本{子,超级},突出显示。

     (2).段落属性显示。方向LeftToRightRightToLeft;缩进;比对。  

     (3).DocX也支持:图片,超链接,表,页眉和页脚,自定义属性。

  有关DocX组件的相关信息就介绍到这里,如果需要更加深入的了解相关信息,可以进入:https://docx.codeplex.com/。

二.DocX相关类和方法解析:

本文将结合DocX的源码进行解析,使用.NET Reflector对DLL文件进行反编译,以此查看源代码。将DLL文件加入.NET Reflector中,点击打开文件。 

1.DocX.Create() :创建文档。

public static DocX Create(Stream stream)
{
 MemoryStream stream2 = new MemoryStream();
 PostCreation(ref Package.Open(stream2, FileMode.Create, FileAccess.ReadWrite));
 DocX cx = Load(stream2);
 cx.stream = stream;
 return cx;
}

2.Paragraph.Append:向段落添加信息。

public Paragraph Append(string text)
{
 List<XElement> content = HelperFunctions.FormatInput(text, null);
 base.Xml.Add(content);
 this.runs = base.Xml.Elements(XName.Get("r", DocX.w.NamespaceName)).Reverse<XElement>().Take<XElement>(content.Count<XElement>()).ToList<XElement>();
 return this;
}

public Paragraph Bold()
{
 this.ApplyTextFormattingProperty(XName.Get("b", DocX.w.NamespaceName), string.Empty, null);
 return this;
}

3.Table.InsertTableAfterSelf:将数据插入表格。

public override Table InsertTableAfterSelf(int rowCount, int coloumnCount)
{
 return base.InsertTableAfterSelf(rowCount, coloumnCount);
}

public virtual Table InsertTableAfterSelf(int rowCount, int coloumnCount)
{
 XElement content = HelperFunctions.CreateTable(rowCount, coloumnCount);
 base.Xml.AddAfterSelf(content);
 return new Table(base.Document, base.Xml.ElementsAfterSelf().First<XElement>());
}

4.CustomProperty:自定义属性。

public class CustomProperty
{
 // Fields
 private string name;
 private string type;
 private object value;

 // Methods
 public CustomProperty(string name, bool value);
 public CustomProperty(string name, DateTime value);
 public CustomProperty(string name, double value);
 public CustomProperty(string name, int value);
 public CustomProperty(string name, string value);
 private CustomProperty(string name, string type, object value);
 internal CustomProperty(string name, string type, string value);

 // Properties
 public string Name { get; }
 internal string Type { get; }
 public object Value { get; }
}

5.BarChart:创建棒形图。

public class BarChart : Chart
{
 // Methods
 public BarChart();
 protected override XElement CreateChartXml();

 // Properties
 public BarDirection BarDirection { get; set; }
 public BarGrouping BarGrouping { get; set; }
 public int GapWidth { get; set; }
}

public abstract class Chart
{
 // Methods
 public Chart();
 public void AddLegend();
 public void AddLegend(ChartLegendPosition position, bool overlay);
 public void AddSeries(Series series);
 protected abstract XElement CreateChartXml();
 public void RemoveLegend();

 // Properties
 public CategoryAxis CategoryAxis { get; private set; }
 protected XElement ChartRootXml { get; private set; }
 protected XElement ChartXml { get; private set; }
 public DisplayBlanksAs DisplayBlanksAs { get; set; }
 public virtual bool IsAxisExist { get; }
 public ChartLegend Legend { get; private set; }
 public virtual short MaxSeriesCount { get; }
 public List<Series> Series { get; }
 public ValueAxis ValueAxis { get; private set; }
 public bool View3D { get; set; }
 public XDocument Xml { get; private set; }
}

6.Chart的AddLegend(),AddSeries(),RemoveLegend()方法解析:

public void AddLegend(ChartLegendPosition position, bool overlay)
{
 if (this.Legend != null)
 {
 this.RemoveLegend();
 }
 this.Legend = new ChartLegend(position, overlay);
 this.ChartRootXml.Add(this.Legend.Xml);
}


public void AddSeries(Series series)
{
 if (this.ChartXml.Elements(XName.Get("ser", DocX.c.NamespaceName)).Count<XElement>() == this.MaxSeriesCount)
 {
 throw new InvalidOperationException("Maximum series for this chart is" + this.MaxSeriesCount.ToString() + "and have exceeded!");
 }
 this.ChartXml.Add(series.Xml);
}

public void RemoveLegend()
{
 this.Legend.Xml.Remove();
 this.Legend = null;
}

以上是对DocX组件的一些方法的一些简单解析,如果需要知道更多的方法实现代码,可自行进行下载查看。

三.DocX功能实现实例:

1.创建图表:

 /// <summary>
 /// 创建棒形图
 /// </summary>
 /// <param name="path">文档路径</param>
 /// <param name="dicValue">绑定数据</param>
 /// <param name="categoryName">类别名称</param>
 /// <param name="valueName">值名称</param>
 /// <param name="title">图标标题</param>
 public static bool BarChart(string path,Dictionary<string, ICollection> dicValue,string categoryName,string valueName,string title)
 {
 if (string.IsNullOrEmpty(path))
 {
 throw new ArgumentNullException(path);
 }
 if (dicValue == null)
 {
 throw new ArgumentNullException("dicValue");
 }
 if (string.IsNullOrEmpty(categoryName))
 {
 throw new ArgumentNullException(categoryName);
 }
 if (string.IsNullOrEmpty(valueName))
 {
 throw new ArgumentNullException(valueName);
 }
 if (string.IsNullOrEmpty(title))
 {
 throw new ArgumentNullException(title);
 }
 try
 {
 using (var document = DocX.Create(path))
 {
 //BarChart图形属性设置,BarDirection图形方向枚举,BarGrouping图形分组枚举
 var c = new BarChart
 {
 BarDirection = BarDirection.Column,
 BarGrouping = BarGrouping.Standard,
 GapWidth = 400
 };
 //设置图表图例位置
 c.AddLegend(ChartLegendPosition.Bottom, false);
 //写入图标数据
 foreach (var chartData in dicValue)
 {
 var series = new Series(chartData.Key);
 series.Bind(chartData.Value, categoryName, valueName);
 c.AddSeries(series);
 } 
 // 设置文档标题
 document.InsertParagraph(title).FontSize(20);
 document.InsertChart(c);
 document.Save();
 return true;
 }

 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }
 }

2.创建一个具有超链接、图像和表的文档。

 /// <summary>
 /// 创建一个具有超链接、图像和表的文档。
 /// </summary>
 /// <param name="path">文档保存路径</param>
 /// <param name="imagePath">加载的图片路径</param>
 /// <param name="url">url地址</param>
 public static void HyperlinksImagesTables(string path,string imagePath,string url)
 {
 if (string.IsNullOrEmpty(path))
 {
 throw new ArgumentNullException(path);
 }
 if (string.IsNullOrEmpty(imagePath))
 {
 throw new ArgumentNullException(imagePath);
 }
 if (string.IsNullOrEmpty(url))
 {
 throw new ArgumentNullException(url);
 }
 try
 {
 using (var document = DocX.Create(path))
 {
 var link = document.AddHyperlink("link", new Uri(url));
 var table = document.AddTable(2, 2);
 table.Design = TableDesign.ColorfulGridAccent2;
 table.Alignment = Alignment.center;
 table.Rows[0].Cells[0].Paragraphs[0].Append("1");
 table.Rows[0].Cells[1].Paragraphs[0].Append("2");
 table.Rows[1].Cells[0].Paragraphs[0].Append("3");
 table.Rows[1].Cells[1].Paragraphs[0].Append("4");
 var newRow = table.InsertRow(table.Rows[1]);
 newRow.ReplaceText("4", "5");
 var image = document.AddImage(imagePath);
 var picture = image.CreatePicture();
 picture.Rotation = 10;
 picture.SetPictureShape(BasicShapes.cube);
 var title = document.InsertParagraph().Append("Test").FontSize(20).Font(new FontFamily("Comic Sans MS"));
 title.Alignment = Alignment.center;
 var p1 = document.InsertParagraph();
 p1.AppendLine("This line contains a ").Append("bold").Bold().Append(" word.");
 p1.AppendLine("Here is a cool ").AppendHyperlink(link).Append(".");
 p1.AppendLine();
 p1.AppendLine("Check out this picture ").AppendPicture(picture).Append(" its funky don't you think?");
 p1.AppendLine();
 p1.AppendLine("Can you check this Table of figures for me?");
 p1.AppendLine();
 p1.InsertTableAfterSelf(table);
 var p2 = document.InsertParagraph();
 p2.AppendLine("Is it correct?");
 document.Save();
 }
 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }
 
 }

3.将指定内容写入文档:

 /// <summary>
 /// 将指定内容写入文档
 /// </summary>
 /// <param name="path">加载文件路径</param>
 /// <param name="content">写入文件内容</param>
 /// <param name="savePath">保存文件路径</param>
 public static void ProgrammaticallyManipulateImbeddedImage(string path, string content, string savePath)
 {
 if (string.IsNullOrEmpty(path))
 {
 throw new ArgumentNullException(path);
 }
 if (string.IsNullOrEmpty(content))
 {
 throw new ArgumentNullException(content);
 }
 if (string.IsNullOrEmpty(savePath))
 {
 throw new ArgumentNullException(savePath);
 }
 try
 {
 using (var document = DocX.Load(path))
 {
 // 确保此文档至少有一个图像。
 if (document.Images.Any())
 {
 var img = document.Images[0];
 // 将内容写入图片.
 var b = new Bitmap(img.GetStream(FileMode.Open, FileAccess.ReadWrite));
 //获取此位图的图形对象,图形对象提供绘图功能。
 var g = Graphics.FromImage(b);
 // 画字符串内容
 g.DrawString
 (
 content,
 new Font("Tahoma", 20),
 Brushes.Blue,
 new PointF(0, 0)
 );
 // 使用创建\写入流将该位图保存到文档中。
 b.Save(img.GetStream(FileMode.Create, FileAccess.Write), ImageFormat.Png);
 }
 else
 {
 document.SaveAs(savePath);
 } 
 }

 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }
 }

总结

下载本文
显示全文
专题