C#设置打印机

3
您好,感谢您抽空来看这个问题。我正在尝试根据Excel用户选择的选项更改Active Printer,但是我遇到了一些麻烦。出现了相同的错误提示,原因不明。

“System.Runtime.InteropServices.COMException”类型的异常发生在 DailyReport.dll 中,但未在用户代码中处理 HRESULT:0X800A03EC 的异常

我已经在Google上搜索了这个错误,但是很难找到任何有用的信息。我找到了一个链接COM Exception,他们提供了另一个网站的链接,但似乎当我尝试访问该网站时它无法打开。

我已经尝试过:

xlApp.ActivePrinter = "CORPPRT58-Copier Room on RR-PS1:";

xlApp.ActivePrinter = "\\RR-PS1\CORPPRT58-Copier Room"; 

xlApp.ActivePrinter = "CORPPRT58-Copier Room on RR-PS1";

我已经检查过打印机是否安装,确实已经安装。如果有人能指点一下正确的方向,那就太好了,谢谢!


第二个不起作用是因为斜杠,您需要使用xlApp.ActivePrinter = @"\RR-PS1\CORPPRT58-Copier Room"; 在Windows中显示的打印机名称是什么? - Ron Beyer
我想你需要转义那些反斜杠。 - SierraOscar
它说“CORPPRT58-RR-PS1上的复印室” - 3xGuy
我已经尝试了@'"\...",但是它仍然出现相同的错误。 - 3xGuy
2个回答

2
正确答案是(即):
xlApp.ActivePrinter = "\\\\RR-PS1\\CORPPRT58-Copier Room on Ne00:";

重要的一部分是'Ne00:': 这是打印机所在的端口。它在每台计算机上都不同,并且可以在注册表中找到,路径为HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices

另一个问题是连接字符串'on'。当使用英文Excel时这可能是有效的,但在其他语言环境下需要进行翻译处理!

我也遇到了同样的问题,但我找不到太多完整的示例,所以现在提供我的示例:

// Open excel document
var path = @"c:\path\to\my\doc.xlsx";

Microsoft.Office.Interop.Excel.Application _xlApp;
Microsoft.Office.Interop.Excel.Workbook _xlBook;
_xlApp = new Microsoft.Office.Interop.Excel.Application();
_xlBook = _xlApp.Workbooks.Open(path);
_xlBook.Activate();

var printer = @"EPSON LQ-690 ESC/P2";
var port = String.Empty;

// Find correct printerport
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(path))
{
    if (key != null)
    {
        object value = key.GetValue(printer);
        if (value != null)
        {
            string[] values = value.ToString().Split(',');
            if (values.Length >= 2) port = values[1];
        }
    }
}

// Set ActivePrinter if not already set
if (!_xlApp.ActivePrinter.StartsWith(printer))
{
    // Get current concatenation string ('on' in enlgish, 'op' in dutch, etc..)
    var split = _xlApp.ActivePrinter.Split(' ');
    if (split.Length >= 3)
    {
        _xlApp.ActivePrinter = String.Format("{0} {1} {2}",
            printer, 
            split[split.Length - 2], 
            port);
    }
}

// Print document
_xlBook.PrintOutEx();

我并不知道其他的翻译,所以这个翻译可能还不够完美。如果把'on'翻译成空格,上面的代码就会失败。但是我猜这个解决方法对大多数客户都有效。你可以通过查看ActivePrinter的当前值轻松获取当前连接字符串。

一个更加可靠的方法是去掉打印机名称和指定端口,剩下的就是连接字符串。但是这样你需要循环所有已安装的打印机并检查是否匹配。

另外一个我个人常用的测试是检查此打印机是否在系统中已安装:

if(PrinterSettings.InstalledPrinters.Cast<string>().ToList().Contains(printer)) {
    //Set active printer...
}

谢谢!在我的情况下,这个方法有效: var ap = new Excel.Application(); var doc = ap.Workbooks.Open(...); doc.Activate(); doc.PrintOutEx(1, 1, 1, false, "\\192.168.1.1\MyPrinter", false, false, null); - Michael

-1

首先在控制面板中将目标打印机设置为默认打印机。然后打印xlApp.ActivePrinter并获取其设置(如果您没有设置activeprinter,则应用程序会获取Windows的默认设置)。最后使用打印值设置该值。您可以更改默认打印机设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接