перебор данных для одного или нескольких идентификаторов пользователя и создание нового рабочего листа для каждого пользователя

#c# #asp.net-mvc #excel #npoi

#c# #asp.net-mvc #excel #npoi

Вопрос:

Прямо сейчас мой код возвращает данные из базы данных по идентификаторам пользователей и определенным диапазонам дат. Затем результаты экспортируются в электронную таблицу Excel. если выполняется поиск более одного идентификатора пользователя, мне нужно, чтобы у каждого идентификатора пользователя был собственный рабочий лист в рабочей книге. Прямо сейчас все результаты отображаются на «worksheet1». Буду ли я перебирать результаты и использовать операторы if для проверки более одного уникального идентификатора? и для каждого идентификатора будет создан новый рабочий лист и заполнен данными? Я очень новичок в программировании, и любая помощь была бы отличной.

Контроллер

  [HttpPost]
    public FileResult Export(ReportPhoneSupportVM model)
    {
        ReportPhoneSupportResultTypedView results = new ReportPhoneSupportResultTypedView();
        string[] userIds = model.UserId.Split(',');
        foreach (string userId in userIds)
        {
            int iUserId = 0;
            if (Int32.TryParse(userId, out iUserId))
            {

                RetrievalProcedures.FetchReportPhoneSupportResultTypedView(results, model.FromDate, model.ToDate, iUserId);
            }
        }



var ExcelResults = results;  

    //Create new Excel workbook
    var workbook = new HSSFWorkbook();

    //Create new Excel sheet
    var sheet = workbook.CreateSheet();

    //(Optional) set the width of the columns
    sheet.SetColumnWidth(0, 10 * 256);
    sheet.SetColumnWidth(1, 50 * 256);
    sheet.SetColumnWidth(2, 50 * 256);
    sheet.SetColumnWidth(3, 50 * 256);

    //Create a header row
    var headerRow = sheet.CreateRow(0);

    //Set the column names in the header row
    headerRow.CreateCell(0).SetCellValue("ActivityDate");
    headerRow.CreateCell(1).SetCellValue("Assignment");
    headerRow.CreateCell(2).SetCellValue("Action");
    headerRow.CreateCell(3).SetCellValue("ToFrom");
    headerRow.CreateCell(2).SetCellValue("Result");
    headerRow.CreateCell(3).SetCellValue("Description");

    //(Optional) freeze the header row so it is not scrolled
    sheet.CreateFreezePane(0, 1, 0, 1);

    int rowNumber = 1;

    //Populate the sheet with values from the grid data
    foreach (ReportPhoneSupportResultRow ER in ExcelResults)
    {
        //Create a new row
        var row = sheet.CreateRow(rowNumber  );

        //Set values for the cells
        row.CreateCell(0).SetCellValue(ER.ActivityDate);
        row.CreateCell(1).SetCellValue(ER.Assignment);
        row.CreateCell(2).SetCellValue(ER.Action);
        row.CreateCell(3).SetCellValue(ER.ToFrom);
        row.CreateCell(2).SetCellValue(ER.Result);
        row.CreateCell(3).SetCellValue(ER.Description);
    }

    //Write the workbook to a memory stream
    MemoryStream output = new MemoryStream();
    workbook.Write(output);

    //Return the result to the end user

    return File(output.ToArray(),   //The binary data of the XLS file
        "application/vnd.ms-excel", //MIME type of Excel files
        "GridExcelExport.xls");     //Suggested file name in the "Save as" dialog which will be displayed to the end user

}
  

Ответ №1:

Используйте следующий код:

 var ExcelResults = results; 
string userID = "";
int rowNumber = 1;

//Create new Excel workbook
var workbook = new HSSFWorkbook();
var? sheet = null;

//Populate the sheet with values from the grid data
foreach (ReportPhoneSupportResultRow ER in ExcelResults)
{
    if (ER.UserID != userID)
    {
        //Create new Excel sheet
        sheet = workbook.CreateSheet();

        //(Optional) set the width of the columns
        sheet.SetColumnWidth(0, 10 * 256);
        sheet.SetColumnWidth(1, 50 * 256);
        sheet.SetColumnWidth(2, 50 * 256);
        sheet.SetColumnWidth(3, 50 * 256);

        //Create a header row
        var headerRow = sheet.CreateRow(0);

        //Set the column names in the header row
        headerRow.CreateCell(0).SetCellValue("ActivityDate");
        headerRow.CreateCell(1).SetCellValue("Assignment");
        headerRow.CreateCell(2).SetCellValue("Action");
        headerRow.CreateCell(3).SetCellValue("ToFrom");
        headerRow.CreateCell(2).SetCellValue("Result");
        headerRow.CreateCell(3).SetCellValue("Description");

        //(Optional) freeze the header row so it is not scrolled
        sheet.CreateFreezePane(0, 1, 0, 1);

        userID = ER.UserID; 
        rowNumber = 1;
    }

    //Create a new row
    var row = sheet.CreateRow(rowNumber  );

    //Set values for the cells
    row.CreateCell(0).SetCellValue(ER.ActivityDate);
    row.CreateCell(1).SetCellValue(ER.Assignment);
    row.CreateCell(2).SetCellValue(ER.Action);
    row.CreateCell(3).SetCellValue(ER.ToFrom);
    row.CreateCell(2).SetCellValue(ER.Result);
    row.CreateCell(3).SetCellValue(ER.Description);
}

//Write the workbook to a memory stream
MemoryStream output = new MemoryStream();
workbook.Write(output);

//Return the result to the end user

return File(output.ToArray(),   //The binary data of the XLS file
    "application/vnd.ms-excel", //MIME type of Excel files
    "GridExcelExport.xls");     //Suggested file name in the "Save as" dialog which will be displayed to the end user
  

}

Комментарии:

1. Я получаю сообщение об ошибке Не удается присвоить <null> неявно типизированной локальной переменной в var sheet = null;

2. также другая проблема, идентификатор пользователя — это строка, а не целое число. как это будет работать? Спасибо

3. Я добавил весь контроллер. Я должен был сделать это в первую очередь

4. Я изменил свой код. Таким образом, он будет охватывать ваши проблемы, упомянутые выше.