728x90
반응형
안녕하세요
프로그램에서 Datagridview의 데이터를
엑셀로 내보내기 기능을 많이 사용하여 공통 클래스를 생성 후
호출하여 사용할 수 있도록 코드 정리해 보았습니다.
1. Nuget 패키지 설치
- Microsoft.office.Interop.Exel 을 검색하여 설치
2. Exel Export 클래스 생성
- using Excel = Microsoft.Office.Interop.Excel; (using 선언 필요)
public class ExcelExport
{
//using System.Runtime.InteropServices;
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll", SetLastError = true)]
static extern bool CloseClipboard();
[DllImport("user32.dll", SetLastError = true)]
static extern bool OpenClipboard(IntPtr hWndNewOwner);
public static void Datagridview_ExcelExport(string fileName, DataGridView dgv, string stitle)
{
try
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "Save as Excel File";
//엑셀 문서 형식
sfd.Filter = "Excel Documents (*xls)|*.xls";
sfd.FileName = fileName + ".xls";
if (sfd.ShowDialog() == DialogResult.OK)
{
dgv.MultiSelect = true;
dgv.SelectAll();
DataObject dataobj = dgv.GetClipboardContent();
if (dataobj != null)
{
Clipboard.SetDataObject(dataobj);
}
// using Excel = Microsoft.Office.Interop.Excel;
object misValue = System.Reflection.Missing.Value;
Excel.Application xlexcel = new Excel.Application();
xlexcel.DisplayAlerts = false;
Excel.Workbook xlworkbook = xlexcel.Workbooks.Add(misValue);
Excel.Worksheet xlworksheet = (Excel.Worksheet)xlworkbook.Worksheets.get_Item(1);
try
{
Excel.Range rng = xlworksheet.get_Range("A:AZ").Cells;
rng.NumberFormat = "@";
Excel.Range CR = (Excel.Range)xlworksheet.Cells[1, 1];
CR.Select();
xlworksheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
xlworkbook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive
, misValue, misValue, misValue, misValue, misValue);
xlexcel.DisplayAlerts = true;
xlworkbook.Close(true, misValue, misValue);
//파일닫기
uint processId = 0;
GetWindowThreadProcessId(new IntPtr(xlexcel.Hwnd), out processId);
xlexcel.Quit();
if (processId != 0)
{
System.Diagnostics.Process excelProcess = System.Diagnostics.Process.GetProcessById((int)processId);
excelProcess.CloseMainWindow();
excelProcess.Refresh();
excelProcess.Kill();
}
dgv.MultiSelect = false;
MessageBox.Show("엑셀 파일 생성이 완료되었습니다.");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
xlworkbook.Close();
uint processId = 0;
GetWindowThreadProcessId(new IntPtr(xlexcel.Hwnd), out processId);
xlexcel.Quit();
if (processId != 0)
{
System.Diagnostics.Process excelProcess = System.Diagnostics.Process.GetProcessById((int)processId);
excelProcess.CloseMainWindow();
excelProcess.Refresh();
excelProcess.Kill();
}
}
}
}
catch (Exception e)
{
MessageBox.Show("엑셀이 설치된 PC에서만 출력이 가능합니다.");
}
}
}
3. 엑셀 내보내기(exel Export) 메서드 호출
- 데이터 그리드 뷰에 데이터가 있을 경우에만 엑셀 내보내기
- Datagridview_ExcelExport(string fileName, DataGridView dgv, string stitle) 변수 순서로 입력
private void button1_Click(object sender, EventArgs e)
{
if (dgvprojectstate.Rows.Count > 0)
{
//엑셀 내보내기
ExcelExport.Datagridview_ExcelExport("프로젝트 진행현황", dgvprojectstate, "프로젝트 진행 현황");
}
}
4. Exel Export(엑셀 내보내기) 결과
- 엑셀 내보내기 버튼을 클릭
- 저장하려는 파일의 위치 선택
- 파일이름은 코드에 정의한 이름으로 표시(원하면 변경 가능)
이상 C# Exel Export(엑셀 내보내기) 기능이었습니다.
다음은 C# Exel Import(엑셀 불러오기) 기능에 대하여 포스팅하겠습니다.
728x90
반응형
'소소한 C# 지식' 카테고리의 다른 글
[C#]NTP 서버 - PC 시스템 시간 동기화 프로그램 (4) | 2022.04.20 |
---|---|
[C#/WINFORM]-Datagridview Excel Import(엑셀 불러오기) (2) | 2022.04.20 |
[C#]데이터 포맷(Data Format) 형식 변경 - 숫자, 일자, 시간 (0) | 2022.04.14 |
[C#/WINFORM] C#에서 Word 문서 만들기 및 수정하기 (2) | 2022.04.13 |
[C# Winform]DatagridView 셀 병합 하기 (8) | 2022.04.11 |
댓글