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

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

新規登録して質問してみよう
ただいま回答率
85.51%
C#

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

Q&A

解決済

3回答

11741閲覧

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

cancat

総合スコア313

C#

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

0グッド

0クリップ

投稿2017/09/29 09:46

編集2017/09/29 09:54

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

###前提・実現したいこと
C#で吹き出しつきのExcelファイルを作りたいです。

###試したこと
ClosedXMLをNuGet。
ファイルの読み書き。

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

###発生している問題・エラーメッセージ
吹き出しの作り方がわからん・・・。
ヒントでかまいません。

###該当のソースコード

C#

1 public void Add(string text, string savepath) 2 { 3 using (var workbook = new XLWorkbook()) 4 { 5 var worksheet = workbook.Worksheets.Add("Sample Sheet"); 6 worksheet.Cell("A1").Value = "Hello World!!"; 7 worksheet.Cell("A2").Value = text; 8 9 //セルに罫線を引く 10 var cell = worksheet.Cell("A1"); 11 cell.Style.Border.BottomBorder = XLBorderStyleValues.Thin; 12 cell.Style.Border.BottomBorderColor = XLColor.Red; 13 //塗りつぶしの設定 14 cell.Style.Fill.BackgroundColor = XLColor.BabyBlue; 15 16 //セル範囲に罫線を引く 17 var range = worksheet.Range("B4:D8"); 18 range.Style.Border.OutsideBorder = XLBorderStyleValues.DashDotDot; 19 range.Style.Border.BottomBorderColor = XLColor.Red; 20 range.Style.Fill.PatternType = XLFillPatternValues.DarkDown; 21 range.Style.Fill.PatternColor = XLColor.Gray; 22 range.Style.Fill.PatternBackgroundColor = XLColor.Blue; 23 24//ここでたとえば[C7]のセルの上に、textの文字を吹き出しで入れたい。 25 26 workbook.SaveAs(savepath); 27 } 28 } 29

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Pro 2017
Microsoft .NET Framework
Version 4.6.01586

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

C#

1// 抜粋 2 private void Test(string fileName) 3 { 4 var excelApplication = new Microsoft.Office.Interop.Excel.Application(); 5 excelApplication.Visible = true; 6 try 7 { 8 Workbooks workbooks = excelApplication.Workbooks; 9 try 10 { 11 // *.xlsx ファイルを開く 12 Workbook workbook = workbooks.Open(fileName); 13 try 14 { 15 Sheets worksheets = workbook.Sheets; 16 try 17 { 18 Worksheet worksheet = worksheets[1]; 19 Trace.WriteLine("sheetname: " + worksheet.Name); 20 try 21 { 22 // 吹き出しのシェイプを追加 23 var shape = worksheet.Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeBalloon, 10, 50, 100, 100); 24 shape.Name = "New shape"; 25 shape.BackgroundStyle = Microsoft.Office.Core.MsoBackgroundStyleIndex.msoBackgroundStylePreset1; 26 shape.ShapeStyle = Microsoft.Office.Core.MsoShapeStyleIndex.msoLineStylePreset16; 27 28 // シートに存在するシェイプを列挙 29 int no = 0; 30 var ss = worksheet.Shapes; 31 foreach (var s in worksheet.Shapes) 32 { 33 ++no; 34 if (s is Microsoft.Office.Interop.Excel.Shape) 35 { 36 Microsoft.Office.Interop.Excel.Shape targetShape = (Microsoft.Office.Interop.Excel.Shape)s; 37 38 Trace.WriteLine("--- No:" + no); 39 Trace.WriteLine("Name: " + targetShape.Name); 40 Trace.WriteLine("Title: " + targetShape.Title); 41 } 42 } 43 } 44 catch (Exception ex) 45 { 46 Trace.WriteLine("Exception at AddShape: " + ex.Message); 47 } 48 finally { Marshal.ReleaseComObject(worksheet); } 49 } 50 finally { Marshal.ReleaseComObject(worksheets); } 51 } 52 finally 53 { 54 // 別のファイル名で保存 55 workbook.SaveAs(altFileName); 56 if (workbook != null) 57 { 58 workbook.Close(false); 59 } 60 Marshal.ReleaseComObject(workbook); 61 } 62 } 63 catch (Exception ex) 64 { 65 Trace.WriteLine("Open: " + ex.Message); 66 } 67 finally { Marshal.ReleaseComObject(workbooks); } 68 } 69 finally 70 { 71 if (excelApplication != null) 72 { 73 excelApplication.Quit(); 74 } 75 Marshal.ReleaseComObject(excelApplication); 76 } 77 } 78

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

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

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

投稿2017/10/18 05:00

編集2017/10/18 07:48
dodox86

総合スコア9181

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/10/18 06:41

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

2017/10/18 06:45

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

2017/10/18 08:06

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

2017/10/18 08:20

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

2017/10/18 08:27

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

0

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

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

投稿2017/10/18 13:26

編集2017/10/18 13:29
nakasho_dev

総合スコア2655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2017/09/29 10:05

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/10/02 02:45

ありがとうございます。
cancat

2017/10/17 09:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問