【问题标题】:How to add to Text Label For excel Charts using Open xml or EPPLUS如何使用 Open xml 或 EPPLUS 为 excel 图表添加文本标签
【发布时间】:2016-05-18 16:07:51
【问题描述】:

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

实际上,我在 C# .net 中遇到了一些用于 Excel 生成的 API,例如 CLOSED XML、EEPLUS 和 vincent 的电子表格,Microsoft 的 Open XML,Microsoft 的 Interop excel

根据我的研究

CLOSED XML -- 不支持图表

EEPLUS - 支持图表

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

Open XML - 复杂难用

Spread light 很好的 API 我完全没问题,但我无法找到如何在图表中添加标签的解决方案

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

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

请让我知道如何通过这个免费 API 找到解决方案

谢谢
兰吉特

【问题讨论】:

    标签: c# excel openxml-sdk epplus spreadsheetlight


    【解决方案1】:

    您可以通过 Epplus 在标题处添加,但定位需要 XML 编辑:

        [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 中激活图表并执行插入 > 文本框以查看其外观。

    另一种选择是通过使用未使用的标题(例如轴标题)来伪造它,并像我做图表标题一样移动它。

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

    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;
    

    与上述结合时将其作为输出:

    【讨论】:

    • Ernie 对不起,我需要图表标题,我也不想为此丢失图表标题,我需要图表标题和额外的文本框
    • 请使用 relSizeAnchor 帮助找到这个解决方案,我需要这个功能,但我不能去互操作性:(我也不喜欢那个 API,我应该在 EEPLUS 或 OPEN XML 中做一些事情
    • @RanjithMurthy 看看这个:datypic.com/sc/ooxml/e-cdr_relSizeAnchor-1.htmlmsdn.microsoft.com/en-us/library/ff534388%28v=office.12%29.aspx 同时安装 MS 的 Open XML 2.5 SDK。您必须像我在原始响应中所做的那样插入 XML。如果您在 7zip 中打开 xls,您可以查看 chart.xml 文件以查看它的外观。如果遇到问题,试一试并发布您的代码。
    【解决方案2】:

    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 工作。

    【讨论】:

      【解决方案3】:

      如果您的模板中已经存在图表并且您只是添加数据,那么您可以从页面上的单元格中读取框的内容。然后从 C# 你只需要写入单元格。这让您可以在 Excel 中进行任何您想要的格式设置或定位。

      【讨论】:

      • Mr.white 我不能用那种硬编码的方式,因为我在一本工作簿中有 500 个图表我有大约 10 到 15 种图表类型(条形图、折线图、柱形图等),所以不会对不起 :( 我还在等待简单的方法来做到这一点。打开 xml 有点难
      • 我正在使用互操作性 com 对象,现在它工作正常,但有点解决
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多