C# 如何在asp.net mvc客户端打印机上打印多张excel工作表?

C# 如何在asp.net mvc客户端打印机上打印多张excel工作表?,c#,excel,asp.net-mvc,printing,C#,Excel,Asp.net Mvc,Printing,我在asp.net mvc中有一个应用程序。其中,我需要将数据库中的数据写入excel表,该表存储在我的项目位置。我正在使用Microsoft.Office.Interop.Excel dll对Excel文件执行操作。还可以使用dll打印excel文件,dll在服务器端使用默认打印机 所以,若客户端单击“打印”按钮,那个么也可以在服务器端打印机上开始打印,而不是在客户端打印机上,因为我的excel进程代码在服务器端。我需要提到这一点,因为如果客户将选择多个记录复选框,那么根据要求/条件,exce

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

所以,若客户端单击“打印”按钮,那个么也可以在服务器端打印机上开始打印,而不是在客户端打印机上,因为我的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表格。最重要的是,每次我们在excel文件中写入记录时,打印并清除它,然后再在excel文件中写入第二条记录,打印并清除它。 那么,如何维护所有这些要求并在客户端打印机上打印呢?

您不能*

*除非你打算为用户提供一个客户端应用程序,他们可以安装,然后你可以与之通信,这样用户就可以使用客户端打印机,或者你的服务器是同一个大规模网络的一部分(我想是大学校园)如果打印机是共享的,并且服务器可以与打印机联系,那么您将无法成功地让服务器打印到网站用户的打印机上

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


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

,因此,如果我使用EPPlus而不是Interop,那么是否需要在客户端计算机上安装excel?如果您希望客户端打印excel文件,则需要在客户端计算机上安装excel-无论您如何操作,都不重要在服务器上生成excel文件我感觉你不太明白我的答案,但是。。我建议在服务器上使用EPPlus。它生成与excel兼容的文件,而不需要在服务器上安装excel。不要在服务器环境中使用互操作。这是一个痛苦的世界。创建excel文件(通过任何方式)并将其发送给客户机后,客户机将需要excel或excel viewer打开并打印该文件。服务器端操作不会改变这一点。如果您不能确定客户机是否有excel,请按照我在最后一段中的建议,将其设置为HTML表格,以便他们可以打印网页
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);
        }