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

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

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

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

Q&A

解決済

3回答

10071閲覧

c# Excelファイルの指定したシートのCSVファイルを作成したい

sin777

総合スコア20

C#

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

0グッド

0クリップ

投稿2018/10/02 15:53

ExcelファイルをCSVファイルに変換させたいと思いネットで検索したら、
このサイトに回答がありましたが、アクティブシートになっていた為、
指定したシートでの作成が出来ないので、教えて頂きたいと思います。
また、実行後、csvファイルを削除しようとしたら、
「Excel(デスクトップ)によってファイルは開かれているため、操作を完了できません。
ファイルを閉じてから再実行してください。」となりますので、ファイルの
閉じ方も教えて欲しいと思います。
宜しくお願い致します。

VS Express 2013 for Desktop Windowsフォームアプリケーションで作成しました。
(一応、EPPlusもインストールしました)
Excelファイルにはsheet1とsheet2があります

参考 https://teratail.com/questions/37815

c#

1 2 string src = "C:\test.xlsx"; // <変換元エクセルブックのパス> 3 string dst = "C:\test.csv"; // <変換先CSVのパス> 4 dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 5 //excel.Visible = true; 6 excel.Workbooks.Open(src); 7 excel.ActiveWorkbook.SaveAs(Filename : dst, FileFormat : 6); 8 excel.Workbooks.Close(); // 自分で入れた

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

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

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

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

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

guest

回答3

0

ベストアンサー

このサンプルで取得できる「excel」というのは、Microsoft.Office.Interop.Excel です。
ということで、上記を使ったサンプルを探してみると有益な情報が得られそうです。

で、回答ですが、下記でいかがでしょうか。

c#

1string src = @"C:\test.xlsx"; 2string dst = @"C:\test.csv"; 3dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 4excel.Visible = true; 5excel.Workbooks.Open(src); 6 7// Workbook内にあるシートを取得して、指定の名前であればアクティブにする. 8foreach (var s in excel.Sheets) 9{ 10 if (s.Name == "sheet2") 11 { 12 s.Activate(); 13 } 14} 15 16excel.ActiveWorkbook.SaveAs(Filename: dst, FileFormat: 6); 17// Workbookを閉じる. 18excel.Workbooks.Close(); 19// Excelを閉じる. 20excel.Quit();

ExcelやWorkbookは、使用後明示的に閉じる必要があります。
2つ目の問題は、これらが閉じられておらず、アクセスし続けている状態であったことが原因ではないかと思います。

投稿2018/10/02 21:53

masanori_msl

総合スコア80

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

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

sin777

2018/10/03 15:59

masanori_mslさん、回答有難う御座います。 無事に作成する事が出来ました。有難う御座いました。 実行後、ふと疑問が浮かび上がったのですが、 シートが5~6つあるexcelファイルだった場合、 5~6つif文で判断するよりもforeachで 取り出したシート名を配列(a[0] = s.Name; みたいに)登録させておけば いつでも直接指定出来ると思ったので、取り出した後、 a[0].Activate(); としましたがうまくいきませんでした。宜しければ教えて頂きたいと思います。
masanori_msl

2018/10/03 22:47

https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.sheets?view=excel-pia を見るとシート名を指定して取得、といったものが見つかりませんでした(見落としてるかもですが)。 もしやるとすれば対象のシートのインデックスを取得して、 excel.Sheets(1) のように取得するのが良さそうです(シートの順番が変更されない、という前提でないと失敗しますが)。 ```C# int index = 1; for(int i = 1; i < excel.Sheets.Count; i++) { if(excel.Sheets(i).Name == "sheet2") { index = i; } } excel.Sheets(index).Activate(); ``` なお Sheets のインデックスは 1 からスタートするので注意が必要です(ハマりました)。
sin777

2018/10/04 13:34

masanori_mslさん、色々調べて頂き有難う御座います。 シートを直接指定するのは出来ないみたいですね。 他の作業者がexcelのシートを触る(移動させる)かもと考えると、 最初に回答して頂いたサンプルのif文の方がいいと思いましたので、 解決できました。本当に有難う御座いました。
guest

0

指定したシートもExcelファイルまるごとも、この無料のC#コンポーネントSpire.XLS for .NETを使用したら作成できます。その原理はXLSドキュメントをCSVドキュメントに変換することです、とにかく便利なものでも言えます、何より無料のツールです。以下はその操作を実現するために必要のコードです:

using

1namespace xls2csv 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 Workbook workbook = new Workbook(); 8 workbook.LoadFromFile(@"..\ExceltoCSV.xls"); 9 Worksheet sheet = workbook.Worksheets[0]; 10 sheet.SaveToFile("sample.csv", ",", Encoding.UTF8); 11 } 12 } 13}

投稿2021/12/17 02:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

spire.XLSならできるはずです。

投稿2020/12/25 02:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問