Я ищу несколько советов.Я основываюсь на дополнительной возможности проекта C #, которую кто-то написал.Решение проекта состоит из веб-приложения MVC с несколькими библиотеками классов.
Я редактирую функцию отчетов о продажах.В исходной сборке сводные отчеты о продажах создавались в веб-приложении.Когда пользователь создает отчет о продажах, в одной из библиотек классов C # вызывается класс Reporting.Я пытаюсь сделать отчеты о продажах загружаемыми в файле Excel, когда пользователь выбирает переключатель.
Вот фрагмент кода из класса Reporting:
public AdminSalesReport GetCompleteAdminSalesReport(AdminSalesReportRequest reportRequest)
{
AdminSalesReport report = new AdminSalesReport();
string dateRange = null;
List<ProductSale> productSales = GetFilteredListOfAdminProductSales(reportRequest, out dateRange);
report.DateRange = dateRange;
if (titleSales.Count > 0)
{
report.HasData = true;
report.Total = GetTotalAdminSales(productSales);
if (reportRequest.Type == AdminSalesReportRequest.AdminSalesReportType.Complete)
{
report.ProductSales = GetAdminProductSales(productSales);
report.CustomerSales = GetAdminCustomerSales(productSales);
report.ManufacturerSales = GetAdminManufacturerSales(productSales);
if (reportRequest.Download)
{
FileResult ExcelDownload = GetExcelDownload(productSales);
}
}
}
return report;
}
Итак, как вы можете видеть, если reportRequest.Download == true, класс должен запустить процесс созданияфайл Excel.Все функции GetAdminSales используют запросы linq для сортировки продаж, если они отображаются на веб-странице.
Поэтому я добавил это вместе с функциями GetAdminSales:
private FileResult GetExcelDownload(List<TitleSale> titleSales)
{
CustomisedSalesReport CustSalesRep = new CustomisedSalesReport();
Stream SalesReport = CustSalesRep.GenerateCustomisedSalesStream(productSales);
return new FileStreamResult(SalesReport, "application/ms-excel")
{
FileDownloadName = "SalesReport" + DateTime.Now.ToString("MMMM d, yyy") + ".xls"
};
}
ичтобы отформатировать лист Excel, я использую библиотеку NPOI, и мой класс форматирования выглядит следующим образом:
public class CustomisedSalesReport
{
public Stream GenerateCustomisedSalesStream(List<ProductSale> productSales)
{
return GenerateCustomisedSalesFile(productSales);
}
private Stream GenerateCustomisedSalesFile(List<ProductSale> productSales)
{
MemoryStream ms = new MemoryStream();
HSSFWorkbook templateWorkbook = new HSSFWorkbook();
HSSFSheet sheet = templateWorkbook.CreateSheet("Sales Report");
HSSFRow dataRow = sheet.CreateRow(0);
HSSFCell cell = dataRow.CreateCell(0);
cell = dataRow.CreateCell(0);
cell.SetCellValue(DateTime.Now.ToString("MMMM yyyy") + " Sales Report");
dataRow = sheet.CreateRow(2);
string[] colHeaders = new string[] {
"Product Code",
"Product Name",
"Qty Sold",
"Earnings",
};
int colPosition = 0;
foreach (string colHeader in colHeaders)
{
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(colHeader);
}
int row = 4;
var adminTotalSales = GetAdminProductSales(productSales);
foreach (SummaryAdminProductSale t in adminTotalSales)
{
dataRow = sheet.CreateRow(row++);
colPosition = 0;
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(t.ProductCode);
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(t.ProductName);
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(t.QtySold);
cell = dataRow.CreateCell(colPosition++);
cell.SetCellValue(t.Total.ToString("0.00"));
}
}
templateWorkbook.Write(ms);
ms.Position = 0;
return ms;
}
Опять-таки, как и прежде, GetAdminSales (GetAdminProductSales и т. д.) содержатся в нижней частикласс, и это просто запросы linq для сбора данных.
Поэтому, когда я запускаю это, я не получаю никаких очевидных ошибок.Сводный отчет о продажах отображается на экране в обычном режиме, но нет документов Excel для загрузки.То, что я сделал, что, возможно, откладывает это, находится в моей библиотеке классов. Я ссылался на dll System.Web.Mvc, чтобы загрузить файл (я не делал этого раньше - и после чтения в сети).У меня сложилось впечатление, что я мог бы использовать его в библиотеке классов).
Когда я отлаживаю код, чтобы получить более четкое представление о происходящем, кажется, что все работает нормально, все нужные данные собираются, но я обнаружил, что с самого начала - MemoryStream ms = newСтрока объявления Memory Stream в моем классе форматирования показывает это (очень скрыто от вас):
ReadTimeout '((System.IO.Stream) (мс)). ReadTimeout' бросил исключение типа 'System.InvalidOperationException 'int {System.InvalidOperationException}
+ {"Тайм-ауты не поддерживаются в этом потоке."} System.SystemException {System.InvalidOperationException}
Я получаю то же самоеfor 'WriteTimeout' ...
Извиняюсь за длинную поясненность объяснения.Я был бы признателен, если бы кто-нибудь мог указать мне верное направление, либо для решения моей текущей проблемы, либо для альтернативного способа сделать эту работу.