Как добавить в текстовую метку для диаграмм Excel с использованием Open XML или EPPLUS

Я совершенно новичок в автоматизации Excel в C#

На самом деле я сталкивался с некоторыми API для генерации Excel в C# .net, такими как CLOSED XML, EEPLUS и электронные таблицы от vincent,Open XML от Microsoft, Interop excel от Microsoft

Согласно моему исследованию

ЗАКРЫТО XML - диаграммы не поддерживаются

EEPLUS - графики поддерживаются

Распространение света - очень прост в использовании и графики также поддерживаются

Открытый XML - сложный для работы

Я был полностью в порядке с Spread light light, это был хороший API, но я не смог найти решение, как добавить метку внутри диаграммы

Я надеюсь, что кто-либо в переполнении стека столкнулся с той же проблемой.

Мне нужно добавить метку, как текст внутри диаграммы, как, например, компания в диаграмме.

Пожалуйста, дайте мне знать, как найти решение любого этого бесплатного API

Пожалуйста, найдите информацию о графике здесь

Спасибо Ранджит

3 ответа

Вы можете добавить в заголовок через Epplus, но позиционирование потребует редактирования XML:

    [TestMethod]
    public void Chart_Manual_Title_Test()
    {
        //http://stackru.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;

дает это как вывод, когда объединено с выше:

введите описание изображения здесь

Essential XlsIO может добавлять текстовые поля в диаграммы Excel.

Пример кода

//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";

Весь набор элементов управления предоставляется бесплатно (коммерческие приложения также) через программу лицензирования сообщества, если вы соответствуете требованиям (доход менее 1 миллиона долларов США). Лицензия сообщества является полным продуктом без ограничений и водяных знаков.

Примечание: я работаю на Syncfusion.

Если диаграмма уже существует в вашем шаблоне, и вы просто добавляете данные, вы можете прочитать содержимое поля из ячейки на странице. Тогда из C# вам просто нужно написать в ячейку. Это позволяет вам делать любое форматирование или позиционирование в Excel.

Другие вопросы по тегам