.Net Api用于使用图表创建Word文档

时间:2018-09-20 14:36:02

标签: c# .net ms-word

您知道有没有很好的库来创建Word文档(非Excel表格),包括图表。 到目前为止,我已经尝试过:

  1. DocX->正在运行,但没有足够的选项来修改图形
  2. NPOI->无法使其正常工作。打开带有图表的docx时引发错误。
  3. NetOffice->无法创建图形。

此外,一个很好的链接到一个很好的文档示例将不胜感激。

我想拥有一个不错的库,它不像OOXML Api那样复杂。 而且它应该是免费的。 Office已安装在运行的计算机上。

感谢克里斯

2 个答案:

答案 0 :(得分:0)

您看过OpenXML吗?

这里是带有示例的链接,以用单词https://code.msdn.microsoft.com/office/How-to-create-Chart-into-a7d424f6

创建图表

答案 1 :(得分:0)

到目前为止,我还没有找到更好的图书馆。因此,我将继续使用DocX。正如Magnetron所说,您可以修改后面的XML。因此,您可以对图表进行所需的操作,读取XML并按照自己的方式进行修改。 例如,我发布了一种使用DocX更改Word Chart上的Axis标题的方法。 XML区域是所需的词xml。使用代码,您可以创建此xml。

public void SetYTitle(string v)
    {
        #region xml
        //  <c:valAx>
        //      <c:axId val="82091008"/>
        //      <c:scaling>
        //          <c:orientation val="minMax"/>
        //          <c:max val="90"/>
        //          <c:min val="65"/>
        //      </c:scaling>
        //      <c:delete val="0"/>
        //      <c:axPos val="l"/>
        //      <c:majorGridlines/>
        //      <c:title>
        //          <c:tx>
        //              <c:rich>
        //                  <a:bodyPr rot="-5400000" vert="horz"/>
        //                  <a:lstStyle/>
        //                  <a:p>
        //                      <a:pPr>
        //                          <a:defRPr/>
        //                      </a:pPr>
        //                      <a:r>
        //                          <a:rPr lang="de-DE"/>
        //                          <a:t>title y</a:t>
        //                      </a:r>
        //                  </a:p>
        //              </c:rich>
        //          </c:tx>
        //          <c:layout/>
        //          <c:overlay val="0"/>
        //      </c:title>
        #endregion
        XNamespace nsC = "http://schemas.openxmlformats.org/drawingml/2006/chart";
        XNamespace nsA = "http://schemas.openxmlformats.org/drawingml/2006/main";
        var existent = ResChart.Xml.Descendants().Where(s => s.Name.LocalName.Equals("valAx")).FirstOrDefault();
        if (existent != null)
        {
            var title = new XElement(nsC + "title");
            var tx = new XElement(nsC + "tx");
            var rich = new XElement(nsC + "rich");
            var bodyPr = new XElement(nsA + "bodyPr");
            bodyPr.SetAttributeValue(XName.Get("rot"), "-5400000");
            bodyPr.SetAttributeValue(XName.Get("vert"), "horz");
            var lstStyle = new XElement(nsA + "lstStyle");
            var p = new XElement(nsA + "p");
            var pPr = new XElement(nsA + "pPr");
            var defRPr = new XElement(nsA + "defRPr");
            var r = new XElement(nsA + "r");
            var rPr = new XElement(nsA + "rPr");
            rPr.SetAttributeValue(XName.Get("lang"), "de-DE");
            var t = new XElement(nsA + "t");
            t.SetValue(v);
            var layout = new XElement(nsC + "layout");
            var overlay = new XElement(nsC + "overlay");
            overlay.SetAttributeValue(XName.Get("val"), "0");

            //build tree
            title.Add(tx);
            tx.Add(rich);
            rich.Add(bodyPr);
            rich.Add(lstStyle);
            rich.Add(p);
            p.Add(pPr);
            pPr.Add(defRPr);
            p.Add(r);
            r.Add(rPr);
            r.Add(t);
            title.Add(layout);
            title.Add(overlay);

            existent.Add(title);
        }
        else
        {
            logger.Warn("no axis def existent.");
        }
    }

所以我基本上是在使用OOXML来完成我想要的事情。无论如何,我认为设置轴标题的开销太大。