기본카테고리

[C#] 엑셀파일을 출력한다.

DevReff 2015. 4. 23. 13:34




728x90

[방법1]

 

private void BTN_PREVIEW_Click(object sender, EventArgs e)
  {
   Excel.Application xlApp = null;
   Excel._Workbook wb = null;
   Excel.Worksheet ws = null;

   try
   {
    xlApp = new Excel.Application();
    //excelApp.ActivePrinter = PrinterSettings.InstalledPrinters[3];
    wb = xlApp.Workbooks.Add(PrjOutlineFile);
    if (wb == null)
     return;

    xlApp.Visible = true;
    xlApp.Sheets.PrintPreview(true);
   }
   catch (InvalidPrinterException pex)
   {
    MessageBox.Show(pex.Message);
   }
   catch(Exception ex)
   {
    MessageBox.Show(ex.Message);
   }
   finally
   {
    QuitExcel(xlApp, wb, ws);
   }
  }

/// <summary>
  /// 엑셀파일 관련된 개체를 메모리로부터 해제한다.
  /// </summary>
  /// <param name="obj"></param>
  private static void ReleaseExcelObject(object obj)
  {
   try
   {
    if (obj != null)
    {
     System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj);
     obj = null;
    }
   }
   catch (Exception ex)
   {
    obj = null;
    throw ex;
   }
   finally
   {
    GC.Collect();
   }
  }

  //[System.Runtime.InteropServices.DllImport("user32.dll")]///, SetLastError = true)]
  //static extern int GetWindowThreadProcessId(int hWnd, out int ProcessId);
  /// <summary>
  /// 엑셀과 관련된 변수들을 해제한다.
  /// </summary>
  /// <param name="excelApp"></param>
  /// <param name="wb"></param>
  /// <param name="ws"></param>
  private void QuitExcel(Excel.Application xlApp, Excel._Workbook wb, Excel.Worksheet ws)
  {
   GC.Collect();
   GC.WaitForPendingFinalizers();

   wb.Close(false);
   xlApp.Quit();

   // Clean up
   ReleaseExcelObject(ws);
   ReleaseExcelObject(wb);
   ReleaseExcelObject(xlApp);

   System.GC.Collect();
   System.GC.WaitForPendingFinalizers();
   System.GC.Collect();
   System.GC.WaitForPendingFinalizers();

   System.Diagnostics.Process[] PROC = System.Diagnostics.Process.GetProcessesByName("EXCEL");
   foreach (System.Diagnostics.Process PK in PROC)
   {
    /// Process로 실행되고 타이틀이 없는 것을 이용하여 현재 EXCEL.EXE Process를 끝낸다.
    if (PK.MainWindowTitle.Length == 0) 
     PK.Kill();
   } 

}

 

==============================================================================================

[방법2]

 

/// <summary>
  /// 엑셀파일을 출력한다.
  /// </summary>
  /// <param name="sFilePath">엑셀파일의 경로</param>
  /// <param name="sSheetName">엑셀파일의 Sheet Name</param>
  private bool ExcelToPrint(string sFilePath, string sSheetName="")
  {
   Excel.Application excelApp = new Excel.Application();
   Excel.Workbooks wbs = excelApp.Workbooks;
   Excel._Workbook wb = null;
   Excel.Worksheet ws = null;

   try
   {
    excelApp.DisplayAlerts = false;

    wb = wbs.Open(sFilePath, 0, true, 5, "", "", true,
     Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, true, true);

    if (sSheetName.Length > 0)
     ws = (Excel.Worksheet)wb.Sheets[sSheetName];
    else
     ws = (Excel.Worksheet)wb.ActiveSheet;

    //_Workbook.PrintOut(object From /// 인쇄를 시작할 페이지 번호입니다. 이 인수를 생략하면 인쇄가 처음부터 시작됩니다.
    // , Object To     /// 인쇄할 마지막 페이지 번호입니다. 이 인수를 생략하면 마지막 페이지까지 인쇄됩니다.
    // , object Copies    /// 인쇄할 매수입니다. 이 인수를 생략하면 한 부만 인쇄됩니다.
    // , object Preview   /// Microsoft Office Excel에서 개체를 인쇄하기 전에 인쇄 미리 보기를 호출하려면 true이고, 개체를 즉시 인쇄하려면 false(또는 생략)입니다.
    // , object ActivePrinter  /// 활성 프린터의 이름을 설정합니다
    // , object PrintToFile  /// 파일로 인쇄하는 경우 true입니다. PrToFileName이 지정되지 않으면 Excel에서 출력 파일의 이름을 입력하라는 메시지를 표시합니다.
    // , object Collate   /// 여러 장을 한 부씩 인쇄하는 경우 true입니다.
    // , object PrToFileName  /// PrintToFile이 true로 설정되면 이 인수는 인쇄할 파일의 이름을 지정합니다.
    //);
    object printer = Type.Missing; // "프린터명"
    ws.PrintOut(1, Type.Missing, 1, false, printer, false, false, Type.Missing);

    return true;
   }
   catch (Exception ex)
   {
    SS_LABEL.Text = ex.Message;
    SS_PRJOUTLINE.Refresh();
   }
   finally
   {
    QuitExcel(excelApp, wb, ws);
   }

   return false;
  }