【VB.Net】Excelの拡張子を.xlsから.xlsxに変換してみた

どうも!リョクちゃです。

今回は、Excelの拡張子を.xlsから.xlsxに変換する方法を紹介していきます。

.xlsだとClosedXMLが使えず、プログラムでのExcel処理がめんどうになるので

.xlsxに変えてからClosedXMLで処理しようと思って今回記事にしたのが事の発端です。

ClosedXMLについては、こちら

VB.NetでサポートされているClosedXMLを使って、Excelを簡単に操作する方法をWindowsアプリケーションを例に紹介しています。VBAじゃなくてもVB.Netでもできるぞといった記事になっています。プログラムからExcelを操作してみたい方の参考になれば嬉しいです。

ちなみに前回の記事はこちら

時に入力された値が文字列なのか数値なのかでどちらか一方が欲しいときはないでしょうか。例えば、数値データを受け取りたい場合、入力される値はinteger型もしくはfloatやdoubleといった型になります。今回はinteger型で受け取りたいときに使える関数を紹介しています。



拡張子の変換にライブラリを使う

ClosedXMLでは.xlsはサポートされていなかったので、

拡張子の変換には別のライブラリを使用します。

Microsoft.Office.Interop.Excel

といわれるライブラリを使います。

プロジェクトへの追加は、

VisualStudioのプロジェクトタブ→参照の追加を選びます。

COMをクリックし、Microsoft Excel 15.0 Object Libraryを探して、

チェックを入れます。

環境によってバージョンが違うので自身の環境に合わせて入れてください。

Excelのバージョンで変わります。

入れたらOKを押し、追加されていることを確認します。

ライブラリの使い方

ライブラリを使うファイル内で、

Imports Microsoft.Office.Interop.Excel

と書きます。

使い方は簡単、以下の手順で行います。

細かく順序だって解説しています。

※簡略できるところもあります。

  1. Excelブックの定義(設定)
  2. ワークブックの定義(1で定義したExcelブックの)
  3. 1のインスタンス生成
  4. Excelファイルを開く
  5. 拡張子変換処理
  6. ワークブックの終了
  7. 2のオブジェクト解放
  8. Excelブックの終了
  9. 1のオブジェクト解放
  10. ガベージコレクト

といった流れで行います。

このうちの6~10の流れは重要な処理になるので忘れずに書きましょう

これを書かないで終了すると、ずっとプロセスとして残り続けてしまいます

新たにExcelを開こうとしてもエラーになる可能性があるので危険です。

スポンサーリンク




Excelブックの定義(設定)

以下の方法で行います。

Dim 変数名 As Microsoft.Office.Interop.Excel.Application = Nothing

例)

Dim excel As Microsoft.Office.Interop.Excel.Application = Nothing

ワークブックの定義(設定)

以下の方法で行います。

Dim 変数名 As Microsoft.Office.Interop.Excel.Workbook = Nothing
例)
Dim workBook As Microsoft.Office.Interop.Excel.Workbook = Nothing

1のインスタンス生成

以下の方法で行います。

excel = New Microsoft.Office.Interop.Excel.Application()

Excelファイルを開く

以下の方法で行います。

workBook = excel.Workbooks.Open(“編集したいExcelファイルの絶対パス”)

例) test.xlsというファイルを開くとき

workBook = excel.Workbooks.Open(“C:\test.xls”)

workBook変数は2で設定した変数

excel変数は1で設定した変数

にそれぞれなります。

拡張子変換処理

以下の方法で行います。

workBook.SaveAs(“拡張子とパスを除いたファイル名”, FileFormat:=”変換する拡張子”)

と書くことで拡張子を変換して保存をすることができます。

厳密にいうと新しいファイルとして作成し、拡張子を変換しています。

例) test.xlsxをtest.xlsとして変換したい場合

workBook.SaveAs(“test.xlsx”, FileFormat:=XLFileFormat.xlOpenXMLWorkbook)

と書くことで、.xlsx形式で保存することができます。

workBook変数は、2で設定した変数を使います

FileFormatには、XLFileFormat列挙体でサポートされている項目を使用します。

今回は、.xlsから.xlsxに変換をしたいので、xlOpenXMLStrictWorkbookを使用します。

他の項目については、下記のリンク先を参照ください。

Office VBA reference topic

ワークブックの終了

拡張子変換処理で終了……といいたいのですが、これで終えてしまうと

Excelファイルはずっと開かれたままでプロセスに残り続けてしまいます

以下の方法でワークブックのクローズを行います。

workBook.Close()

※workBook変数は2で設定した変数になります

2のオブジェクト解放

クローズができたら2で設定した変数のオブジェクト解放を行います。

ExcelファイルはCOMオブジェクトとして扱うので、この解放処理も必要になります。

※COMオブジェクトとして扱うことでプログラムでも

Excelファイルが操作できるようになっているといった感じです。

以下の方法で解放を行います。

ReleaseComObject()に引数としてworkBook変数を、

渡すことでオブジェクトの解放ができます。

Excelブックの終了

ワークブックの終了ができたので次にExcelブックの終了処理を行います。

※まだ終わりではないです……。

Excelブックの終了は以下の処理で行います。

excel.quit()

excel変数は1で設定した変数になります。

1のオブジェクト解放

これもワークブック同様オブジェクトの解放が必要になります。

ReleaseComObject()の引数にexcel変数を渡しています。

ガベージコレクト

最後に、ガベージコレクトを行いメモリ領域の解放を行います。

こちらについては、下記の記事もご参照ください。

テキストファイルを作成する方法を、フォーム上のボタンが押された後にテキストボックスに入力された文字を書き込むといった例を交えて紹介しています。プログラム上でファイルを作成する方法はいくつかありますが、その中でも一般的に使われているだろう方法を載せています。これをきっかけにイメージをつかんでいただけたらなと思います。

※最後の方に載せています。

本来は自動で解放されるようなのですが、外部参照しているExcelファイルの場合は

別途解放をしてあげないといけないみたいです。

メモリを効率的に管理していくうえでは必要なのでやっておいて損はありません。

安定したプログラム稼働を目指すうえでは大事です。

長々となりましたがガベージコレクトは以下の方法で行えます。

GC.Collect()

これだけです。

これらの処理を行うことでプロセスに残ることなくExcelファイルの終了ができます。

ClosedXMLでは、この処理を暗黙的に行ってくれているみたいなので、

終了処理を別途挟まなくていいのが便利だと感じました

まとめ

拡張子を変換する方法として、新たにMicrosoft.Office.Interop.Excelを使って、

.xlsを読込み、.xlsxに変換するという力業でした。

変換しても、落とし穴があるので注意が必要です。

記事でも載せた、プログラム上でExcelを終了しただけでは

プロセスとしては残り続けるという罠です。

これを回避するにはExcelオブジェクトの解放を忘れないことです。

6~10の処理を忘れないことです。

今回は変換のみでMicrosoft.Office.Interop.Excelを使いましたが、

読み込みや書き込みももちろんできます。

ただし、Microsoft.Office.Interop.Excelは処理が遅いといった悩みがあるので、

使う際は処理時間に気を付けながらコードを書いていきましょう。

最後までお読みいただきありがとうございます。

・こちらの書籍を参考にVB.Net勉強しています。

スポンサーリンク