C # Загружаемые файлы Excel из библиотеки классов - PullRequest
0 голосов
/ 21 апреля 2011

Я ищу несколько советов.Я основываюсь на дополнительной возможности проекта 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' ...

Извиняюсь за длинную поясненность объяснения.Я был бы признателен, если бы кто-нибудь мог указать мне верное направление, либо для решения моей текущей проблемы, либо для альтернативного способа сделать эту работу.

1 Ответ

2 голосов
/ 21 апреля 2011

Не увязая в деталях, очевидная ошибка заключается в том, что в GenerateCustomisedSalesFile вы создаете MemoryStream ms, ничего не делаете с ним, а затем возвращаете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...