c#设置打印机

时间:2015-04-28 13:37:55

标签: c# excel printing

您好,感谢您在这个问题上的时间,我正在尝试根据用户在excel中选择的选项更改Active Printer。但是我遇到了一些麻烦。由于某种原因,它一直给我同样的错误。

  

“System.Runtime.InteropServices.COM Exception”类型的例外   发生在DailyReport.dll中但未在用户代码Exception中处理   来自HRESULT:0X800A03EC“

我一直在盯着这个错误,我很难找到任何东西,我确实找到了一个链接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";

我已经检查过以确保安装了打印机。如果有人能指出我正确的方向,那将非常感谢!!

2 个答案:

答案 0 :(得分:0)

正确答案是(即):

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...
}

答案 1 :(得分:-1)

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