2011-04-08 12 views
2

私の上司からの仕様に基づいてコードを書いています。多くのExcelデータをプログラムにインポートする必要がありました。 Excelシートの使用範囲をクリップボードにコピーし、それを使って配列に書き込むことでこれを行いました。これはInteropを使用して行われました。これはうまくいっていますし、問題なく約4ヶ月間使用されているコードです。C# - データを配列にコピーする方法

しかし、私はこのコードを書きましたが、私のインターンシップの始めにはあまり考えずに書いていました。私は今、静かな瞬間にそれを再訪問していて、それは私に考えさせました、これを行うにはより良い(より効率的でエレガントな)方法がありますか?今戻ってみると、ちょっとしたハックのようだ。

ありがとうございました。

+0

ジェットがあります:http://www.connectionstrings.com/excel – Blorgbeard

答えて

2

使い方は、Excelの相互運用機能を使用せずに直接ファイルを読むことができますC#のドライバは:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Data.OleDb; 
using System.IO; 

namespace Immo.Areas.Administration.Controllers 
{ 
    public class SomethingSometingExcelClass 
    { 
     public void DoSomethingWithExcel(string filePath) 
     { 

      List<DataTable> worksheets = ImportExcel(filePath); 
      foreach(var item in worksheets){ 
       foreach (DataRow row in item.Rows) 
       { 
        //add to array 
       } 

      } 
     } 
     /// <summary> 
     /// Imports Data from Microsoft Excel File. 
     /// </summary> 
     /// <param name="FileName">Filename from which data need to import</param> 
     /// <returns>List of DataTables, based on the number of sheets</returns> 
     private List<DataTable> ImportExcel(string FileName) 
     { 
      List<DataTable> _dataTables = new List<DataTable>(); 
      string _ConnectionString = string.Empty; 
      string _Extension = Path.GetExtension(FileName); 
      //Checking for the extentions, if XLS connect using Jet OleDB 
      if (_Extension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       _ConnectionString = 
        "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0"; 
      } 
      //Use ACE OleDb 
      else if (_Extension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       _ConnectionString = 
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0"; 
      } 

      DataTable dataTable = null; 

      using (OleDbConnection oleDbConnection = 
       new OleDbConnection(string.Format(_ConnectionString, FileName))) 
      { 
       oleDbConnection.Open(); 
       //Getting the meta data information. 
       //This DataTable will return the details of Sheets in the Excel File. 
       DataTable dbSchema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, null); 
       foreach (DataRow item in dbSchema.Rows) 
       { 
        //reading data from excel to Data Table 
        using (OleDbCommand oleDbCommand = new OleDbCommand()) 
        { 
         oleDbCommand.Connection = oleDbConnection; 
         oleDbCommand.CommandText = string.Format("SELECT * FROM [{0}]", 
          item["TABLE_NAME"].ToString()); 
         using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter()) 
         { 
          oleDbDataAdapter.SelectCommand = oleDbCommand; 
          dataTable = new DataTable(item["TABLE_NAME"].ToString()); 
          oleDbDataAdapter.Fill(dataTable); 
          _dataTables.Add(dataTable); 
         } 
        } 
       } 
      } 
      return _dataTables; 
     } 
    } 
} 
+0

各行の前に4つのスペースを入れてコードを書式設定する必要があります。それを選択し、 '{}'ボタンをクリックすることもできます。 [Markdown Editing Help](http://stackoverflow.com/editing-help)ページのヒントを参考にしてください。 –

+0

長い答えをありがとう。私は今日oleDBで実際に遊んでいます。そして、次の文字列を含むxlsxファイルを使用します。string = "Provider = Microsoft.ACE.OLEDB.12.0;データソース=" +ファイル名+ ";拡張プロパティ= Excel 8.0" conn.Open()にエラーが発生しました。ファイルが正しい形式でないと言っていますか?何か案は?ありがとう –

+0

{0}とstring.formatで私のバージョンを使ってみましたか?そうでない場合は...正しいドライバがIISにインストールされていることを確認してください –

0

はい、間違いなくハックです。 interopを使用して使用範囲を取得すると、その範囲を直接ループして、クリップボードとのやりとりなしに配列に書き込むことができます。これらの線に沿って

何か:

for(int i = 1; i <= sheet.UsedRange.Rows.Count; i++) 
{ 
    for(int j = 1; j <= sheet.UsedRange.Columns.Count; j++) 
    { 
     DoStuffWith(sheet.UsedRange.Cells(i, j).Value) 
    } 
} 
+1

はい、これを試しましたが、セルを個別に読み取っているため速度が遅い(非常に目立ちます)。 –

0

それは大丈夫ハックです。

私は正常にJet接続(http://connectionstrings.com/excel)を使用しました。

もう1つの方法は、ExcelスプレッドシートをCSV形式で保存し、ファイルを自分で読むことです。あなたのスプレッドシートに何が入っているかによって、これは現実的ではないかもしれません。

関連する問題