2017-02-24 8 views
0

こんにちはデータセットとのDataTableの知識や、私が働いている「研究」プロジェクトでAccord.netは、非常に遅い応答

を提供ExcelReaderを有していてもよく、すべてのフォーラムの読者をExcelにSVM分類器を使用してブロブの形状を解析するために、私はプロパティデータの中間記憶にExcel文書を使用しています。これは250.000レコード以上の大きなデータセット(最終的なExcelファイルは100〜200 Mbです)でもかまいませんが、ブロブのイメージファイルをメモリにロードして計算するために、2000レコードのバッチで書き込みを行う必要がありますプロパティ。そのため、私はバッチでxlsxファイルにwrting(追加)しています。これは非常に長い時間がかかります。なぜ私は理解できません。私はこのためのテンプレートとしてAccord.net WebサイトのExcelReaderサンプルを使用しています。ステップは次のとおりです。

  1. ExcelReader db = new ExcelReader(xlsFileName、true、false);
  2. データセットとデータセットを作成する DataSetブック= null; DataTableワークシート= null;
  3. 選択したデータシートをロードします。 ワークシート= db.GetWorksheet(sn); workbook.Tables.Add(worksheet);
  4. それから最後に、私が変更Excelファイルを作成 {

    worksheet.Rows.Add(new object[] { 
         (double)r.area, 
         (double)r.perimeter, 
         ....... 
         (bool)r.qualifies}); 
    
        line++; 
    } 
    
  5. (blobPropertiesレコード中のR) foreachのシートに新しいデータを追加します。古いファイルは上書きされます。

     bool success = CreateExcelFile.CreateExcelDocument(workbook, xlsFileName); 
    

ステップ1から5は限りプロセスへの画像の私のリストに残っ塊があるように繰り返されます。

これは小さなデータセット(< 10.000レコード)でも問題なく動作しますが、大きなデータセットになるとこの処理に数時間かかることがあります。 250.000レコードのデータセットに対して、私はこのループを通して125回繰り返す必要があります。

これは間違っていますか?つまり、これはExcelファイルにデータを追加する方法ではありませんか?私が理解する限り、合計200Mbの250.000レコードは、DataSetまたはDataTableクラスやxlsxファイルではあまりありません。

public void write(string file, string sheetName, int iSheetNR, List<blobProperties> records) 
{ 
    // This method is used to write ; seperated data to a text file readable for excel. It takes in a list of blob-properties and a file name for the project. 
    // A file with the same name and CSV extention is created or appended to. 
    // 
    // string csvFileName = file.Replace(".blb", ".csv"); 

    string xlsFileName = file.Replace(".blb", ".xlsx"); 

    DataSet workbook = null; 
    DataTable worksheet = null; 

    int line = 0; 
    bool xlsFileCreated = false; 

    // initialise Excel file 
    if (File.Exists(xlsFileName)) 
    { 
     // load the existing dataset (workbook) with tables (sheets) 
     ExcelReader db = new ExcelReader(xlsFileName, true, false); 

     string [] sheetList = db.GetWorksheetList(); 

     if (sheetList.Contains(sheetName)) 
     { 
      workbook = new DataSet(); 

      foreach(string sn in sheetList) 
      { 
       worksheet = db.GetWorksheet(sn); 
       workbook.Tables.Add(worksheet); 
      } 
     } 
     else 
     { 
      workbook = new DataSet(); 

      foreach (string sn in sheetList) 
      { 
       worksheet = db.GetWorksheet(sn); 
       workbook.Tables.Add(worksheet); 
      } 

      worksheet = new DataTable(sheetName); 
      workbook.Tables.Add(worksheet); 
      xlsFileCreated = true; 
     } 
     // Set the worksheet to write/append to if the file existed 

     if (workbook.Tables.Contains(sheetName)) 
     { 
      worksheet = workbook.Tables[sheetName]; 
     } 
    } 
    else 
    { 
     // Set the worksheet to write/append to if the file is new 
     workbook = new DataSet(); 
     worksheet = new DataTable(sheetName); 
     workbook.Tables.Add(worksheet); 

     xlsFileCreated = true; 
    } 



    if(xlsFileCreated) 
    { 
     // Define the columns (Headers) 
     worksheet.Columns.Add("area", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("perimeter", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("areaRatio", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("C", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("height", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("width", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("cog.X", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("cog.Y", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("Mx", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("My", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("Ix", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("Iy", Type.GetType("System.Decimal")); 
     worksheet.Columns.Add("NrOfFish", Type.GetType("System.Int32")); 
     worksheet.Columns.Add("idNumber", Type.GetType("System.Int32")); 
     worksheet.Columns.Add("qualifies", Type.GetType("System.Boolean")); 
    } 

    // Write each blob property to the table - one record per id 
    foreach (blobProperties r in records) 
    { 

     // worksheet.Rows.Add(new object[] { (double)r.area, (double)r.perimeter, (double)r.areaRatio, (double)r.C, (double)r.height, (double)r.width, (double)r.cog.X, (double)r.cog.Y, (double)r.Mx, (double)r.My, (double)r.Ix, (double)r.Iy, (int)r.NrOfFish, (int)r.idNumber }); 

     worksheet.Rows.Add(new object[] { 
      (double)r.area, 
      (double)r.perimeter, 
      (double)r.areaRatio, 
      (double)r.C, 
      (double)r.height, 
      (double)r.width, 
      (double)r.cog.X, 
      (double)r.cog.Y, 
      (double)r.Mx, 
      (double)r.My, 
      (double)r.Ix, 
      (double)r.Iy, 
      (int)r.NrOfFish, 
      (int)r.idNumber, 
      (bool)r.qualifies}); 

     line++; 
    } 

    if (xlsFileCreated) 
    { 
     // worksheet.Rows.Add(worksheet); 
    } 

    GC.Collect(); 


    bool success = CreateExcelFile.CreateExcelDocument(workbook, xlsFileName); 

/*

場合(成功) { MessageBox.Show( "成功"、MessageBoxButtons.OK、 "エクセル正常に作成トレーニングデータを使用したファイル")。 } else { MessageBox.Show( "失敗"、 "Excelファイルが作成されていません"、MessageBoxButtons.OK); } */ }

+0

投稿していただきありがとうございます。私は4日間病気になりましたので、ジェットを試してみませんでした。私はそれを日にするつもりです。私は、このコードを実行しているコンピュータにExcelをインストールする必要があるのだろうかと疑問に思います。また、ファイル内のさまざまなシートをどのようにカバーするかを調べる必要があります。すなわち、データセット内の各データテーブルが書き込まれなければならない。 –

+0

MS Excelは必須ではありません。しかし、Excelファイルを読むために必要なMicrosoft Accessデータベースエンジンをインストールする必要があります。試してみてください。 –

+0

他人が好むようにアンウォーサーがあなたのために働いていれば、アップウォークしてください –

答えて

0

DataTableにデータを入力してから、Excelファイルにエクスポートすることができます。

public void Mydata(List<blobProperties> records) 
    { 
     DataTable dataTable = ConvertToDataTable(records); 

     var fileName = string.Format("records_{0}.xls", DateTime.Now.ToString("yyyyMMddHHmmss")); 

     ExportToExcel(dataTable, fileName); 
    } 

    private DataTable ConvertToDataTable<T>(List<T> items) 
    { 
     DataTable dataTable = new DataTable(typeof(T).Name); 

     //Get all the properties 
     PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     foreach (PropertyInfo prop in Props) 
     { 
      //Setting column names as Property names 
      dataTable.Columns.Add(prop.Name); 
     } 
     foreach (T item in items) 
     { 
      var values = new object[Props.Length]; 
      for (int i = 0; i < Props.Length; i++) 
      { 
       //inserting property values to datatable rows 
       values[i] = Props[i].GetValue(item, null); 
      } 
      dataTable.Rows.Add(values); 
     } 

     return dataTable; 
    } 
    private void ExportToExcel(DataTable dataTable, string fileName) 
    { 
     GridView gridView = new GridView(); 
     gridView.DataSource = dataTable; 
     gridView.DataBind(); 
     var response = System.Web.HttpContext.Current.Response; 
     response.ClearContent(); 
     response.Buffer = true; 
     response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName)); 
     response.ContentType = "application/ms-excel"; 
     response.Charset = ""; 
     StringWriter stringWriter = new StringWriter(); 
     HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter); 
     gridView.RenderControl(htmlTextWriter); 
     response.Output.Write(stringWriter.ToString()); 
     response.Flush(); 
     response.End(); 
    } 

プロパティの名前は列ヘッダーになります。

関連する問題