首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Open xml或EPPLUS为excel图表添加文本标签

问如何使用Open xml或EPPLUS为excel图表添加文本标签
EN

Stack Overflow用户
提问于 2016-05-19 00:07:52
回答 3查看 3.8K关注 0票数 1

我对C#中的Excel自动化完全陌生

实际上,我遇到了一些用于在C# .net中生成Excel的应用程序接口,如vincent的CLOSED XML、EEPLUS和spreadsheetlight,微软的Open XML,微软的Interop excel

根据我的研究

关闭的XML --不支持图表

EEPLUS -支持的图表

传播光线-非常易于使用,并且还支持图表

开放XML-复杂难用

我完全可以使用散射光是很好的API,但我不能找到如何在图表中添加标签的解决方案

我希望堆栈溢出中的任何人都遇到了同样的问题。

我需要在图表内添加标签,如文本,例如图表中的公司。

请让我知道如何找到解决方案任何一个这个免费的API

​

​

谢谢

兰吉斯

EN

回答 3

Stack Overflow用户

发布于 2016-05-20 05:01:25

你可以通过Epplus添加at title,但定位需要XML编辑:

代码语言:javascript
复制
    [TestMethod]
    public void Chart_Manual_Title_Test()
    {
        //http://stackoverflow.com/questions/37304860/how-to-add-to-text-label-for-excel-charts-using-open-xml-or-epplus
        //Throw in some data
        var datatable = new DataTable("tblData");
        datatable.Columns.AddRange(new[] { new DataColumn("Col1", typeof(int)), new DataColumn("Col2", typeof(int)), new DataColumn("Col3", typeof(object)) });

        for (var i = 0; i < 10; i++)
        {
            var row = datatable.NewRow();
            row[0] = i;
            row[1] = i * 10;
            row[2] = Path.GetRandomFileName();
            datatable.Rows.Add(row);
        }

        //Create a test file    
        var fileInfo = new FileInfo(@"c:\temp\Chart_Manual_Title_Test.xlsx");
        if (fileInfo.Exists)
            fileInfo.Delete();

        using (var pck = new ExcelPackage(fileInfo))
        {
            var workbook = pck.Workbook;
            var worksheet = workbook.Worksheets.Add("Sheet1");
            worksheet.Cells.LoadFromDataTable(datatable, true);

            var chart = worksheet.Drawings.AddChart("chart test", eChartType.XYScatter);
            var series = chart.Series.Add(worksheet.Cells["B2:B11"], worksheet.Cells["A2:A11"]);

            chart.Title.Text = "XYZ Corp";

            //Add custom layout
            var chartXml = chart.ChartXml;
            var nsm = new XmlNamespaceManager(chartXml.NameTable);

            var nsuri = chartXml.DocumentElement.NamespaceURI;
            nsm.AddNamespace("c", nsuri);
            nsm.AddNamespace("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

            //Set the title overlay
            var overlayNode = chartXml.SelectSingleNode("c:chartSpace/c:chart/c:title/c:overlay", nsm);
            overlayNode.Attributes["val"].Value = "1";

            //Set the font size
            var defRPrNode = chartXml.SelectSingleNode("c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:pPr/a:defRPr", nsm);
            defRPrNode.Attributes["sz"].Value = "1200";

            //Get the title layout and add the manual section
            var layoutNode = chartXml.SelectSingleNode("c:chartSpace/c:chart/c:title/c:layout", nsm);
            var manualLayoutNode = chartXml.CreateElement("c:manualLayout", nsuri);
            layoutNode.AppendChild(manualLayoutNode);

            //Add coordinates
            var xModeNode = chartXml.CreateElement("c:xMode", nsuri);
            var attrib = chartXml.CreateAttribute("val");
            attrib.Value = "edge";
            xModeNode.Attributes.Append(attrib);
            manualLayoutNode.AppendChild(xModeNode);

            var yModeNode = chartXml.CreateElement("c:yMode", nsuri);
            attrib = chartXml.CreateAttribute("val");
            attrib.Value = "edge";
            yModeNode.Attributes.Append(attrib);
            manualLayoutNode.AppendChild(yModeNode);

            var xNode = chartXml.CreateElement("c:x", nsuri);
            attrib = chartXml.CreateAttribute("val");
            attrib.Value = "0.9";
            xNode.Attributes.Append(attrib);
            manualLayoutNode.AppendChild(xNode);

            var yNode = chartXml.CreateElement("c:y", nsuri);
            attrib = chartXml.CreateAttribute("val");
            attrib.Value = "0.95";
            yNode.Attributes.Append(attrib);
            manualLayoutNode.AppendChild(yNode);

            pck.Save();
        }
    }

这将在输出中给出以下内容:

​

​

回复评论

好吧,那就有点难了。正确的方法是使用relSizeAnchor,它可以放置在图表中,并随其移动/调整大小。但这将不得不从头开始(或者最多从另一个库开始)。如果您在excel中激活一个图表并执行“插入”>“文本框”以查看其外观。

另一种选择是通过使用一个未使用的标题来伪造它,比如Axis标题,然后移动它,就像我做图表标题一样。

但最简单的选择是简单地添加一个形状。回调是,如果您移动图表,它将不会随之移动:

代码语言:javascript
复制
var tb1 = worksheet.Drawings.AddShape("tb1", eShapeStyle.Rect);
tb1.Text = "ABC Company";
tb1.SetPosition(1, 0, 2, 0);
tb1.SetSize(200, 20);
tb1.Font.Color = Color.Black;
tb1.TextAlignment = eTextAlignment.Center;
tb1.Fill.Color = Color.LightYellow;
tb1.Fill.Style = eFillStyle.SolidFill;
tb1.Border.Fill.Color = Color.Red;

当与上面的内容结合使用时,将其作为输出:

​

​

票数 3
EN

Stack Overflow用户

发布于 2016-05-28 05:06:02

Essential XlsIO可以将文本框添加到Excel图表中。

Example code

//Accessing the chart of the worksheet IChartShape shape = workbook.Worksheets[0].Charts[0]; //Adding textbox to chart shape shape.TextBoxes.AddTextBox(1,1, 100,200); //Setting position for textbox shape.TextBoxes[0].Top = 900; shape.TextBoxes[0].Left = 750; //Adding text to textbox shape.TextBoxes[0].Text = "New textbox";

如果您符合条件(收入低于100万美元),则可以通过community license计划免费获得整个控件套件(也可用于商业应用程序)。社区许可证是没有限制或水印的完整产品。

注意:我在Syncfusion工作。

​

​

票数 1
EN

Stack Overflow用户

发布于 2016-06-04 05:09:42

如果该图表已存在于模板中,而您只是在添加数据,则可以从页面上的单元格中读取框中的内容。然后,在C#中,您只需写入单元格即可。这使您可以在Excel中执行所需的任何格式设置或定位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37304860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档