none
アプリケーションから、複数のエクセルシートを用意し任意のセルに出力する方法について RRS feed

  • 質問

  • おおつの井上です。

    皆様、度々お世話になります。

    早速ですが、質問をさせて下さい。

    アプリケーションから、エクセル・ファイルへの出力を試しています。

    各種過去ログを参考に、下記のコードで希望のセルにデータを書き込み
    エクセルファイルに保存するまで確認できました。
    しかし、残念ながら使い方を理解してではなく、単なる猿まねのレベル
    のため、それぞれのコードの意味が十分理解できていません。

    複数のシートを用意し、任意のシートに出力する方法を知りたいのですが、
    取りあえず、何かヒントでもご教授頂ければありがたいです。

    更に、基本的な事を理解するためにも、詳細の解説が記されている所など
    教えて頂けませんでしょうか。

    どうか、宜しくお願い致します。

    private void button1_Click(object sender, EventArgs e)
        {
          string filePath = "c:\\test.xls";
    
          Microsoft.Office.Interop.Excel.Application xlsApplication = null;
          Microsoft.Office.Interop.Excel.Workbooks xlsBooks = null;
          Microsoft.Office.Interop.Excel.Workbook xlsBook = null;
          Microsoft.Office.Interop.Excel.Sheets xlsSheets = null;
          Microsoft.Office.Interop.Excel.Worksheet xlsSheet = null;
          Microsoft.Office.Interop.Excel.Range xlsRange = null;
    
          xlsApplication = new Microsoft.Office.Interop.Excel.Application();
          xlsApplication.DisplayAlerts = false;
          xlsBooks = xlsApplication.Workbooks;
          xlsBook = xlsBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
          xlsSheets = xlsBook.Worksheets;
          xlsSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlsSheets[1];
          xlsSheet.Name = "sheetName (test)";
    
        // cell 書き込み
    
          xlsRange = (Microsoft.Office.Interop.Excel.Range)xlsSheet.Cells[2, 2];
          xlsRange.NumberFormatLocal = "@";
          xlsRange.Value2 = "Cell 2-2";
    
        // 保存  
    
          xlsBook.SaveAs(filePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet, null, null, null, null,
                       Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
    
        // オブジェクト解放
    
          ReleaseComObject((object)xlsRange);
          ReleaseComObject((object)xlsSheet);
          ReleaseComObject((object)xlsSheets);
          xlsBook.Close(true, filePath, false);
          ReleaseComObject((object)xlsBook);
          ReleaseComObject((object)xlsBooks);
          xlsApplication.Quit();
          ReleaseComObject((object)xlsApplication);
        }
    
    2010年8月2日 5:28

回答

  • 複数のシートを追加する方法は、下記URLが参考なると思います。

    http://www.din.or.jp/~graywing/csharp_excel.html#SHEET_INSERT

    任意のシートに出力するのは、

    xlsSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlsSheets[1]
    
    

    みたいに、インデクサでシートを取得して操作すればいいかと。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月2日 6:25
  • それにしても参考にされているコードがなんというか。

    VS2010向けに書くと

    var application = new Application { DisplayAlerts = false };
    var books = application.Workbooks;
    var book = books.Add(XlWBATemplate.xlWBATWorksheet);
    var sheets = book.Worksheets;
    Worksheet sheet = sheets[1];
    sheet.Name = "sheetName (test)";
    
    // cell 書き込み
    Range range = sheet.Cells[2, 2];
    range.NumberFormatLocal = "@";
    range.Value2 = "Cell 2-2";
    
    // 保存
    book.SaveAs(filePath, XlFileFormat.xlXMLSpreadsheet, AccessMode: XlSaveAsAccessMode.xlNoChange);
    book.Close(true, filePath, false);
    application.Quit();
    
    

    ほとんど一緒ですがVS2008向けに書くと

    var application = new Application { DisplayAlerts = false };
    var books = application.Workbooks;
    var book = books.Add(XlWBATemplate.xlWBATWorksheet);
    var sheets = book.Worksheets;
    var sheet = (Worksheet)sheets[1];
    sheet.Name = "sheetName (test)";
    
    // cell 書き込み
    var range = (Range)sheet.Cells[2, 2];
    range.NumberFormatLocal = "@";
    range.Value2 = "Cell 2-2";
    
    // 保存
    book.SaveAs(filePath, XlFileFormat.xlXMLSpreadsheet, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    	XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    book.Close(true, filePath, false);
    application.Quit();
    
    

    ところで拡張子は.xlsなのに保存形式はxlXMLSpreadsheetなのでしょうか?

    2010年8月2日 7:24
  • との事ですが、かなり陳腐化した書き方になるのでしょうかね。
    過去ログから探し出したもので、いつ頃のものだったか・・・

    陳腐化というか、VB6向けに書かれたコードを見よう見まねでC#に書き直した印象です。おかげで、.NETではType.Missingを指定すべきところがnullになっていたりと間違っています。

    var application = new Application { DisplayAlerts = false };の行だけ
    参照が不足になってしまいます。

    var application = new Microsoft.Office.Interop.Excel.Application { DisplayAlerts = false };
    と書く事で、問題は解消して、ビルド/実行共に旨くいきました。

    どこに間違いがあるのでしょうか。

    エラーメッセージを読み返してください。参照不足とは言っていません。
    # 私自身はコンソールアプリケーションで試していたので、このエラーに遭遇しませんでした。が、WinFormだと発生しますね。

    それから、保存形式についてですが、

    XlFileFormat 列挙型のメンバーを見ると、Excel 5.0:xlExcel5 までしか無い
    のですが、これを設定しておけば宜しいのでしょうか。

    また、xlXMLSpreadsheet のExcel シート形式とは、どんな形式のファイルを言うのでしょうか?

    XlFileFormat列挙型 に一通り並べられています。あとはExcelの「名前を付けて保存」ダイアログのファイル形式と見比べて何がどれに当たるか想像するといいでしょう。

    2010年8月2日 14:41

すべての返信

  • 複数のシートを追加する方法は、下記URLが参考なると思います。

    http://www.din.or.jp/~graywing/csharp_excel.html#SHEET_INSERT

    任意のシートに出力するのは、

    xlsSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlsSheets[1]
    
    

    みたいに、インデクサでシートを取得して操作すればいいかと。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月2日 6:25
  • それにしても参考にされているコードがなんというか。

    VS2010向けに書くと

    var application = new Application { DisplayAlerts = false };
    var books = application.Workbooks;
    var book = books.Add(XlWBATemplate.xlWBATWorksheet);
    var sheets = book.Worksheets;
    Worksheet sheet = sheets[1];
    sheet.Name = "sheetName (test)";
    
    // cell 書き込み
    Range range = sheet.Cells[2, 2];
    range.NumberFormatLocal = "@";
    range.Value2 = "Cell 2-2";
    
    // 保存
    book.SaveAs(filePath, XlFileFormat.xlXMLSpreadsheet, AccessMode: XlSaveAsAccessMode.xlNoChange);
    book.Close(true, filePath, false);
    application.Quit();
    
    

    ほとんど一緒ですがVS2008向けに書くと

    var application = new Application { DisplayAlerts = false };
    var books = application.Workbooks;
    var book = books.Add(XlWBATemplate.xlWBATWorksheet);
    var sheets = book.Worksheets;
    var sheet = (Worksheet)sheets[1];
    sheet.Name = "sheetName (test)";
    
    // cell 書き込み
    var range = (Range)sheet.Cells[2, 2];
    range.NumberFormatLocal = "@";
    range.Value2 = "Cell 2-2";
    
    // 保存
    book.SaveAs(filePath, XlFileFormat.xlXMLSpreadsheet, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    	XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    book.Close(true, filePath, false);
    application.Quit();
    
    

    ところで拡張子は.xlsなのに保存形式はxlXMLSpreadsheetなのでしょうか?

    2010年8月2日 7:24
  • なかむら様、早速のアドバイス有難うございました。

    Worksheets.Add メソッドを使って、シートの追加を試みています。

    リファレンスによりますと、引数Before/After は省略可能となっていますが、
    "," のみでは、「引数がありません」となってしまいます。
    省略するにはどうすれば良いのでしょうか?

    教えて頂いた資料では、【Missing.Value】の様ですが、手元の環境では受け
    付けられません。

    申し遅れましたが当方の環境は、OS:Windows7/Visual Studio C# Express版です。

    重ねての質問になりますが、よろしくお願いします。

     

    追記しました。

    佐祐理さんに頂いたソースでテストして見ました。

    ソースの他の部分を参考に、省略に【Type.Missing】を使ったところ、旨くシートの
    追加ができました。

    これで良いのか、たまたま旨く行っているのか少し気になります。
    間違っているようでしたら、アドバイスを頂けませんでしょうか

    どうぞ、よろしくお願いいたします。

    2010年8月2日 14:08
  • 佐祐理さん、ご回答頂き有難うございます。

    >それにしても参考にされているコードがなんというか。

    との事ですが、かなり陳腐化した書き方になるのでしょうかね。
    過去ログから探し出したもので、いつ頃のものだったか・・・

    まぁ、やってる私が既に還暦を越えている事からすれば、まぁ良いかな・・
    と言いたい所ですが、教えて頂いたサンプルの方が大分すっきりして分かり
    やすそうなので早速乗り換えようと思っています。

    そこで、また質問になりますが、どうかよろしくお願いします。


    頂いたソースで確認を行いました。 その際、

    using Microsoft.Office.Interop.Excel; を入れたのですが、

    var application = new Application { DisplayAlerts = false };の行だけ
    参照が不足になってしまいます。

    var application = new Microsoft.Office.Interop.Excel.Application { DisplayAlerts = false };
    と書く事で、問題は解消して、ビルド/実行共に旨くいきました。

    どこに間違いがあるのでしょうか。

    それから、保存形式についてですが、

    XlFileFormat 列挙型のメンバーを見ると、Excel 5.0:xlExcel5 までしか無い
    のですが、これを設定しておけば宜しいのでしょうか。

    また、xlXMLSpreadsheet のExcel シート形式とは、どんな形式のファイルを言うのでしょうか?

    質問ばかりになってしまいましたが、ご教授頂ければ有り難いです。
    どうぞ、よろしくお願いいたします。

    2010年8月2日 14:18
  • との事ですが、かなり陳腐化した書き方になるのでしょうかね。
    過去ログから探し出したもので、いつ頃のものだったか・・・

    陳腐化というか、VB6向けに書かれたコードを見よう見まねでC#に書き直した印象です。おかげで、.NETではType.Missingを指定すべきところがnullになっていたりと間違っています。

    var application = new Application { DisplayAlerts = false };の行だけ
    参照が不足になってしまいます。

    var application = new Microsoft.Office.Interop.Excel.Application { DisplayAlerts = false };
    と書く事で、問題は解消して、ビルド/実行共に旨くいきました。

    どこに間違いがあるのでしょうか。

    エラーメッセージを読み返してください。参照不足とは言っていません。
    # 私自身はコンソールアプリケーションで試していたので、このエラーに遭遇しませんでした。が、WinFormだと発生しますね。

    それから、保存形式についてですが、

    XlFileFormat 列挙型のメンバーを見ると、Excel 5.0:xlExcel5 までしか無い
    のですが、これを設定しておけば宜しいのでしょうか。

    また、xlXMLSpreadsheet のExcel シート形式とは、どんな形式のファイルを言うのでしょうか?

    XlFileFormat列挙型 に一通り並べられています。あとはExcelの「名前を付けて保存」ダイアログのファイル形式と見比べて何がどれに当たるか想像するといいでしょう。

    2010年8月2日 14:41
  • 佐祐理さん、こんばんわ!

    お返事頂いているのに気づくのが遅くなってしまい、
    大変失礼しました。

    今日は、色々とお教え頂き有難うございました。
    お示し下さいましたソースを活用させて頂きます。
    これを元に、Worksheets.Add メソッドを使ってシートの追加も
    旨くできるようになり、大きく前進しました。

    皆さん、どうも有難うございました。
    今後とも、どうぞよろしくお願いいたします。

    このスレッドは、これで一旦クローズさせて頂きます。

    2010年8月2日 17:49