【发布时间】: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