嗨,对于在excel上工作的打印方法,我需要像这样的printername和端口名称: “打印机在NE3上”就是一个例子。问题是,我使用虚拟打印机并且端口不同,几乎每次我都需要使用它。
程序需要在后台运行,因此不能选择打开对话框进行选择。 我还试图用WMI从WMI中检索端口名称:
protected string FindPrinterWithPort(string printerName)
{
StringBuilder query = new StringBuilder();
query.Append("SELECT * FROM Win32_Printer ");
query.Append("WHERE DeviceID = \""+printerName+"\"");
ObjectQuery objectQuery = new ObjectQuery(query.ToString());
var searcher = new ManagementObjectSearcher(objectQuery);
foreach (ManagementObject mo in searcher.Get())
{
return printerName +" On "+ mo["PortName"];
}
return string.Empty;
}
我收到的端口名称为我提供了虚拟打印机程序的完整路径。 我以前使用下面的方法来更改打印机excel,我总是知道它们应该最终改变,代码既不快也不好,但它工作了一段时间,直到我使它多线程,它只是一个很大的封锁。因为我需要锁定这些方法而不是更改Windows中的默认打印机。
private bool SetPrinterForExcel(string printerName){
string[] ports = new string[]{"Ne00:", "Ne01:", "Ne02:", "Ne03:", "Ne04:",
"Ne05:", "Ne06:", "Ne07:", "Ne08:",
"Ne09:", "Ne10:", "Ne11:", "Ne12:",
"Ne13:", "Ne14:", "Ne15:", "Ne16:",
"LPT1:", "LPT2:", "File:", "SMC100:"};
foreach (string port in ports)
{
string printerWithPort = printerName + " On " + port;
bool success = SetAndTestPrinter(printerWithPort);
if(success)
return true;
}
return false;
}
private bool SetAndTestPrinter(string printerWithPort)
{
try
{
excel.ActivePrinter = printerWithPort;
return true;
}
catch
{
return false;
}
}
任何想法如何检索端口,或者有没有办法从WMI查询我可以得到正确的端口。
提前致谢
编辑:
我还没有得到它的工作,我现在打印的是改变Windows上的默认打印机,然后在我的excel对象上执行print方法。我通过使用:
更改了它 [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetDefaultPrinter(string Name);
我锁定方法并打印。我曾经考虑过尝试锁定并保存ActivePrinter,即使你认为性能也同样糟糕。因为锁定将一直保持到默认打印机更改为止,有时需要长达1秒,在多线程环境中这是一个非常长的锁定。
string printernamewithPort = string.Empty;
lock (ActivePrinterLock)
{
SetDefaultPrinter(printername);
printernamewithPort = excel.ActivePrinter;
}
foreach (Worksheet worksheet in workbook.Worksheets)
{
worksheet.PageSetup.PaperSize = XlPaperSize.xlPaperA4;
worksheet.PageSetup.Orientation = XlPageOrientation.xlPortrait;
worksheet.PageSetup.FitToPagesWide = 1;
worksheet.PageSetup.FitToPagesTall = false;
worksheet.PrintOutEx(ActivePrinter: printernamewithPort,Collate: true, Preview: false, PrintToFile: false);
}
我不知道的是,如果默认打印机立即从另一个线程更改,如果它丢失了给予虚拟打印机的端口。我没有对此进行适当的测试。在正常情况下,我的方法FindPrinterWithPort似乎可以工作。