检索excel.ActivePrinter的端口名称

时间:2013-01-24 11:51:13

标签: c# excel printing wmi wmi-query

嗨,对于在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似乎可以工作。

0 个答案:

没有答案