ある分析装置がxlsx形式でレポート出力するのでExcelのCOMインターフェース経由でCSVに落としてから処理していました。
この方法だとMicrosoft Excelが必須になってしまいます。
あとExcel本体経由なので、セキュリティ設定によっては手動でロック解除しないと開けないとかいう場合もあります。
そこでライセンス料をケチるべく、Excelなしでxls/xlsx -> CSV変換プログラムを書く方法を調べました。
Public Sub main()
On Error GoTo L_Exit
With Selection.ShapeRange.Nodes
On Error Resume Next
Dim i As Integer
For i = 1 To .Count
.SetSegmentType i, msoSegmentLine
.SetEditingType i, msoEditingCorner
Next
End With
L_Exit:
On Error GoTo 0
End Sub |
Public Sub main()
On Error GoTo L_Exit
With Selection.ShapeRange.Nodes
On Error Resume Next
Dim i As Integer
For i = 1 To .Count
.SetSegmentType i, msoSegmentLine
.SetEditingType i, msoEditingCorner
Next
End With
L_Exit:
On Error GoTo 0
End Sub
コンパイルは、
ファイル名を引数に与えると、標準出力にCSVを出力します。エラーは終了コードで通知します。
Excel2CSV.exe sample.xlsx > sample.xlsx.csv
echo %ERRORLEVEL%
0 |
Excel2CSV.exe sample.xlsx > sample.xlsx.csv
echo %ERRORLEVEL%
0
必須コンポーネント
Microsoft Access Database Engine 2010 Redistributable
.NET Framework 2.0 以上?
.NET Framework 4.0向けに コンパイルしたもの Excel2CSV
ただ、COM経由で取得したCSVとは、数値の値が違うことがあります。
原因はDAOを使った場合は、表示書式を適用した後の値しか取得できないためのようです。
たとえば、12345.6789という数値を持つセルに、"小数以下桁数2桁、桁区切り"という書式が設定されている場合、12,345.68が抽出されます。
考え方によってはこの方がいいというケースも、だめなケースもあるかも知れません。
とりあえず、桁区切り(,)の書式はCSVにとって邪魔なので、上記のプログラムでは数値とみなせる文字列は一旦数値に変換しています。
ちなみにxdoc2txtの場合は、桁区切りなし、四捨五入済みの数値を吐きます。
というか、いろいろ実験してたらxdoc2txtの出力ってゴミが入ってたりしてプログラムから後処理するのがめんどくさげ。
そもそも商用ライセンスは1000本単位じゃないと買えないので却下。
あと、xlsxをxlsに変換してExcel2CSVにかけると、可視シートだけが出力されるという微妙な違いもありました。
普通は隠しシートの内容を見たいということはないと思いますが。