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

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

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

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

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

Q&A

解決済

4回答

14818閲覧

ClosedXML Excelのパスが通らない

lable

総合スコア14

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

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

0グッド

0クリップ

投稿2018/08/27 05:00

編集2018/08/28 00:16

前提・実現したいこと

CLosedXMLを使ってExcelを開きたいのですが、パスが通らず開くことができません。何が足りないのかご教示願います。

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

System.FormatException: '入力文字列の形式が正しくありません。'

該当のソースコード

C#

1var path = @"\Users******\source\repos\testapp\testapp\bin\Debug****.xlsx"; 2// Excelファイルを読み込み 3using (var book = new XLWorkbook(path, XLEventTracking.Disabled))←ここでエラーが起こります。 4{ 5var sheet = book.Worksheet("しーと"); 6sheet.Cell("A1").Value = "Value"; 7book.Save(); 8}

試したこと

var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "****.xlsx");

var path = Path.GetFullPath("..****.xlsx");

Uri u1 = new Uri("C:\Users****\Desktop");
Uri u2 = new Uri(u1, "..*
.xlsx");
var path = u2.LocalPath;

調べて出てきたこれらのコードは試しました。
しかしいずれもエラーを出しました。

追記
@"\Users******\source\repos\testapp\testapp\bin\Debug****.xlsx";  
ここの部分を
@"C:\Users******\source\repos\testapp\testapp\bin\Debug****.xlsx";
と変えると
System.IO.DirectoryNotFoundException: 'パス 'c:\users******\source\repos\testapp\testapp\bin\Debug\Users******\source\repos\testapp\testapp\bin\Debug****.xlsx' の一部が見つかりませんでした。'
とエラーが出ます。

追記
var path = @"*****.xlsx";
String filename = path;
if (File.Exists(filename))
{
MessageBox.Show("存在する");
}
else
{
MessageBox.Show("存在しない");
}
このコードを実行したところ”存在する”が表示されました。
なのでやはりコード以外の場所で問題があるかもしれません。

追記
OpenXMLでも試した結果
var filename = @"C:\Users\****\source\repos\testapp\testapp\bin\Debug\****.xlsx";
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, false))
{
MessageBox.Show("開いた");
}
これで実行したところ実行結果は”開いた”が表示されました。

追記
Excelを新規作成し、空のまま保存したものをClosedXMLで開こうとしたら開くことができた。

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

VisualStudio 2017
ClosedXML 0.93.1
Excel for Ofiice 365 MSO (16.0.10730.20053) 32ビット

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

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

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

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

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

mituha

2018/08/27 08:34

このような場合、まず、File.Exists等でファイルがあることをコード上で確認できるようにし、追記されたほうが良いかと思います
lable

2018/08/27 08:56

なるほどそのようなやり方もあるのですね。勉強になります。追記しておきます。結果は存在するとのことでした。
guest

回答4

0

ベストアンサー

  • ファイルが存在している
  • papinianusさんの環境では動作している

となった場合、lableさんの環境依存の問題の可能性が高くなります。
まずは処理しようとしている xlsx が正しいかを検証するべきです。

質問で触れられていませんが、このxlsxファイルはどのようにして作成されてものでしょうか?

  • EXCEL(バージョンは?)で正常に開けることを確認する
  • 別なxlsxファイルに差し替えた場合に動作するかを確認する

等が考えられます。
ClosedXmlの該当部分はOpenXmlをそのままラップしているようなので、
OpenXml付属ツール(検証ツールがあったはず)等で開けるかを確認するのも良いと思います。

投稿2018/08/27 23:46

mituha

総合スコア385

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

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

lable

2018/08/27 23:51

ご回答ありがとうございます。 やはり原因はコード以外にありそうですよね。どこを確認すればよいかわからなかったので、とても助かります。 Excelでは正常に開けることは確認できました。 その他は現在確認中です。
lable

2018/08/27 23:55

Excelのバージョンは for Ofiice 365 MSO (16.0.10730.20053) 32ビット でした。追記しておきます。
mituha

2018/08/28 00:03

発生しているエラーが、FileNotFoundではなく、DirectoryNotFoundExceptionなのが気になります。 なにか、別のディレクトリを参照するような内容が含まれていませんでしょうか? なお、xlsxは単なるzip形式なので、拡張子を変えて解凍すれば中身も見れます。 まずは、新規作成した空のEXCELファイルで試されるのが良いと思います。
lable

2018/08/28 00:06

ありがとうございます。 今コードはこれ以外に記述しておらず、別のディレクトリを参照するような内容は含まれていないはずです。 今確認したのですが、OpenXMLでは開くことができました。追記しておきます。
lable

2018/08/28 00:14

空のExcel を試したところ、進展が見られました。 処理が進みシートのところまで処理が通りました。 ということは初めに通そうとしていたExcelに問題がありそうですね。
lable

2018/08/28 00:32

解決することができました! 拡張子があっているのか確認したところ、確かにxlsxではあったのですが (Strict Open XMLスプレッドシート)というものになっていました。 なので改めて、(Excel ブック)に直して保存したところ上手く通りました。 本当にありがとうございます。
guest

0

ClosedXMLを今、動作検証しましたが、windowsで、絶対パスも相対パスも認識してくれました。

別回答のコメント欄でお気付きのとおり、パスが二重化していることに問題があるのだと思います。
そのようなことはコードでしか起こらないと思います(コードの外に問題はない)。

本当に質問分のとおり、書いてあって、追記のとおりの修正をしたのなら、そういう動作にはならないと思います。+ +=が使われていないかご確認ください。

csharp

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using ClosedXML.Excel; 7 8namespace ConsoleApp1 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 var path = @"book.xlsx"; 15 //var path = @"C:..デスクトップ..\ConsoleApp1\ConsoleApp1\bin\Debug\book.xlsx"; 16 // Excelファイルを読み込み 17 using (var book = new XLWorkbook(path, XLEventTracking.Disabled)) 18 { 19 var sheet = book.Worksheet("しーと"); 20 sheet.Cell("A1").Value = "Value"; 21 book.Save(); 22 } 23 } 24 } 25} 26

投稿2018/08/27 06:49

編集2018/08/27 07:23
papinianus

総合スコア12705

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

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

papinianus

2018/08/27 06:55

あらためて考えると、追記のところのエラーは`path = "Users..."としたときの挙動ですね(最初のエンマークを取った)。その場合、相対パスと解釈されて、実行バイナリのフォルダが先頭に補完された結果二重化したように見える。 ご自身で書いておられる"path = C:..."を再度やってみれば、正しく動くのでは?
lable

2018/08/27 07:01

ご回答ありがとうございます。 @"C:\Users****\source\repos\testapp\testapp\bin\Debug**.xlsx"; を確認してやってみたのですが、やはり System.FormatException: '入力文字列の形式が正しくありません。'としか返ってきません。
lable

2018/08/27 07:01

よければ成功したコードを教えていただけないでしょうか?
papinianus

2018/08/27 07:23

追記するのもはずかしいくらい、ご提示のままなんですが、いちおう
lable

2018/08/27 07:31

恐縮です。ありがとうございます。 まるまるコピーして要所だけ変更したのですが、やはりエラーになります。
lable

2018/08/27 07:32

VisualStudioのバージョンを一度替えてやってみます。
guest

0

var path = @"\Users******\source\repos\testapp\testapp\bin\Debug****.xlsx";

全角のスペースが紛れこんでます
また、OSはなんでしょうか。
Windowsにすればパスの形式が違いますが。

投稿2018/08/27 06:01

y_waiwai

総合スコア87719

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

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

lable

2018/08/27 06:19

すみません。質問のコードで全角スペースを使用してしまっていました。 元のコードでは全角のスペースは入っておりません。 OSはWindowsなのですが、絶対パスはこの様な記述ではないのでしょうか? 間違っているのであれば教えていただきたいです。
lable

2018/08/27 06:22

先ほどの全角は訂正させていただきました。 ありがとうございます。
y_waiwai

2018/08/27 06:27

Windowsであれば最初にドライブ名が入ります
lable

2018/08/27 06:31

ご回答ありがとうございます。 実は試したことの欄にドライブ名を入れたコードについて記載をしていまして、その場合もエラーが出てしましました。
y_waiwai

2018/08/27 06:32

そのパスが見つからない、というエラーです。 きちんと存在してるのか確認しましょう
lable

2018/08/27 06:36

そのフォルダの中にはちゃんと****.xlsxのファイルは存在していますが、二重になっているのが気になり、”\****.xlsx”でも試してみたのですが、今度は System.IO.FileNotFoundException: 'ファイル 'c:****.xlsx' が見つかりませんでした。 と出てきます。
lable

2018/08/27 06:36

コード以外に問題があるのでしょうか?
guest

0

自己解決ではありませんが、解決までの過程を記入しておきます。
ベストアンサーの方の返事にも書いたのですが、
自分が最初に実行していたExcelファイルは拡張子が.xlsxとなっていてなんの問題も無いように思われたのですが、実は
Strict Open XMLスプレッドシート(.xlsx)というものでした。なぜこの様な拡張子になったのかは不明です。(自分でやったのかもしれない)
そこで、
Excel ブック(.xlsx)という拡張子に変えて保存すると、ClosedXMLで開くことができました。

この解決は
mituhaさん、y_waiwaiさん、papinianusさん、のおかげでございます。
本当にありがとうございました。

投稿2018/08/28 00:41

編集2018/08/28 00:45
lable

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問