C# 如何在asp.net mvc客户端打印机上打印多张excel工作表?
我在asp.net mvc中有一个应用程序。其中,我需要将数据库中的数据写入excel表,该表存储在我的项目位置。我正在使用Microsoft.Office.Interop.Excel dll对Excel文件执行操作。还可以使用dll打印excel文件,dll在服务器端使用默认打印机 所以,若客户端单击“打印”按钮,那个么也可以在服务器端打印机上开始打印,而不是在客户端打印机上,因为我的excel进程代码在服务器端。我需要提到这一点,因为如果客户将选择多个记录复选框,那么根据要求/条件,excel表格将发生更改,并根据大量条件在excel单元格中打印数据 所以现在,当客户选择多个记录并单击“打印”按钮时,我会将记录放入excel文件中,然后打印该excel文件并清理该文件,然后根据要求再次启动记录编号2的此过程,依此类推 所以现在我需要开始在客户端打印机而不是服务器端打印机上打印。我在谷歌上查过这个问题,但他们几乎建议使用第三方dll或依赖关系。但是,如果可以在客户端打印机上打印而不依赖第三方,那么它将最适合我们 因此,请建议我应该做些什么来完成这项任务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
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);
}