我在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文件中写入第二条记录时将其打印并清除。 那么如何维护所有这些要求并在客户端打印机上进行打印?
答案 0 :(得分:1)
您不能*
*除非您要向用户提供他们可以安装的客户端应用程序,然后您可以与之通信,以便它可以使用客户端打印机,或者您的服务器是同一大型网络的一部分(以大学校园为例),并且打印机是共享的,并且服务器可以与打印机联系,那么您将无法成功将服务器打印到网站用户的打印机
创建文件,将文件下载下载给用户,让他们打印;这是他们的问题,不是你的问题。
顺便说一句,您应该考虑使用EPPlus或类似方法在服务器上创建excel文件,而不是互操作。您还可以考虑创建一个网页表版本,该版本包含您当前在excel中放入的所有数据,向用户显示该页面,并在页面加载后使用JavaScript调用其打印过程/显示其打印对话框,然后将网页打印到他们的打印机上