【问题标题】:How to print multiple excel sheet on client side printer in asp.net mvc?如何在asp.net mvc的客户端打印机上打印多个excel表?
【发布时间】:2019-05-04 05:28:50
【问题描述】:

我在 asp.net mvc 中有一个应用程序。我需要将数据库中的数据写入我存储在我的项目位置的excel表。我正在使用 Microsoft.Office.Interop.Excel dll 对 excel 文件执行操作。并且还使用在服务器端采用默认打印机的 dll 打印该 excel 文件。

因此,如果客户端单击打印按钮,那么也会在服务器端打印机上开始打印,而不是在客户端打印机上,因为我的 excel 进程代码在服务器端。我需要在此处提及它,因为如果客户将选择多个记录复选框,那么根据要求/条件 excel 表更改并根据大量条件在 excel 单元格中打印数据。

因此,现在当客户选择多条记录并单击打印按钮时,我将记录放入 excel 文件中,然后打印该 excel 文件并清理该文件,然后根据要求再次为第 2 条记录启动此过程,依此类推。

所以现在我需要在客户端打印机而不是服务器端打印机上开始打印。我已经在谷歌上检查过这个问题,但几乎他们建议使用第三方 dll 或依赖项。但是,如果可以在不依赖第三方的情况下在客户端打印机上打印,那么这对我们来说是最好的。

所以请建议我应该怎么做才能执行此任务?

public ActionResult Report(List<int> groundIds)
        {
           if (groundIds != null)
            {
                List<GroundWaterSchedulereportModel> gwFormModelLists = new List<GroundWaterSchedulereportModel>();
                GroundWaterModel groundWaterModel = new GroundWaterModel();

                var groundIdsString = string.Join(",", groundIds);
                if(groundIdsString.Length > 0 && groundIdsString.Length < 8000)
                {
                    var list = groundWaterLogic.GroundWaterReport(groundIdsString);
                    var uniqueListVillage = list.Select(q => q.villageName).Distinct();
                    foreach (var itemCode in uniqueListVillage)
                    {
                        int count = 0;
                        bool printed = false;
                        bool headerPrint = false;
                        List<GroundWaterSchedulereportModel> gwUniqueVillageWiseList = list.Where(x => x.villageName == itemCode).ToList();
                        foreach (var item1 in gwUniqueVillageWiseList)
                        {
                            if (count <= 7)
                            {
                                IsOpened(excelFilePath);
                                groundWaterModel.OpenExcel();         //open excel file which is store in project's location                       
                                groundWaterModel.AddDataToExcel(item1, count, headerPrint);     //write data into excel file 
                                groundWaterModel.closeExcel();  //close excel file after write data 
                                if (count == 7)
                                {
                                    printed = true;
                                    PrintMyExcelFile();     //Printing start on server side default printer
                                    groundWaterModel.OpenExcel();   //after print it open excel file again
                                    groundWaterModel.ClearExcel();  //it's clearing cells excel file
                                    groundWaterModel.closeExcel();  //close excel file after clear cells
                                    IsOpened(excelFilePath);
                                    count = -1;
                                }
                                else
                                {
                                    printed = false;
                                    headerPrint = false;
                                }
                                count++;
                            }
                        }
                        if (printed == false)
                        {
                            PrintMyExcelFile();     //Printing start on server side default printer
                            groundWaterModel.OpenExcel();
                            groundWaterModel.ClearExcel();
                            groundWaterModel.closeExcel();
                            IsOpened(excelFilePath);
                            count = -1;
                        }
                    }
                }
                else
                {
                }
            }
            return RedirectToAction("Index");
        }

这是我的功能,它是在默认打印机上打印 excel 文件,它在服务器端使用默认打印机。

void PrintMyExcelFile()
        {
            IsOpened(excelFilePath);
            Excel.Application excelApp = new Excel.Application();

            // Open the Workbook:
            Excel.Workbook wb = excelApp.Workbooks.Open(
                excelFilePath,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            // Get the first worksheet.
            // (Excel uses base 1 indexing, not base 0.)
            Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];

            // Print out 1 copy to the default printer:
            ws.PrintOut(
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing);

            // Cleanup:
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Marshal.FinalReleaseComObject(ws);

            wb.Close(false, Type.Missing, Type.Missing);
            Marshal.FinalReleaseComObject(wb);

            excelApp.Quit();
            Marshal.FinalReleaseComObject(excelApp);
        }

所以我需要在客户端打印机上打印 excel 表。最主要的是,每次我们在 excel 文件中写入记录时,打印并清除它,然后我们再次在 excel 文件中写入第二条记录,打印并清除它。 那么如何维护所有这些要求并在客户端打印机上打印?

【问题讨论】:

    标签: c# excel asp.net-mvc printing


    【解决方案1】:

    你不能*

    *除非您要为用户提供他们可以安装的客户端应用程序,然后您可以与之通信以便它可以使用客户端打印机,或者您的服务器是同一个大型网络的一部分(我是思考大学校园)打印机是,并且打印机是服务器共享和可联系的,那么您将无法成功让您的服务器打印到您的网站用户的打印机

    创建文件,将文件作为下载发送给用户,让他们打印;这是他们的问题,不是你的。

    顺便说一句,您应该考虑使用 EPPlus 或类似工具在服务器上创建您的 excel 文件,而不是互操作。您还可以考虑创建您当前放入 excel 中的任何数据的网页表格版本,向用户显示页面,并在加载后,使用 JavaScript 调用他们的打印过程/显示他们的打印对话框,然后他们将将您的网页打印到他们的打印机上

    【讨论】:

    • 所以,如果我使用 EPPlus 而不是 Interop,那么需要在客户端机器上安装 excel 吗?
    • 如果您希望客户端打印一个 excel 文件,那么客户端机器上需要 excel - 无论您如何在服务器上生成 excel 文件
    • 我感觉你不太明白我的回答,但是.. 我推荐在服务器上使用 EPPlus。它无需在服务器上安装 excel 即可生成与 excel 兼容的文件。不要在服务器环境中使用互操作。这是一个痛苦的世界。一旦您创建了一个 excel 文件(以任何方式)并将其发送给客户端,客户端将需要 EXCEL 或 excel 查看器来打开文件并打印它。服务器端操作没有任何改变。如果您不能确定客户端是否有 excel,请按照我在最后一段中的建议进行操作,并将其改为 HTML 表格,以便他们可以打印网页
    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多