2011-01-22 16 views
9

私はExcelテーブルに変換したいいくつかの表形式のデータを持っています。C#でExcelテーブルを作成する最も簡単な方法は何ですか?

可能なソフトウェア:

  • .NET 4(C#の)
  • にエクセル2010(ExcelのAPIを使用してOKです)
  • は私が

任意のサードパーティのライブラリを使用しませんデータに関する情報:

  • WS
  • 5列、私は現在、ネストされたリストデータ構造を使用していますが、私は、スクリプトの
  • パフォーマンスが重要ではないことを変更することができます私のスクリプトで
  • (非常にシンプルで、通常のテーブル構造)すべての文字列

オンラインで検索すると多くの結果が得られ、OleDb、ADO RecordSetなどを使用するかどうかはわかりません。これらのテクノロジーの中には、私のシナリオでは過剰なもののように見えるものもあれば、時代遅れのようなものもあります。

これを行う最も簡単な方法は何ですか?

を編集します。これは、私がデスクトップに表示する1回限りのスクリプトです。

+0

最も簡単な方法は3番目の部分的なライブラリです:-) "excel automation"を探します。 MSDNなどにいくつかのKB記事があるはずです。 Excel COMインターネットの使用は、ほとんどの/すべてのサードパーティのツールよりも大幅に遅い*であり、サービス以外の環境でも動作することに注意してください。また、「数百万行」これらの限界の近くでどこでも試しました!)、余分なリソース/時間のオーバーヘッドを除外しても - 臨時ではない "今日のいつか"を除外しません:) –

+1

また、このような*シンプルなダンプの場合、CSV - > Excel(手動またはオートメーション)行数は1つずつ(数百万は数百万です!)。もう1つの選択肢は、ストリーミングライターなどを介してXSLX(XML、ちょうど「テンプレート」をつかむ)に直接ダンプすることです。もちろん、これらのステップはサードパーティ製のライブラリには存在しません。 –

+0

Excel 2010のワークシートに表示されている1,048,576行に「数百万行」のフィッティング方法はありますか?私はTylerとAspose.Cells for .NET(開発者エンタープライズサブスクリプション$ 899)のようなサードパーティのライブラリでお金を使うことに同意しています。 – tawman

答えて

5

サードパーティのツールを避け、COMオブジェクトを使用するというあなたの要求に敬意を表して、私はそれをやります。

  1. プロジェクトへの参照を追加:Comオブジェクト Microsoft Excel 11.0。モジュールの追加の
  2. トップ:これがクライアントである場合

    private void DoThatExcelThing() 
    { 
    
        ApplicationClass myExcel; 
        try 
        { 
         myExcel = GetObject(,"Excel.Application") 
        } 
        catch (Exception ex) 
        { 
         myExcel = New ApplicationClass() 
        } 
    
        myExcel.Visible = true; 
        Workbook wb1 = myExcel.Workbooks.Add(""); 
        Worksheet ws1 = (Worksheet)wb1.Worksheets[1]; 
    
        //Read the connection string from App.Config 
        string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["NewConnString"].ConnectionString; 
    
        //Open a connection to the database 
        SqlConnection myConn = new SqlConnection(); 
        myConn.ConnectionString = strConn; 
        myConn.Open(); 
    
        //Establish the query 
        SqlCommand myCmd = new SqlCommand("select * from employees", myConn); 
        SqlDataReader myRdr = myCmd.ExecuteReader(); 
    
        //Read the data and put into the spreadsheet. 
        int j = 3; 
        while (myRdr.Read()) 
        { 
         for (int i=0 ; i < myRdr.FieldCount; i++) 
         { 
          ws1.Cells[j, i+1] = myRdr[i].ToString(); 
         } 
         j++; 
        } 
    
        //Populate the column names 
        for (int i = 0; i < myRdr.FieldCount ; i++) 
        { 
         ws1.Cells[2, i+1] = myRdr.GetName(i); 
        } 
        myRdr.Close(); 
        myConn.Close(); 
    
        //Add some formatting 
        Range rng1 = ws1.get_Range("A1", "H1"); 
        rng1.Font.Bold = true; 
        rng1.Font.ColorIndex = 3; 
        rng1.HorizontalAlignment = XlHAlign.xlHAlignCenter; 
    
        Range rng2 = ws1.get_Range("A2", "H50"); 
        rng2.WrapText = false; 
        rng2.EntireColumn.AutoFit(); 
    
        //Add a header row 
        ws1.get_Range("A1", "H1").EntireRow.Insert(XlInsertShiftDirection.xlShiftDown, Missing.Value); 
        ws1.Cells[1, 1] = "Employee Contact List"; 
        Range rng3 = ws1.get_Range("A1", "H1"); 
        rng3.Merge(Missing.Value); 
        rng3.Font.Size = 16; 
        rng3.Font.ColorIndex = 3; 
        rng3.Font.Underline = true; 
        rng3.Font.Bold = true; 
        rng3.VerticalAlignment = XlVAlign.xlVAlignCenter; 
    
        //Save and close 
        string strFileName = String.Format("Employees{0}.xlsx", DateTime.Now.ToString("HHmmss")); 
        System.IO.File.Delete(strFileName); 
        wb1.SaveAs(strFileName, XlFileFormat.xlWorkbookDefault, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
         XlSaveAsAccessMode.xlExclusive, Missing.Value, false, Missing.Value, Missing.Value, Missing.Value); 
        myExcel.Quit(); 
    
    } 
    
+0

+1のために... uhm ...何か素敵なことを言おうとしています... "質問に答える":p –

+0

これを書いてくれてありがとう、ラップ!私は小さなサンプルでそれを試し、ExcelとのCSVインポートを自動化する方法と比較してみましょう。 – RexE

8

COM相互運用性を使用してを使用しないでください。サードパーティのAPIを使用します。本当に。実際には、このサーバーサイドをやっているならば、あなたは実質的にそうしなければなりません。無料のオプションがたくさんあります。 EPPlusの使用を強く推奨しますが、エンタープライズレベルのソリューションもあります。私はEPPlusをかなりの量使いました。 interopとは異なり、ExcelをマシンにインストールしなくてもExcelファイルを生成することができます。つまり、COMオブジェクトがバックグラウンドプロセスとして悩まされる心配がありません。適切なオブジェクト処分を行っても、Excelプロセスは必ずしも終了するとは限りません。

http://epplus.codeplex.com/releases/view/42439

は、私はあなたがサードパーティのライブラリを避けたいと知っているが、彼らは本当に進むべき道です。マイクロソフトではOfficeの自動化はお勧めしません。それはとにかく自動化されるつもりはありません。

http://support.microsoft.com/kb/257757

ただし、1つのスプレッドシートに「夫婦万行」を挿入再考することをお勧めします。 Excelシートを移入するための最良の方法は、最初にデータを置くことですダウン

+0

XSLXの直接ダンプに関する経験や示唆はありますか? (質問のフォーマットはとても簡単です)。 –

+0

@pst:私はそれをやったことがないし、それをサポートするライブラリについても知りません。それにもかかわらず、OPは多分数百万のレコードを単一のスプレッドシートに挿入することを再考すべきである。 –

+1

+1私の痛みと苦しみのために私はこのためにCOM interopを使用しました。もう一度。 –

1

手...私は、サードパーティ製のDLLはCOMよりもきれいになることに同意しますが、相互運用ルートを行けば2次元文字列配列を取得し、同じ次元のExcelオブジェクトを取得して設定します(range.set_value2(oarray)と思います)。他の方法を使用するのは、非常に遅いです。

finallyブロックで適切なクリーンアップコードを使用していることを確認してください。

2

ご検討のためのいくつかのもの...

using Microsoft.Office.Interop.Excel; 
  • 次のようにイベント・ロジックを追加します。 Interopsの使用には何も問題はありません。 これがサーバー側のソリューションであれば、Interopsを使用しないでください。良い選択肢は、サードパーティーのソリューションが必要ない場合、MicrosoftのOpenXML SDKです。それは無料です。私は最新のものがExcelが持っている同様のオブジェクトモデルを持っていると信じています。ワークブックの生成とサーバーの稼働停止を引き起こす相互運用性の問題を比較すると、はるかに高速です。

  • +0

    現時点で空港にいる愚かなブラウザでは、カットアンドペーストできませんが、オンラインでOpenXML SDK 2のリンクを検索してください。 –

    3

    Excelテーブルを作成する最も簡単な方法は、その構造とデータを含めて実際にHTMLテーブルを作成し、単にファイル名を.xlsとすることでした。

    Excelで変換することはできますが、内容が拡張子と一致しないという警告が表示されます。

    1

    私も読んで、Excelがfollwoing方法ファイルを書き込むことができますMS-アクセスOLE-DBドライバと "Excelへのエクスポート" 実装:

    準備(一度に行う)

    • を作成テンプレートは
    • 名前(すなわち「のMyData」)(ヘッダを含む)データ領域を与える充填されるように、空のデータ領域を持つすべての(ヘッダ、書式、数式、ダイアグラム)を含むExcelファイル

    先のフォルダ

  • に輸出

    • コピーテンプレートファイルを実装するには、データ

    Excel table with Named area "MyData" 
    Name, FamilyName, Birthday 
    
    open System.Data.OleDb.OleDbConnection 
    execute sql "Insert into MyData(Name, FamilyName, Birthday) values(...)" 
    
    を挿入する先のファイルへ
  • 使用のSQLをOLEDBデータベース接続を開きます

    この接続文字列を使用しました

    private const string FORMAT_EXCEL_CONNECT = 
         // @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR={1}"""; 
         @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR={1}"""; 
    
    
        private static string GetExcelConnectionString(string excelFilePath, bool header) 
        { 
         return string.Format(FORMAT_EXCEL_CONNECT, 
          excelFilePath, 
          (header) ? "Yes" : "No" 
          ); 
        } 
    
  • 関連する問題