2012年2月22日水曜日

C#でExcel操作の注意

C#やVB.NETからOffice.Interop.Excelを使って、Excelを操作できる。
ただ操作するにはいくつか注意点があるので、記載。




1.生成したオブジェクトは都度、System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)で開放する。都度でなくてもよいが、使いった回数分全て開放しなければプロセスが残る


2.ピリオドを2つ繋げるような使い方をすると、開放できなくなるので、必ず、オブジェクトを生成してから利用する
  例:Excel.Range range = ~;
    range.font.ColorIndex = 3; ←開放できない
    下記のようにする.
    Excel.Range range = ~;
    EXCEL.Font rfont = range.Font;
         rfont.ColorIndex = 3;

3.Rangeで範囲指定したものをDeleteすると、大量のメモリを消費する上に、遅い。行指定するべき。
  例:range.sheet.getrange("A1:Z100")
    range.Delete(Type.Missing);
    は、ダメ。
    削除はできるだけ行単位で行うようにする

    range.sheet.getrange("1:100")
    range.Delete(Type.Missing);


とりあえず、3つ。ほかは思い出したら追記するかも。

Access Schema.iniの作り方

AccessにC#などのプログラムでCSVファイル等をインポートするときに必要なSchema.ini。

昔のAccess(2000とか?)では、エクスポート時にWord Merge Fileとやらを指定すれば、勝手に生成されていたらしいけど、2010ではそんな出力形式が見当たらない・・・

いちいちテキスト開いて書き込んでいくのも面倒だし、生成用のExcelに項目打ち込んでいくのも面倒。

と思っていたら、Windowsの機能で作れることがわかった。


1.コントロールパネル→管理ツール→データソース(ODBC)

2.ファイルDNS→追加→Microsoft Access Text Driver(*.txt,,*.csv)

3.ODBCテキストセットアップで対象のcsvのあるフォルダを指定

4.オプションをクリックし、csvを選んで書式の定義

5.フォルダ内のcsv,txtが表示されるので、選んで列名の見出しをチェックして推量をクリック

6.列に内容が表示されるので、1つずつデータ型等を確認

7.OKを押して完了すると、指定したフォルダ内にschema.iniが生成されている

※schema.iniは上書きされるので注意