#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. Я изменил свой код. Таким образом, он будет охватывать ваши проблемы, упомянутые выше.