Экспорт в CSV отсутствует первая запись, используя функцию C # - PullRequest
0 голосов
/ 20 июня 2019

При попытке экспорта в CSV все работает, однако в верхнем ряду отсутствует весь экспорт. Эта строка не пропускается при экспорте той же записи в Excel или KML.

Пробовал переписать функцию и добавить строку, но ничего не работает

public FileResult ExportToCSV()
    {
       List<Tuple<String, String>> nameValues = new    
       List<Tuple<string, string>>();
       if (ReportSession.FilterKeys != null)
    {
       nameValues = (List<Tuple<String, String>>)  
       ReportSession.FilterKeys;
    }


       ReportRequestFilter dbr = (ReportRequestFilter)     
       ReportSession.DatabaseRequestFilter;


    List<Report_Packet_History> dplist = GetAllReportData 
    (dbr.Group_Id, dbr.AllowChildgroups, dbr.Device_Id, dbr.user_id,  
    MapLimitConstants.MAX_EXPORT_BULK_ROWS, dbr.Lookback, dbr.periodEnd, 1, 
    dbr.ShowActiveOnly);
    List<Report_Packet_History> dplistreturn = GetFilters(nameValues,  
    dplist);


    //SetReportViewBags(dplist);

    DateTime endDate = dplist.Max(dt => dt.gps_datetime);
    DateTime startDate = dplist.Min(dt => dt.gps_datetime);
    String[] Device = dplist.Select(dt => dt.imei).Distinct().ToArray();
    String[] Group = dplist.Select(dt => dt.user_group_name).Distinct   
    ().ToArray();

    Utility.LocalisedDateTime ldt = ToolBox.ConvertToUserTimezone 
    (DateTime.UtcNow, Session.CurrentUserSettings.time_zone, false,  
    Session.CurrentUserSettings.Locale);


    String fileName = "IRISReport_" + string.Format("{0}_to_{1}",   
    startDate.ToShortDateString(), endDate.ToShortDateString());
    fileName += string.Format(Device.Count() > 1 ? "_Assets_" : "_Asset_"  
     +  
    Device[0]);
    fileName += string.Format(Group.Count() > 0 ? "_Groups_" : "_Group_"    
    +  Group[0]);


    //List<Report_Packet_History> dplistres = GetFilters(nameValues,  
    dplist).Take(MapLimitConstants.MAX_EXPORT_CSV_ROWS).Skip  
    (0).ToList<Report_Packet_History>();

    //Response.Charset = "";

    return GenerateCSV(dplistreturn, fileName + ".csv");

    }

Вот метод GenerateCSV, где заголовок будет установлен в false? У меня первый ряд = правда.

private FileResult GenerateCSV(List<Report_Packet_History> report, String   
        FileName)
                {
                 Type rphType = typeof  
                 (Connector.Models.Report.Report_Packet_History);
                  PropertyInfo[] myField = 
                      rphType.GetProperties().ToArray();

                  Boolean firstRow = true;
                  StringBuilder csvOut = new StringBuilder();

                  MemoryTributary stream = new MemoryTributary();
                  foreach (Report_Packet_History rph in report)
                  {
                      for (int i = 0; i < myField.Length; i++)
                       {
                            if (firstRow)
                            {
                                csvOut.Append(myField[i].Name + ",");
                            }
                            else
                            {
                                if (myField[i].GetValue(rph) == null)
                                {
                                    csvOut. Append("" + ",");
                                }
                                else
                                {
                                    csvOut.Append(myField[i].GetValue  
                                    (rph).ToString() + ",");
                                 }
                              }
                         }
                         csvOut.Append("\r\n");
                         byte[] byteArray = Encoding.UTF8.GetBytes    
                                         (csvOut.ToString());
                         csvOut.Clear();

            stream.Write(byteArray, 0, byteArray.Length);
            firstRow = false;
        }

        stream.Seek(0, SeekOrigin.Begin);
        return File 
                  (stream,System.Net.Mime.MediaTypeNames.Application.Octet, 
                   FileName);
    }

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вы игнорируете первую строку даты вместо того, чтобы писать свой заголовок.

Когда вы запускаете цикл, используя i, он равен нулю. Ваш первый флаг строки также верно. Первая итерация видит флаг первой строки и записывает заголовок, затем сбрасывает флаг. Это нормально. Однако затем код переходит к следующей итерации, которая является ВТОРОЙ строкой данных.

Сначала вы должны написать заголовок, а затем начать циклический просмотр ваших данных.

И для улучшения во всем, посмотрите на File.WriteAllLines();)

0 голосов
/ 20 июня 2019

Первая строка должна быть строкой заголовков, и я предполагаю, что где-то в вашем методе GenerateCSV заголовок записи установлен в false.

...