如何在ASP.NET MVC的客户端打印机上打印多个Excel工作表?

时间:2019-05-04 05:28:51

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

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

因此,如果客户端单击“打印”按钮,那么也将在服务器端打印机上而不是在客户端打印机上开始打印,因为我的excel进程代码在服务器端。我要在这里提到它,因为如果客户将选择多个chechkbox记录,则根据需求/条件excel工作表更改并根据很多条件在excel单元中打印数据。

现在,当客户端将选择多个记录并单击“打印”按钮时,我将记录放入excel文件中,然后打印该excel文件并清理该文件,然后根据需要再次为记录2开始此过程,依此类推。 / p>

所以现在我需要开始在客户端打印机而不是服务器打印机上打印。我已经在Google上检查了此问题,但几乎他们都建议使用第三方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文件中写入第二条记录时将其打印并清除。 那么如何维护所有这些要求并在客户端打印机上进行打印?

1 个答案:

答案 0 :(得分:1)

您不能*

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

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

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