본문 바로가기
개발언어/C#

[C#] ListView 의 항목들을 Excel 파일로 저장하기

by 창용이랑 2021. 11. 18.
728x90

Objects Library 를 지원하는 모든 제품들은 COM을 통해 쉽게 해당 Object들을 사용할 수 있습니다
이번 글에서는 엑셀의 Obejcts Library를 참조하여 ListView내용을 엑셀파일로 자장하는프로그램을 만들어 볼 것입니다
 
소개
Objects Library 를 지원하는 모든 제품들은 COM을 통해 쉽게 해당 Object들을 사용할 수 있게된다.
이번 아티클에서는 엑셀의 Obejcts Library를 참조하여 ListView내용을 엑셀파일로 저장하는 프로그램을 만들어 볼 것이다.
 

작업진행

[
진행1] 해당 COM 을 프로젝트에 참조하기
- 
아래 그림과 같이 엑셀의 Objects Library를 참조.
  
오피스의 버전에 따라 Object Library 이름이 다를 수 있다
  
저의 경우 오피스 2003입니다
  (
참고 : 오피스 2002의 경우 Microsoft Excel 10.0 Object Library 입니다)

  

 
  
  
[
진행2] ListView 에 항목설정하기
- 항목들을 디자인타임이나 하드코딩으로 추가.
   (
저는 참고로 아래와 같이 추가하였습니다.}

 
  

 

[진행3] 코딩

 //저장하기 Button의 이벤트 코드
private void button1_Click(object sender, System.EventArgs e)
{
	SaveDialogBoxOpen(this.listView1.Items);
}



private void SaveDialogBoxOpen(IList items)
{
	if(items.Count <= 0)
	{
		MessageBox.Show("Excel파일로 저장할 항목이 없습니다");
		return;
	} 

	this.saveFileDialog1.FileName = "test.xls";
	this.saveFileDialog1.Filter = "xls files (*.xls)|*.xls"  ;
	this.saveFileDialog1.FilterIndex = 1;
	this.saveFileDialog1.RestoreDirectory = true;             

	if(this.saveFileDialog1.ShowDialog() == DialogResult.OK)
	{
		string fileName = this.saveFileDialog1.FileName;
		
		try
		{
			this.SaveExcel(items,fileName);
		}
		catch(Exception ex)
		{
			MessageBox.Show("파일 저장중 오류가 발생했습니다." + ex.Message + "\n다시 시도해 주십시요");
		}
	}
}

//실제로 Excel개체로 작업하는 메서드
private void SaveExcel(IList items ,string fileName)
{           
	Excel.Application excel = new Excel.Application();  
	Excel.Workbook excelWorkbook;
	excel.Visible = true;
	excelWorkbook = excel.Workbooks.Add(true);                    

	int columnIndex = 0;

	foreach(ColumnHeader header in this.listView1.Columns)
	{
		columnIndex++;
		excel.Cells[1,columnIndex] = header.Text;
	} 

	int rowIndex = 1;       

	foreach(ListViewItem mainItem in items)
	{
		rowIndex++;
		columnIndex = 0;
		
		foreach(ListViewItem.ListViewSubItem item in mainItem.SubItems)
		{
			columnIndex++;
			excel.Cells[rowIndex,columnIndex] = item.Text;
		}
	}       
	

	excelWorkbook.SaveAs(fileName,Type.Missing , Type.Missing ,Type.Missing ,
		Type.Missing ,Type.Missing , Excel.XlSaveAsAccessMode.xlNoChange ,Type.Missing ,Type.Missing
		,Type.Missing ,Type.Missing ,Type.Missing);      
				

	excelWorkbook.Close(false , Type.Missing  , Type.Missing);
	excel.Quit();
}

 

[진행4] 설명


- 엑셀파일 핸들링의 진행 순서는 다음과 같다.


  -> Excel
의 개체생성

  -> Workbook 개체를 생성된 Excel개체의 Workbooks 컬렉스에 추가
  -> ListView
헤더값을 Cell에 추가

  -> ListView아이템값들을 Cell에 추가

  -> Workbook 닫기

  -> excel 빠져 나가기

 

  코드에서 excel.Cells[1,columnIndex] 부분은 엑셀의 [rowIndex,columnIndex] 파라메타를 가진다.
  
 excel.Cells[1,3] 은 첫번째 row 3째 컬럼의 Cell을 가르키는 것이다.

 

  참고로, 다 저장한 후 엑셀파일을 닫고 싶지 않으면(사용자가 추가의 작업이 필요한 경우등

  맨 아래의,
   excelWorkbook.Close(false , Type.Missing  , Type.Missing);
   excel.Quit();
   
이부분을 삭제(주석).
 
정리
이상 ListView Items를 엑셀로 저장하는 방법에 대해 알아 보았습니다.
물론 원본이  ListView가 아니라 DataTable 위의 코드에서 수정할 부분은 그리 많지 않을 것입니다.
감사합니다.

 

 

출처 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=23&ID=278