狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

一款開源免費(fèi)的.NET文檔操作組件DocX(.NET組件介紹之一)

admin
2023年12月30日 9:41 本文熱度 1090

    在目前的軟件項(xiàng)目中,都會(huì)較多的使用到對(duì)文檔的操作,用于記錄和統(tǒng)計(jì)相關(guān)業(yè)務(wù)信息。由于系統(tǒng)自身提供了對(duì)文檔的相關(guān)操作,所以在一定程度上極大的簡化了軟件使用者的工作量。

    在.NET項(xiàng)目中如果用戶提出了相關(guān)文檔操作的需求,開發(fā)者較多的會(huì)使用到微軟自行提供的插件,在一定程度上簡化了開發(fā)人員的工作量,但是同時(shí)也給用戶帶來了一些困擾,例如需要安裝龐大的office,在用戶體驗(yàn)性就會(huì)降低很多,并且在國內(nèi),很多人都還是使用wps,這就導(dǎo)致一部分只安裝了wps的使用者很是為難,在對(duì)Excel的操作方面,有一個(gè)NPOI組件。那么可能會(huì)有人問有沒有什么辦法讓這些困擾得到解決,答案是肯定的,那就是今天需要介紹的“DocX”組件,接下來我們就來了解一下這個(gè)組件的功能和用法。

一.DocX組件概述:

   DocX是一個(gè).NET庫,允許開發(fā)人員以簡單直觀的方式處理Word 2007/2010/2013文件。 DocX是快速,輕量級(jí),最好的是它不需要安裝Microsoft Word或Office。DocX組件不僅可以完成對(duì)文檔的一般要求,例如創(chuàng)建文檔,創(chuàng)建表格和文本,并且還可以創(chuàng)建圖形報(bào)表。DocX使創(chuàng)建和操作文檔成為一個(gè)簡單的任務(wù)。

   它不使用COM庫,也不需要安裝Microsoft Office。在使用DocX組件時(shí),你需要安裝為了使用DocX是.NET框架4.0和Visual Studio 2010或更高版本。

   DocX的主要特點(diǎn): 

     (1).在文檔中插入,刪除或替換文本。所有標(biāo)準(zhǔn)文本格式都可用。 字體{系列,大小,顏色},粗體,斜體,下劃線,刪除線,腳本{子,超級(jí)},突出顯示。

     (2).段落屬性顯示。方向LeftToRight或RightToLeft;縮進(jìn);比對(duì)。   

     (3).DocX也支持:圖片,超鏈接,表,頁眉和頁腳,自定義屬性。

  有關(guān)DocX組件的相關(guān)信息就介紹到這里,如果需要更加深入的了解相關(guān)信息,可以進(jìn)入:https://docx.codeplex.com/。

二.DocX相關(guān)類和方法解析:

    本文將結(jié)合DocX的源碼進(jìn)行解析,使用.NET Reflector對(duì)DLL文件進(jìn)行反編譯,以此查看源代碼。將DLL文件加入.NET Reflector中,點(diǎn)擊打開文件。  

 1.DocX.Create():創(chuàng)建文檔。

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:將數(shù)據(jù)插入表格。

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:創(chuàng)建棒形圖。

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;
}

   以上是對(duì)DocX組件的一些方法的一些簡單解析,如果需要知道更多的方法實(shí)現(xiàn)代碼,可自行進(jìn)行下載查看。

三.DocX功能實(shí)現(xiàn)實(shí)例:

  1.創(chuàng)建圖表:

        /// <summary>
        /// 創(chuàng)建棒形圖
        /// </summary>
        /// <param name="path">文檔路徑</param>
        /// <param name="dicValue">綁定數(shù)據(jù)</param>
        /// <param name="categoryName">類別名稱</param>
        /// <param name="valueName">值名稱</param>
        /// <param name="title">圖標(biāo)標(biāo)題</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圖形屬性設(shè)置,BarDirection圖形方向枚舉,BarGrouping圖形分組枚舉
                    var c = new BarChart
                    {
                        BarDirection = BarDirection.Column,
                        BarGrouping = BarGrouping.Standard,
                        GapWidth = 400
                    };
                    //設(shè)置圖表圖例位置
                    c.AddLegend(ChartLegendPosition.Bottom, false);
                    //寫入圖標(biāo)數(shù)據(jù)
                    foreach (var chartData in dicValue)
                    {
                        var series = new Series(chartData.Key);
                        series.Bind(chartData.Value, categoryName, valueName);
                        c.AddSeries(series);
                    }                  
                    // 設(shè)置文檔標(biāo)題
                    document.InsertParagraph(title).FontSize(20);
                    document.InsertChart(c);
                    document.Save();
                    return true;
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

 2.創(chuàng)建一個(gè)具有超鏈接、圖像和表的文檔。

        /// <summary>
        /// 創(chuàng)建一個(gè)具有超鏈接、圖像和表的文檔。
        /// </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.將指定內(nèi)容寫入文檔:

        /// <summary>
        /// 將指定內(nèi)容寫入文檔
        /// </summary>
        /// <param name="path">加載文件路徑</param>
        /// <param name="content">寫入文件內(nèi)容</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))
                {
                    // 確保此文檔至少有一個(gè)圖像。
                    if (document.Images.Any())
                    {
                        var img = document.Images[0];
                        // 將內(nèi)容寫入圖片.
                        var b = new Bitmap(img.GetStream(FileMode.Open, FileAccess.ReadWrite));
                        //獲取此位圖的圖形對(duì)象,圖形對(duì)象提供繪圖功能。
                        var g = Graphics.FromImage(b);
                        // 畫字符串內(nèi)容                        g.DrawString
                            (
                                content,
                                new Font("Tahoma", 20),
                                Brushes.Blue,
                                new PointF(0, 0)
                            );
                        // 使用創(chuàng)建\寫入流將該位圖保存到文檔中。                        b.Save(img.GetStream(FileMode.Create, FileAccess.Write), ImageFormat.Png);
                    }
                    else
                    {
                        document.SaveAs(savePath);
                    }  
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

四.總結(jié):

    以上是對(duì)DocX組件的API做了一個(gè)簡單的解析,并且附上一些創(chuàng)建文檔和創(chuàng)建圖表的方法供開發(fā)者參考。

 

.NET組件介紹系列:

    一款開源免費(fèi)的.NET文檔操作組件DocX(.NET組件介紹之一)http://www.cnblogs.com/pengze0902/p/6122311.html

    高效而穩(wěn)定的企業(yè)級(jí).NET Office 組件Spire(.NET組件介紹之二)http://www.cnblogs.com/pengze0902/p/6125570.html

    最好的.NET開源免費(fèi)ZIP庫DotNetZip(.NET組件介紹之三)http://www.cnblogs.com/pengze0902/p/6124659.html

    免費(fèi)開源的DotNet二維碼操作組件ThoughtWorks.QRCode(.NET組件介紹之四)http://www.cnblogs.com/pengze0902/p/6134506.html

    免費(fèi)開源的DotNet任務(wù)調(diào)度組件Quartz.NET(.NET組件介紹之五)http://www.cnblogs.com/pengze0902/p/6128558.html

    免費(fèi)高效實(shí)用的Excel操作組件NPOI(.NET組件介紹之六)http://www.cnblogs.com/pengze0902/p/6150070.html


該文章在 2023/12/31 17:06:54 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved