Печать Excel с помощью Interop

Кто-нибудь знает, как программно распечатать файл Excel с помощью C # и Excel Interop? Если да, не могли бы вы предоставить код?


person yeahumok    schedule 12.05.2009    source источник


Ответы (3)


Для печати вы можете использовать Worksheet.PrintOut (). Вы можете опустить любой или все необязательные аргументы, передав Тип. Отсутствует. Если вы опустите их все, по умолчанию будет распечатана одна копия с вашего активного принтера. Но вы можете использовать аргументы, чтобы задать количество копий для печати, сортировки и т. Д. См. Справку по Worksheet.PrintOut () для получения дополнительной информации.

Пример, который они показывают в файле справки:

private void PrintToFile()
{
    // Make sure the worksheet has some data before printing.
    this.Range["A1", missing].Value2 = "123";
    this.PrintOut(1, 2, 1, false, missing, true, false, missing);
}

Но если вам не нужно изменять настройки по умолчанию, вы можете просто передать Type.Missing для всех аргументов. Вот пример использования автоматизации для открытия книги Excel, печати первой страницы и завершения работы:

void PrintMyExcelFile()
{
    Excel.Application excelApp = new Excel.Application();

    // Open the Workbook:
    Excel.Workbook wb = excelApp.Workbooks.Open(
        @"C:\My Documents\Book1.xls",
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
        Type.Missing, Type.Missing,Type.Missing,Type.Missing);

    // Get the first worksheet.
    // (Excel uses base 1 indexing, not base 0.)
    Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];

    // Print out 1 copy to the default printer:
    ws.PrintOut(
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
        Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    // Cleanup:
    GC.Collect();
    GC.WaitForPendingFinalizers();

    Marshal.FinalReleaseComObject(ws);

    wb.Close(false, Type.Missing, Type.Missing);
    Marshal.FinalReleaseComObject(wb);

    excelApp.Quit();
    Marshal.FinalReleaseComObject(excelApp);
}

Надеюсь это поможет!

Майк

person Mike Rosenblum    schedule 13.05.2009
comment
вы бы случайно не знали, как показать диалог печати вместо того, чтобы сразу распечатать документ ... не так ли? - person yeahumok; 13.05.2009
comment
Да, но я думаю, вам следует задать еще один вопрос по этому поводу. Ответ требует небольшого пояснения, и сама команда будет плохо выглядеть в комментарии (есть 30 необязательных параметров, для которых вам придется использовать 30 Type.Missings). Это простой ответ, но я думаю, что это немного сложно в комментариях ... Итак, начните новый вопрос, я буду его искать. ;-) - person Mike Rosenblum; 13.05.2009
comment
Пространство имен: System.Runtime.InteropServices - person John M; 04.05.2010
comment
Привет, Джон, верно, пространство имен System.Runtime.InteropServices используется для вызовов Marshal.FinalReleaseComObject для очистки памяти в конце. Он не нужен ни для метода PrintOut, ни для других вызовов объектной модели Excel. Хороший пикап, спасибо. - person Mike Rosenblum; 05.05.2010
comment
Это именно то, что мне нужно сделать, но мне нужно распечатать отдельные листы в Excel на принтере PDF. Однако каждый раз, когда я это делаю, PDF-файл тем или иным образом повреждается. Я пробовал множество принтеров PDF (Adobe, PDF955, PDFCreator, AMYUNI), и все они, похоже, делают одно и то же. Я использовал ваш пример, но безуспешно установил для флагов printername, filename и printofile значение true. Есть идеи, как заставить это работать? - person Karl; 13.02.2012
comment
@MikeRosenblum Этот код работает очень хорошо. Спасибо, что поделились. - person B.K.; 18.04.2015

Важным улучшением является код для выбора принтера, например:

var printers = System.Drawing.Printing.PrinterSettings.InstalledPrinters;

int printerIndex = 0;

foreach(String s in printers)
{
    if (s.Equals("Name of Printer"))
    {
        break;
    }
    printerIndex++;
}

xlWorkBook.PrintOut(Type.Missing, Type.Missing, Type.Missing, Type.Missing,printers[printerIndex], Type.Missing, Type.Missing, Type.Missing);
person daniele3004    schedule 24.03.2016

Все уже предоставленные ответы хороши, но я просто подумал, что сохраню их намного проще, добавив больше возможностей для отображения диалогового окна и определения ориентации страницы для печати.

private void PrintExcel()
{
    string filePath = "C:\file\location\here\";
            Excel.Application excelApp = new Excel.Application();

    // Open Workbook:
    Excel.Workbook wb = excelApp.Workbooks.Open(filePath);

    // Define the orientation for the page
    ((Excel._Worksheet)wb.ActiveSheet).PageSetup.Orientation = Excel.XlPageOrientation.xlLandscape;

    //Decide which worksheet to print
    Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];

    // Option to print with or to show dialogue box
    bool userDidntCancel = excelApp.Dialogs[Excel.XlBuiltInDialog.xlDialogPrint].Show();

    // Option to print out wihtout the dialogue box. 
    // WARNING: Do not use Dialogue option and this at the same time. 
    // It will print the page even if you cancel the dialogue print option.
    ws.PrintOut();

    // Cleanup your code
    GC.Collect();
    GC.WaitForPendingFinalizers();

    Marshal.FinalReleaseComObject(ws);

    wb.Close(false, Type.Missing, Type.Missing);
    Marshal.FinalReleaseComObject(wb);

    // Close/Exit File
    excelApp.Quit();
    Marshal.FinalReleaseComObject(excelApp);

}

Надеюсь, этот бит кому-то поможет. : D

person mw509    schedule 10.06.2020