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

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

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

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

Q&A

2回答

7183閲覧

Excel(xlsx)のセルに設定した外部リンクをC#で扱いたい

cancat

総合スコア313

C#

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

0グッド

0クリップ

投稿2017/10/20 08:54

編集2022/01/12 10:55

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

###前提・実現したいこと
Excel(xlsx)のセルに設定した外部リンクをC#で扱いたいです。

###試したこと
(1)xlsxのシートに、値を設定。
='C:\Excelリンクテスト[Original.xlsx]Sheet1'!$A$1

外部リンクはRelationshipに値を保持する。

(2)ClosedXML, EPPlusを使ってセルのValue, Fomulaを読んでみる。
EPPlusでは該当のcellのFomulaは、"[1]Sheet1!$A$1"。Original.xlsxがない。

###発生している問題・エラーメッセージ
ところが、EPPlusにもClosedXMLにも、Relationshipsが見あたらない!

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

C#

1FileInfo originalfile = new FileInfo(@"C:\Excelリンクテスト\Link.xlsx"); 2using (var excel = new ExcelPackage(originalfile)) 3{ 4foreach (var worksheet in excel.Workbook.Worksheets) 5{ 6 var cell = worksheet.Cells[1, 1]; 7 if (cell.Formula.ToString().Contains("[1]")) 8 { 9 cell.Value = 500;//<=ここで一時停止していろいろ見てみるがRelationshopがない。 10 } 11}

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

です。
よろしくお願いします。

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

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

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

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

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

daive

2017/10/25 10:40 編集

わざわざ、ブックを分解して、内部データから、リンク先を得ようとする理由が不明です。素直に、Microsoft.Office.Interop.Excel 名前空間 を使用出来ない理由は何でしょうか?また、他のツールで、ブックからデータを抜く選択肢は、考えなかったのでしょうか? また、ネット検索をすれば、EXCELのブックの仕様が探せます。
cancat

2017/10/26 02:10

なにがいいたいのかわかりません。Excelはないので、Microsoft.Office.Interop.Excelは対象外です。
283cks

2017/10/26 03:02

Excelのバージョンは? あと「試したこと」の「(2)」が 何をしているのかわからない。 気になる項目(質問)なのですが・・・
283cks

2017/10/26 03:03

すいません。回答欄に投稿して(削除依頼しました)。こちらで返答をいただければ幸いです。
cancat

2017/10/26 09:38

(2)は飛ばしてください。理由を聞かれても説明できないです。
guest

回答2

0

個人的な経験からみると、spire.XLSをお勧めいたします。

Workbook wb = new Workbook(); //ドキュメントをロード。 wb.LoadFromFile("test.xlsx"); //Worksheetを取得。 Worksheet sheet = wb.Worksheets[0]; //シートにあるリンクをループし、リンク先を取得 foreach (var item in sheet.HyperLinks) { string address = item.Address; CellRange range = item.Range; Console.WriteLine(string.Format("Cell[{0},{1}] URL含む: {2}", range.Row, range.Column, address)); } Console.ReadLine();

これでOKです。

投稿2020/11/04 06:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

いまだに、「relationship」がよくわかっていませんが、

こんな感じでしょうか?

c#

1 using System.IO; 2 using OfficeOpenXml; 3 4 class Program 5 { 6 static void Main(string[] args) 7 { 8 FileInfo fi = new FileInfo(@"C:\Users\aaa\Desktop\linktest.xlsx"); 9 using (ExcelPackage expack = new ExcelPackage(fi)) 10 { 11 ExcelWorkbook workbook = expack.Workbook; 12 foreach(ExcelWorksheet worksheet in workbook.Worksheets) 13 { 14 ExcelRange range = worksheet.Cells[1, 1]; 15 var hyperLink = range.Hyperlink; 16 17 Console.WriteLine("WorkSheet {0} 's HyperLink is {1}", worksheet.Name, hyperLink.AbsoluteUri); 18 19 } 20 Console.ReadLine(); 21 } 22 } 23 } 24 25

こうすると、複数のシートのA1セルにセットしたリンクが取得できます。
(コードにあるファイル「linktest.xlsx」のA1セルにリンクをセットしてみたら、
コンソールで無事出力されました。取得したいリンクが「AbsoluteUri」で
なければ、他のものを代用して試してみてください)

※ 参考URLはこちらです。
同じ悩みは世界中にあるもんです。

参考になれば幸いです。

投稿2017/10/30 02:53

283cks

総合スコア138

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

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

cancat

2017/11/06 06:58

お返事遅くなりました。 外部リンクはHyperlinkではないので、これでは取得できません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問