質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C#

    6562questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Excel

    1404questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

C#で吹き出しつきのExcelファイルを作りたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 755

cancat

score 239

こんにちは。 
Windows10でWPFのアプリケーションを開発しています。 
Visual Studio 2017 Proを使っています。 

前提・実現したいこと

C#で吹き出しつきのExcelファイルを作りたいです。

試したこと

ClosedXMLをNuGet。
ファイルの読み書き。

吹き出しだけ作ったxlsxファイルを作って読んでみましたが、Sheetにそれらしい値はなく。

発生している問題・エラーメッセージ

吹き出しの作り方がわからん・・・。
ヒントでかまいません。

該当のソースコード

        public void Add(string text, string savepath)
        {
            using (var workbook = new XLWorkbook())
            {
                var worksheet = workbook.Worksheets.Add("Sample Sheet");
                worksheet.Cell("A1").Value = "Hello World!!";
                worksheet.Cell("A2").Value = text;

                //セルに罫線を引く
                var cell = worksheet.Cell("A1");
                cell.Style.Border.BottomBorder = XLBorderStyleValues.Thin;
                cell.Style.Border.BottomBorderColor = XLColor.Red;
                //塗りつぶしの設定
                cell.Style.Fill.BackgroundColor = XLColor.BabyBlue;

                //セル範囲に罫線を引く
                var range = worksheet.Range("B4:D8");
                range.Style.Border.OutsideBorder = XLBorderStyleValues.DashDotDot;
                range.Style.Border.BottomBorderColor = XLColor.Red;
                range.Style.Fill.PatternType = XLFillPatternValues.DarkDown;
                range.Style.Fill.PatternColor = XLColor.Gray;
                range.Style.Fill.PatternBackgroundColor = XLColor.Blue;

//ここでたとえば[C7]のセルの上に、textの文字を吹き出しで入れたい。

                workbook.SaveAs(savepath);
            }
        }

補足情報(言語/FW/ツール等のバージョンなど)

Microsoft Visual Studio Pro 2017
Microsoft .NET Framework
Version 4.6.01586

です。 
ヒントでかまいません。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

ClosedXMLを使用したものではないですが、Excelをインストールすれば使える Microsoft.Office.Interop.Excelを使うことで一応、吹き出しと言うかシェイプを追加することはできたのでご案内します。(Visual Studio2017, Windows7, Excel2013 で確認) 

以下の記事を参考にさせていただきました、(記事のご提供者様に感謝いたします)
オートシェイプをVBAで作成
C#で書いてみたコード例は以下となります。簡単に言うと、Worksheet.Shapes.AddShape で吹き出し相当のシェイプを追加します。

// 抜粋
        private void Test(string fileName)
        {
            var excelApplication = new Microsoft.Office.Interop.Excel.Application();
            excelApplication.Visible = true;
            try
            {
                Workbooks workbooks = excelApplication.Workbooks;
                try
                {
                    // *.xlsx ファイルを開く
                    Workbook workbook = workbooks.Open(fileName);
                    try
                    {
                        Sheets worksheets = workbook.Sheets;
                        try
                        {
                            Worksheet worksheet = worksheets[1];
                            Trace.WriteLine("sheetname: " + worksheet.Name);
                            try
                            {
                                // 吹き出しのシェイプを追加
                                var shape = worksheet.Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeBalloon, 10, 50, 100, 100);
                                shape.Name = "New shape";
                                shape.BackgroundStyle = Microsoft.Office.Core.MsoBackgroundStyleIndex.msoBackgroundStylePreset1;
                                shape.ShapeStyle = Microsoft.Office.Core.MsoShapeStyleIndex.msoLineStylePreset16;

                                // シートに存在するシェイプを列挙
                                int no = 0;
                                var ss = worksheet.Shapes;
                                foreach (var s in worksheet.Shapes)
                                {
                                    ++no;
                                    if (s is Microsoft.Office.Interop.Excel.Shape)
                                    {
                                        Microsoft.Office.Interop.Excel.Shape targetShape = (Microsoft.Office.Interop.Excel.Shape)s;

                                        Trace.WriteLine("--- No:" + no);
                                        Trace.WriteLine("Name: " + targetShape.Name);
                                        Trace.WriteLine("Title: " + targetShape.Title);
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                Trace.WriteLine("Exception at AddShape: " + ex.Message);
                            }
                            finally { Marshal.ReleaseComObject(worksheet); }
                        }
                        finally { Marshal.ReleaseComObject(worksheets); }
                    }
                    finally
                    {
                        // 別のファイル名で保存
                        workbook.SaveAs(altFileName);
                        if (workbook != null)
                        {
                            workbook.Close(false);
                        }
                        Marshal.ReleaseComObject(workbook);
                    }
                }
                catch (Exception ex)
                {
                    Trace.WriteLine("Open: " + ex.Message);
                }
                finally { Marshal.ReleaseComObject(workbooks); }
            }
            finally
            {
                if (excelApplication != null)
                {
                    excelApplication.Quit();
                }
                Marshal.ReleaseComObject(excelApplication);
            }
        }

下図のようになります。 
イメージ説明
上の背景色薄緑の吹き出しはExcel上から手動で追加したもの、下の青枠のみの吹き出しは上のコード例中、 worksheet.Shapes.AddShapeで追加したものです。青い枠は現在のExcelの既定の設定から色が選択されているようです。吹き出し中にテキストや背景色を入れるには、ここからさまざまなプロパティにアクセスして値をセットしていく必要があるようです。Nameプロパティに"New shape"を指定していて、それがExcelの左上コンボボックスに表示されているのが分かります。

質問の主旨から少し離れますが、Microsoft.Office.Interop.Excelは以下のQiitaの記事に掲載されているように注意深く使う必要があり、コードの取りまわしがかなり面倒です。※上記のコードもこちらの記事を参考にさせていただいています。
Excelファイルを C# と VB.NET で読み込む "正しい" 方法

可能な限りは最初のZuishin様からのご回答の案に沿って、CloseXMLで対応できるようにするのが良いかと感じました。上記の記事で述べられていましたが、NPOIと言うオープンソースプロジェクトもあるので、こちらも試してみるのも手だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/18 15:41

    コメント&試行ありがとうございます。
    Excelを扱うときに、最初に出てくるのが(たぶん)Microsoft.Office.Interop.Excelなのですが、ご指摘のように、解放こととかで制約が多く、個人的にはExcelを所有していないもので、全然興味なく、最初に候補から外れました。
    ClosedXMLを2か月弱使ってみたのですが、どうもShapeはだめっぽいので、ご提案のNPOIとかEPPlusとかに乗り換えることを検討中です。
    とはいえ引き続き、ClosedXMLでできたらうれしいです。

    キャンセル

  • 2017/10/18 15:45

    なるほど、そういった事情が背景にあったのですね。確かにClosedXMLはExcelインストールが必須では無いという点でも魅力です。コメントありがとうございます。

    キャンセル

  • 2017/10/18 17:06

    背景は難しくて、どこまで説明したものか、いつも悩むのですが、そんな感じで。
    ちなみにいまEPPlasをためしたらあっさりできました。
    乗り換える予定です。

    キャンセル

  • 2017/10/18 17:20

    EPPlusは知りませんでした。情報ありがとうございます。

    キャンセル

  • 2017/10/18 17:27

    いえいえ。ClosedXML2か月、EPPlus2時間ですが、EPPlusのほうが座標を引数にできるっぽくて、C#と親和性高いかも。

    キャンセル

0

ClosedXMLでExcelファイルに画像を埋め込む にサンプルがあります。ここでは四角形を挿入していますが、ShapeTypeValues を変えたら吹き出しになるのではないかと思います。

ShapeTypeValues Enumeration の中の "Callout" がついているのが吹き出しではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/02 11:45

    ありがとうございます。

    キャンセル

  • 2017/10/17 18:43

    いろいろやってみたのですが、まだうまくいきませんでした。
    jpgファイルを埋め込むことはできましたが、長方形や吹き出しはまだです。
    Help meな感じです。

    キャンセル

0

「吹き出し」を「コメント」と認識して回答します。
ClosedXMLの公式に以下があります。
https://github.com/ClosedXML/ClosedXML/wiki/Comments-Style-Alignment

【追記】すいません。質問の画像をよく見ていませんでした。本回答については無視してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6562questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Excel

    1404questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。