2016-04-13 3 views
0

XLSスプレッドシートでセルを取得して文字列配列に割り当て、データを操作して複数のCVSファイルにエクスポートしようとしています。XLSスプレッドシートのクエリ文字列の選択C#

XLSスプレッドシートには関連性のない情報が含まれています。使用可能なデータは17行目から開始されず、列にはデフォルトのSheet1だけの見出しがありません。

私は関連する質問を見て、それを自分で考えてみましたが、成功しませんでした。次のXLSの種類のコードは動作しますが、行の長さがXLSファイルごとに異なり、空の列と行を自動的に引っ張っているので、作業が面倒です。

CODE

public static void xlsReader() 
     { 
      string fileName = string.Format("{0}\\LoadsAvailable.xls", Directory.GetCurrentDirectory()); 
      string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";" + @"Extended Properties='Excel 8.0;HDR=Yes;'"; 
      string queryString = "SELECT * FROM [Sheet1$]"; 


      using (OleDbConnection connection = new OleDbConnection(connectionString)) 
      { 
       OleDbCommand command = new OleDbCommand(queryString, connection); 
       connection.Open(); 
       OleDbDataReader reader = command.ExecuteReader(); 

       int counter = 0; 
       while (reader.Read()) 
       { 
        Console.WriteLine("Line " + counter + ":" + reader[28].ToString()); // Just for testing 
        counter++; 
       } 
      } 

     } 

私は必要なデータを取得するために、ループと策略の束を行うが、との行17からデータを得ることができるクエリ文字列が存在しなければならない可能性があり

たった8列(26列ではなく、18列ではない)ですか?

多くのクエリ文字列の例を試しましたが、開始行インデックスで作業するか、空のデータをフィルタリングするために継ぎ合せることはできません。

答えて

0

これは、Excelファイルをフラットファイルに変換する便利な方法です。

必要に応じて接続文字列のプロパティを変更することができます。私の場合はヘッダーが必要でした。

ご使用のマシンにAccessデータベースエンジンがインストールされている必要があります。私は32ビット版のアプリを開発して以来、私は32ビット版が必要でした。私はあなたもそれが必要になると思う。

フラットファイルの区切り文字をパラメータ化しました。なぜなら、コンマは必要なくパイプ記号を使用していたからです。メソッドの元を呼び出す方法

ConvertExcelToFlatFile(openFileName, savePath, '|'); // pipe delimited

// Converts Excel To Flat file 
    private void ConvertExcelToFlatFile(string excelFilePath, string csvOutputFile, char delimeter, int worksheetNumber = 1) 
    { 

     if (!File.Exists(excelFilePath)) throw new FileNotFoundException(excelFilePath); 
     if (File.Exists(csvOutputFile)) throw new ArgumentException("File exists: " + csvOutputFile); 

     // connection string 
     var cnnStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml; IMEX=1; HDR=NO\"", excelFilePath); 
     var cnn = new OleDbConnection(cnnStr); 

     // get schema, then data 
     var dt = new DataTable(); 
     try 
     { 
      cnn.Open(); 
      var schemaTable = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

      if (schemaTable.Rows.Count < worksheetNumber) throw new ArgumentException("The worksheet number provided cannot be found in the spreadsheet"); 
      string worksheet = schemaTable.Rows[worksheetNumber - 1]["table_name"].ToString().Replace("'", ""); 
      string sql = String.Format("select * from [{0}]", worksheet); 

      var da = new OleDbDataAdapter(sql, cnn); 
      da.Fill(dt); 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      // free resources 
      cnn.Close(); 
     } 

     // write out CSV data 
     using (var wtr = new StreamWriter(csvOutputFile)) // disposes file handle when done 
     { 

      foreach (DataRow row in dt.Rows) 
      { 
       //MessageBox.Show(row.ItemArray.ToString()); 
       bool firstLine = true; 
       foreach (DataColumn col in dt.Columns) 
       { 
        // skip the first line the initial 
        if (!firstLine) 
        { 
         wtr.Write(delimeter); 
        } 
        else 
        { 
         firstLine = false; 
        } 

        var data = row[col.ColumnName].ToString();//.Replace("\"", "\"\""); // replace " with "" 
        wtr.Write(String.Format("{0}", data)); 
       } 
       wtr.WriteLine(); 
      } 
     } 


    } 
+0

はこれを試して、素晴らしい作品!私は接続文字列とデリミタを変更し、結果を生成しました。白いスペースと何百もの空のセルの区切り線をきれいにする方法はありません。あなたの助けてくれてありがとう、私は正しい道に今いることを知っている。 – abflett

+0

@abflett問題ありません。この解決策は私を理解するために私をしばらく持ち込んだ。あなたは私にプラスの担当者と答えを与えることができますか?ありがとう! – Radmation

関連する問題