您好,感谢您在这个问题上的时间,我正在尝试根据用户在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";
我已经检查过以确保安装了打印机。如果有人能指出我正确的方向,那将非常感谢!!
答案 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 的默认设置)。最后用打印值设置该值。您还可以更改默认打印机设置。