[방법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;
}
'기본카테고리' 카테고리의 다른 글
[C#, C++] 컴파일시 특정 warning을 감추고 싶을 때 (0) | 2015.07.23 |
---|---|
[C#] DateTime 변수의 null 사용 방법 (0) | 2015.04.28 |
[C#] 엑셀파일을 데이터그리드컨트롤로(Import Excel File To DataGridView) (0) | 2015.04.23 |
[기하학]이차방정식과 이차함수 (0) | 2015.04.14 |
[기하학]원과 직선의 위치 관계 (0) | 2015.04.14 |