Распечатать Excel файл C#
Программа WPF заполняет Excel файл и после нажатия кнопки "распечатать" печатает документ. Раньше использовала для заполнения Interop.Excel, раньше работало, но теперь выдает ошибку
(System.InvalidCastException: 'Невозможно привести COM-объект типа "Microsoft.Office.Interop.Excel.ApplicationClass" к интерфейсному типу "Microsoft.Office.Interop.Excel._Application". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{000208D5-0000-0000-C000-000000000046}" возвратил следующую ошибку: Ошибка при загрузке библиотеки. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).')
Теперь использую EPPLUS, но через него нельзя печатать. Другие библиотеки оставляют водный знак. Помогите найти способ распечатать файл без вызова PrintDialog по нажатию кнопки.
private void button1_Click(object sender, EventArgs e)
{
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open("C:\\Users\\Shkwarkel\\Documents\\ExcelHelperFiles\\test5.xlsx");
Microsoft.Office.Interop.Excel.Worksheet ws = xlWorkBook.Worksheets.get_Item(1) as Microsoft.Office.Interop.Excel.Worksheet;
string printerName = GetActivePrinter();
if (printerName != "")
{
PrintExcelSheet(xlApp, ws, printerName);
}
xlWorkBook.Close(true, Type.Missing, Type.Missing);
xlApp.Quit();
}
private static string GetDefaultPrinterName()
{
string default_printer = "";
foreach (string printer in PrinterSettings.InstalledPrinters)
{
if (new PrinterSettings() { PrinterName = printer }.IsDefaultPrinter)
{
default_printer = printer;
}
else
{
default_printer = null;
}
}
return default_printer;
}
internal static string GetPort(string printerName)
{
var devices = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Devices");
try
{
foreach (string name in devices.GetValueNames())
{
if (name == printerName)
{
var value = (String)devices.GetValue(name);
var port = Regex.Match(value, @"(,\w+:)", RegexOptions.IgnoreCase).Value;
port = port.Replace(",", "");
return port;
}
}
}
catch
{
throw;
}
return "";
}
internal static string GetActivePrinter()
{
string printer = GetDefaultPrinterName();
if (printer != "")
{
string port = GetPort(printer);
if (port != "")
return printer + " (" + port + ")";
else
return "";
}
else
return "";
}
internal static void PrintExcelSheet(Excel.Application app, Excel.Worksheet sheet, String activePrinter)
{
try
{
app.ActivePrinter = activePrinter;
sheet.PrintOutEx();
}
catch (Exception e)
{
Console.WriteLine("Print error:\r\n" + e.Message);
}
}
Измененный код:
private void button1_Click(object sender, EventArgs e)
{
Excel._Application xlApp;
Excel._Workbook xlWorkBook;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Add("C:\\Users\\Shkwarkel\\Documents\\ExcelHelperFiles\\test6.xlsx");
Microsoft.Office.Interop.Excel._Worksheet ws = xlWorkBook.Worksheets.get_Item(1) as Microsoft.Office.Interop.Excel._Worksheet;
string printerName = GetActivePrinter();
if (printerName != "")
{
PrintExcelSheet(xlApp, ws, printerName);
}
xlWorkBook.Close(true, Type.Missing, Type.Missing);
xlApp.Quit();
}
internal static void PrintExcelSheet(Excel._Application app, Excel._Worksheet sheet, String activePrinter)
{
try
{
app.ActivePrinter = activePrinter;
sheet.PrintOutEx();
}
catch (Exception e)
{
Console.WriteLine("Print error:\r\n" + e.Message);
}
}