1

C# での Excel の自動化はまったくの初心者です

実際、CLOSED XML、EEPLUS、vincent によるスプレッドシートライト、Microsoft による Open XML、Microsoft による Interop Excel など、C# .net で Excel を生成するための API に出くわしました。

私の研究によると

CLOSED XML -- グラフはサポートされていません

EEPLUS - サポートされているチャート

スプレッドライト - 非常に使いやすく、チャートもサポートされています

Open XML - 複雑で作業が難しい

Spread light light is good API で完全に問題ありませんでしたが、チャート内にラベルを追加する方法を見つけることができません

スタック オーバーフローのいずれかが同じ問題に遭遇したことを願っています。

チャート内の会社など、チャート内のテキストのようなラベルを追加する必要があります。

この無料APIのいずれかで解決策を見つける方法を教えてください

チャート情報はこちら

ありがとう
ランジス

4

3 に答える 3

3

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;

上記と組み合わせると、これが出力として得られます。

ここに画像の説明を入力

于 2016-05-19T21:01:25.420 に答える
0

グラフがテンプレートに既に存在し、データを追加するだけの場合は、ページのセルからボックスの内容を読み取ることができます。次に、C# からセルに書き込むだけです。これにより、Excel で必要な書式設定や配置を行うことができます。

于 2016-06-03T21:09:41.667 に答える