2017-04-25 64 views
0

因此,我的報告正好打印出我想要的(幾乎)。現在我只需要完成一項功能。我有一個數字被生成並放入一個稱爲百分比的變量中。基於int值將隨機行導出爲ex​​cel文件

百分比等於數據庫中allAttendeeLicenseNos拉入的所有許可證的舍入數乘以用戶輸入的數字乘以0.01以使其成爲百分比。

所以我的目標是看到所有與會者,並說好的這個人只想要他們的百分比,但是哪一個並不重要,所以我要抓取隨機行直到百分比數字在那裏。

再次請耐心等待,因爲我對C#非常陌生並且在學習。

 var percentage = Math.Round(allAttendeeLicenseNos.Count() * Percentage * 0.01); 

     var allAttendeeData = _mii.LicenseeRecords.Where(r => allAttendeeLicenseNos.Contains(r.LicenseNumber)).Where(i => i.LicenseStatus.Equals(chosenLicenseStatus)).ToList(); 

     var retval = _mapper.Map<List<DLILicense>, List<RandomAuditViewModel>>(allAttendeeData); 

     using (var exs = new ExcelPackage()) 
     { 
      var worksheet = exs.Workbook.Worksheets.Add("RandomAuditReport"); 
      var row = 1; 
      var col = 1; 

      var properties = typeof(RandomAuditViewModel).GetProperties(); 
      foreach (var field in properties) 
      { 
       worksheet.Cells[row, col].Style.Font.Bold = true; 
       var displayName = field.GetCustomAttribute<DisplayAttribute>() != null ? 
        field.GetCustomAttribute<DisplayAttribute>().GetName() : 
        field.Name; 
       worksheet.SetValue(row, col, displayName); 
       col++; 
      } 
      col = 1; 
      row++; 


      retval.ForEach(i => 
      { 

       var periodOrdinal = _ce.Events 
        .Where(e => e.Attendees.Select(a => a.LicenseNumber).Contains(i.LicenseNumber)) 
        .Select(e => e.Course.CertificationPeriod) 
        .OrderBy(p => p.StartDate) 
        .ToList() 
        .IndexOf(thePeriod) + 1; 

       i.MetRequirements = determineIfCeMet(i.LicenseNumber, i.LicenseTypeCode, i.DateOfOriginalLicensure, periodOrdinal, thePeriod.Id, thePeriod.EndDate, thePeriod.Board); 

       foreach (var field in properties) 
       { 
        if (field.GetCustomAttribute<DataTypeAttribute>().DataType.Equals(DataType.Date)) 
        { 
         var value = ((DateTime)field.GetValue(i)); 
         worksheet.Cells[row, col].Style.Numberformat.Format = "MM/dd/yyyy"; 
         worksheet.Cells[row, col].Formula = "=DATE(" + value.Year + "," + value.Month + "," + value.Day + ")"; 
        } 
        else worksheet.SetValue(row, col, field.GetValue(i)); 
        col++; 
       } 
       col = 1; 
       row++; 

      }); 
      return exs.GetAsByteArray(); 

回答

0

像下面這樣的東西?

retval.ForEach(i => 
     { 
      if(retval.IndexOf(i) == percentage) 
       break; 

      var periodOrdinal = _ce.Events 
       .Where(e => e.Attendees.Select(a => a.LicenseNumber).Contains(i.LicenseNumber)) 
       .Select(e => e.Course.CertificationPeriod) 
       .OrderBy(p => p.StartDate) 
       .ToList() 
       .IndexOf(thePeriod) + 1; 

      i.MetRequirements = determineIfCeMet(i.LicenseNumber, i.LicenseTypeCode, i.DateOfOriginalLicensure, periodOrdinal, thePeriod.Id, thePeriod.EndDate, thePeriod.Board); 

      foreach (var field in properties) 
      { 
       if (field.GetCustomAttribute<DataTypeAttribute>().DataType.Equals(DataType.Date)) 
       { 
        var value = ((DateTime)field.GetValue(i)); 
        worksheet.Cells[row, col].Style.Numberformat.Format = "MM/dd/yyyy"; 
        worksheet.Cells[row, col].Formula = "=DATE(" + value.Year + "," + value.Month + "," + value.Day + ")"; 
       } 
       else worksheet.SetValue(row, col, field.GetValue(i)); 
       col++; 
      } 
      col = 1; 
      row++; 

     }) 

如果你想利用這個

如果(retval.IndexOf(I)==百分比) 休息;

以確定您是否已達到百分比,然後突破ForEach。

+0

我會使用if語句還是會使while語句更好? – CheezStix

+0

你最終會得到相同的結果,方式。我會選擇if,因爲你需要迭代記錄。因此,如果你使用while循環,你仍然需要一個整數來計算你所在的行,並將其與百分比進行比較:「while(myRowCountingInteger <= Percentage)」,然後在循環結束時,你會得到「myRowCountingInteger ++ 「所以你不會真的爲自己節省很多麻煩,所以我認爲當你回來幾個月後,如果陳述更容易閱讀,並需要弄清楚你在做什麼。 –

+0

也想指出,這不是給你「隨機」行,它只是給你第一個這麼多,以滿足百分比的要求。 –