2015-04-28 6 views
1

Здравствуйте, и спасибо вам за это по этому вопросу, я пытаюсь изменить активный принтер в соответствии с выбором, который пользователь выбирает в excel. Однако у меня проблемы. По какой-то причине он продолжает давать мне ту же ошибку.C# установка принтера

"Исключение типа 'System.Runtime.InteropServices.COM Exception' произошло в DailyReport.dll, но не был обработан в коде пользователя Исключение из 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

Второй не будет работать из-за косых черт, вам нужно будет использовать xlApp.ActivePrinter = ** @ ** «\\ RR-PS1 \ CORPPRT58-копировальная комната»; Какие имена принтеров отображаются в Windows? –

+0

Я бы предположил, что вам нужно было бы избежать этих обратных косых черт –

+0

. «CORPPRT58-Copier Room on RR-PS1» – user3120232

ответ

0

Правильный ответ (то есть):

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

Важной частью является «Ne00:» Это порт, на котором можно найти этот принтер. Это различно на каждом компьютере и может быть найдено в реестре по адресу HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices.

Другой проблемой является строка конкатенации «включено». Это может быть актуально при работе с английским 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... 
} 
Смежные вопросы