どうも!リョクちゃです。
今回は、Excelの拡張子を.xlsから.xlsxに変換する方法を紹介していきます。
.xlsだとClosedXMLが使えず、プログラムでのExcel処理がめんどうになるので
.xlsxに変えてからClosedXMLで処理しようと思って今回記事にしたのが事の発端です。
ClosedXMLについては、こちら
ちなみに前回の記事はこちら
目次
拡張子の変換にライブラリを使う
ClosedXMLでは.xlsはサポートされていなかったので、
拡張子の変換には別のライブラリを使用します。
といわれるライブラリを使います。
プロジェクトへの追加は、
VisualStudioのプロジェクトタブ→参照の追加を選びます。
COMをクリックし、Microsoft Excel 15.0 Object Libraryを探して、
チェックを入れます。
※環境によってバージョンが違うので自身の環境に合わせて入れてください。
Excelのバージョンで変わります。
入れたらOKを押し、追加されていることを確認します。
ライブラリの使い方
ライブラリを使うファイル内で、
と書きます。
使い方は簡単、以下の手順で行います。
細かく順序だって解説しています。
※簡略できるところもあります。
- Excelブックの定義(設定)
- ワークブックの定義(1で定義したExcelブックの)
- 1のインスタンス生成
- Excelファイルを開く
- 拡張子変換処理
- ワークブックの終了
- 2のオブジェクト解放
- Excelブックの終了
- 1のオブジェクト解放
- ガベージコレクト
といった流れで行います。
このうちの6~10の流れは重要な処理になるので忘れずに書きましょう。
これを書かないで終了すると、ずっとプロセスとして残り続けてしまいます。
新たにExcelを開こうとしてもエラーになる可能性があるので危険です。
Excelブックの定義(設定)
以下の方法で行います。
例)
Dim excel As Microsoft.Office.Interop.Excel.Application = Nothing
ワークブックの定義(設定)
以下の方法で行います。
1のインスタンス生成
以下の方法で行います。
Excelファイルを開く
以下の方法で行います。
例) test.xlsというファイルを開くとき
workBook = excel.Workbooks.Open(“C:\test.xls”)
workBook変数は2で設定した変数
excel変数は1で設定した変数
にそれぞれなります。
拡張子変換処理
以下の方法で行います。
と書くことで拡張子を変換して保存をすることができます。
厳密にいうと新しいファイルとして作成し、拡張子を変換しています。
例) test.xlsxをtest.xlsとして変換したい場合
workBook.SaveAs(“test.xlsx”, FileFormat:=XLFileFormat.xlOpenXMLWorkbook)
と書くことで、.xlsx形式で保存することができます。
workBook変数は、2で設定した変数を使います。
FileFormatには、XLFileFormat列挙体でサポートされている項目を使用します。
今回は、.xlsから.xlsxに変換をしたいので、xlOpenXMLStrictWorkbookを使用します。
他の項目については、下記のリンク先を参照ください。
ワークブックの終了
拡張子変換処理で終了……といいたいのですが、これで終えてしまうと
Excelファイルはずっと開かれたままでプロセスに残り続けてしまいます。
以下の方法でワークブックのクローズを行います。
※workBook変数は2で設定した変数になります。
2のオブジェクト解放
クローズができたら2で設定した変数のオブジェクト解放を行います。
ExcelファイルはCOMオブジェクトとして扱うので、この解放処理も必要になります。
※COMオブジェクトとして扱うことでプログラムでも
Excelファイルが操作できるようになっているといった感じです。
以下の方法で解放を行います。
1 |
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook) : workBook = Nothing |
ReleaseComObject()に引数としてworkBook変数を、
渡すことでオブジェクトの解放ができます。
Excelブックの終了
ワークブックの終了ができたので次にExcelブックの終了処理を行います。
※まだ終わりではないです……。
Excelブックの終了は以下の処理で行います。
excel変数は1で設定した変数になります。
1のオブジェクト解放
これもワークブック同様オブジェクトの解放が必要になります。
1 |
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel) : excel = Nothing |
ReleaseComObject()の引数にexcel変数を渡しています。
ガベージコレクト
最後に、ガベージコレクトを行いメモリ領域の解放を行います。
こちらについては、下記の記事もご参照ください。
※最後の方に載せています。
本来は自動で解放されるようなのですが、外部参照しているExcelファイルの場合は
別途解放をしてあげないといけないみたいです。
メモリを効率的に管理していくうえでは必要なのでやっておいて損はありません。
安定したプログラム稼働を目指すうえでは大事です。
長々となりましたがガベージコレクトは以下の方法で行えます。
これだけです。
これらの処理を行うことでプロセスに残ることなくExcelファイルの終了ができます。
ClosedXMLでは、この処理を暗黙的に行ってくれているみたいなので、
終了処理を別途挟まなくていいのが便利だと感じました。
まとめ
拡張子を変換する方法として、新たにMicrosoft.Office.Interop.Excelを使って、
.xlsを読込み、.xlsxに変換するという力業でした。
変換しても、落とし穴があるので注意が必要です。
記事でも載せた、プログラム上でExcelを終了しただけでは
プロセスとしては残り続けるという罠です。
これを回避するにはExcelオブジェクトの解放を忘れないことです。
6~10の処理を忘れないことです。
今回は変換のみでMicrosoft.Office.Interop.Excelを使いましたが、
読み込みや書き込みももちろんできます。
ただし、Microsoft.Office.Interop.Excelは処理が遅いといった悩みがあるので、
使う際は処理時間に気を付けながらコードを書いていきましょう。
最後までお読みいただきありがとうございます。
・こちらの書籍を参考にVB.Net勉強しています。