WPF 程序填充 Excel 文件,然后单击“打印”按钮打印文档。我以前用Interop.Excel来填写,以前可以,现在报错
(System.InvalidCastException:'无法将类型'Microsoft.Office.Interop.Excel.ApplicationClass'的COM对象转换为接口类型'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);
}
}
我通过切换到EPPLUS nuget包和打印文档的功能成功解决了这个问题:
考虑使用 _Application、_Workbook 和 _Worksheet 类,而不是 Application、Workbook 和 Worksheet。(可能不需要 Add 方法,而不是 Open 方法来打开书本。)
我有这样的代码
适用于两台计算机,Excel 版本 2302 和 2307,64 位。
库“C:\Program Files\Microsoft Office\root\Office16\ADDINS\PowerPivot Excel Add-in\Microsoft.Office.Interop.Excel.dll”。