반응형

C#으로 셀 테두리, 배경, 크기 설정

 

1. 목표

  • 셀의 크기 설정하기

  • 셀 선택하여 테두리 설정하기

  • 셀의 배경색 바꾸기

 

2. 전체 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

//new
using System.Drawing;

namespace chapter_03
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelapp = new Application();
            Workbook wb = excelapp.Workbooks.Add();
            Worksheet ws = wb.Worksheets.Item[1];

            Range rg = ws.Range[ws.Cells[1, 1], ws.Cells[5,5]];
            rg.Value = "123";

            rg.RowHeight = 30;
            rg.ColumnWidth = 20;

            //외곽만
            rg.BorderAround2(Microsoft.Office.Interop.Excel.XlLineStyle.xlDash);
            rg.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;

            //있는 모든 테두리들
            rg.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlDash;
            
            //선중 가는선, 중간선, 굵은선, 점선
            rg.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThick;
            rg.Interior.Color = Color.FromArgb(51, 102, 51); ;


            wb.SaveAs(Filename:@"C:\test\555.xlsx");
            wb.Close();
            excelapp.Quit();
            Marshal.ReleaseComObject(wb);
            Marshal.ReleaseComObject(excelapp);
        }
    }
}

 

3. 뜯어보기

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

using System.Drawing;
  • 기존에 사용되던 두개의 참조 외에 한가지가 추가되었다.

  • 참조 -> 어셈블리에서 System.Drawing을 찾아 추가한다.

  • 셀 색상 선택이나 다음 회에서 나올 폰트 색상 선택시 사용된다.

rg.RowHeight = 30;
rg.ColumnWidth = 20;
  • 행의 셀 너비를 30, 열의 너비를 20으로 설정한다.

rg.BorderAround2(Microsoft.Office.Interop.Excel.XlLineStyle.xlDash);
rg.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
  • rg.BorderAround2는 선택된 셀 범위전체를 기준으로 좌우상하 테두리만(외곽만) 변경한다.

    • 테두리가 XlDash선(---)으로 설정한다.

  • rg.Borders를 이용하여 원하는 곳만 변경도 가능하다.

    • _Borders[Microsoft.Office.Interop.Excel.XlBordersIndes.xlEdgeBottom]를 이용하면 하단부 테두리만 변경된다.

    • xlEdgeTop, xlEdgeLeft, xlEdgeRight 등이 있다

rg.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlDash;
  • 선택된 범위의 모든 테루리에 선 스타일을 적용한다.

rg.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThick;
  • 선택 범위 내에서 선 두께를 설정한다.

* 위의 LineStyle과 Weight는 엑셀 셀 서식에서 보이는 속성값을 설정한다.(아래 그림 빨간 사각형 참조)

  따라서 가장 마지막에 설정된 한가지만 적용이 된다.

 

rg.Interior.Color = Color.FromArgb(51, 102, 51);
  • 셀의 배경색을 설정한다.

  • 위에서 참조한 System.Drawing의 Color.FromArgb를 이용하여 RGB값으로 색을 지정한다.

반응형
반응형

C#으로 셀 병합, 병합 해제 하기

 

 

1. 목표

  • 셀 선택하여 병합하기

  • 셀 병합 해제 방법

 

2. 전체코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace chapter_05
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelapp = new Application();
            Workbook read_wb = excelapp.Workbooks.Open(Filename: @"C:\test\1234.xlsx");
            Worksheet ws = read_wb.Worksheets.Item[2];


            Range rg1 = ws.Range[ws.Cells[12, 1], ws.Cells[12, 2]];
            rg1.Merge();

            Range rg2 = ws.Cells[12, 1];
            rg1.UnMerge();


            read_wb.Save();
            read_wb.Close();
            excelapp.Quit();
            Marshal.ReleaseComObject(rg1);
            Marshal.ReleaseComObject(rg2);
            Marshal.ReleaseComObject(ws);
            Marshal.ReleaseComObject(read_wb);
            Marshal.ReleaseComObject(excelapp);
        }
    }
}

 

 

3. 뜯어 보기

Range rg1 = ws.Range[ws.Cells[12, 1], ws.Cells[12, 2]];
rg1.Merge();
  • 지난 4회에 사용된 "1234.xls를 이용하여 작업한다.

  • 2번 시트의 합계가 있는 행의 "Total"이란 텍스트가 있는 셀을 합치는 방법이다.

  • 셀의 범위를 정하여 "rg1.Merge();"를 이용하여 셀을 병합한다.

  • 셀 병합시 가장 왼쪽 값이 병합된 셀의 내용으로 들어간다. (기본 엑셀의 기능과 동일하다)

Range rg2 = ws.Cells[12, 1];
rg1.UnMerge();
  • 병합된 셀을 다시 나누는 방법이다.

  • 병합된 셀의 첫번째 셀을 선택한 후 UnMerge()를 이용하여 병합을 해제한다.

  • 위의 rg1처럼 병합된 셀 전체 범위(Range)를 이용하여 병합 해제도 가능하다.

  • "rg1.UnMerge()"와 rg2.UnMerge()"는 동일하게 동작한다.

 

반응형
반응형

C#으로 워크시트 셀에 값, 함수 넣기

 

 

1. 목표

  • 셀에 숫자, 텍스트 넣기

  • 엑셀 함수를 넣어 합계 구하기

  • 셀에 랜덤한 숫자를 넣고 합계 구하기 예제

 

2. 전체 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace chapter_003
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelapp = new Application();
            Workbook read_wb = excelapp.Workbooks.Open(Filename: @"C:\test\1234.xlsx");
            Worksheet ws = read_wb.Worksheets.Item[1];


            Range rg1 = ws.Cells[1, 1];
            rg1.Value = "abcd";

            Range rg2 = ws.Cells[1, 2];                       
            rg2.Formula = "=sum(1,2,3,4,5)";


            Console.WriteLine(rg1.Value);
            Console.WriteLine(rg2.Value);


            Console.WriteLine(rg1.Value);


            //예제 만들기
            Worksheet ws2 = read_wb.Worksheets.Item[2];
            Random rand = new Random();

            int i;
            for (i = 1; i <= 10; i++)

            {
                Range rg3 = ws2.Cells[i, 1];
                Range rg4 = ws2.Cells[i, 2];
                Range rg5 = ws2.Cells[i, 3];


                rg3.Value = i;
                rg4.Value = DateTime.Now.ToString();
                rg5.Value = rand.Next(100);

                Marshal.ReleaseComObject(rg3);
                Marshal.ReleaseComObject(rg4);
                Marshal.ReleaseComObject(rg5);
            }
            
            Range rg6 = ws2.Range[ws2.Cells[i + 1, 1], ws2.Cells[i + 1, 2]];
            Range rg7 = ws2.Cells[i + 1, 3];

            rg6.Value = "Total";
            rg7.Formula = "=sum(c1:c10)";


            read_wb.Save();
            read_wb.Close();
            excelapp.Quit();
            Marshal.ReleaseComObject(rg1);
            Marshal.ReleaseComObject(rg2);
            Marshal.ReleaseComObject(rg6);
            Marshal.ReleaseComObject(rg7);
            Marshal.ReleaseComObject(ws);
            Marshal.ReleaseComObject(ws2);
            Marshal.ReleaseComObject(read_wb);
            Marshal.ReleaseComObject(excelapp);
        }
    }
}

 

 

3. 뜯어 보기

Range rg1 = ws.Cells[1, 1];
rg1.Value = "abcd";
  • rg1에 1,1(엑셀 셀 주소로는 A1)을 할당한다.

  • rg1.value로 셀의 내용을 추가한다. (숫자, 텍스트 등... )

  • rg1.value에 함수 값을 그냥 넣을 경우 함수 계산이 제대로 되지 않는다.

Range rg2 = ws.Cells[1, 2];                       
rg2.Formula = "=sum(1,2,3,4,5)";
  • rg2.Formula를 이용하여 셀에 함수값을 넣는다.

  • C#과 무관한 엑셀 함수를 넣어야 계산이 된다.

Worksheet ws2 = read_wb.Worksheets.Item[2];
Random rand = new Random();

int i;
for (i = 1; i <= 10; i++)
{
    Range rg3 = ws2.Cells[i, 1];
    Range rg4 = ws2.Cells[i, 2];
    Range rg5 = ws2.Cells[i, 3];


    rg3.Value = i;
    rg4.Value = DateTime.Now.ToString();
    rg5.Value = rand.Next(100);

    Marshal.ReleaseComObject(rg3);
    Marshal.ReleaseComObject(rg4);
    Marshal.ReleaseComObject(rg5);
}

Range rg6 = ws2.Range[ws2.Cells[i + 1, 1], ws2.Cells[i + 1, 2]];
Range rg7 = ws2.Cells[i + 1, 3];

rg6.Value = "Total";
rg7.Formula = "=sum(c1:c10)";
  • 2번째 워크시트(read_wb.Worksheets.Item[2])에 현재 시간값과 난수를 이용하여 예제를 만든다.

  • rg3, rg4, rg5는 1,2,3열에 각각 번호, 현재 시각, 0부터 100까지의 난수를 입력한다.

  • rg6, rg7을 이용하여 "Total"텍스트 입력과 3열의 값 합계를 계산하는 엑셀 함수를 작성한다.

반응형
반응형

C#으로 엑셀 셀 선택 방법

 

1. 목표

  • 1개의 셀 선택

  • 2개 이상의 셀 범위 선택하기

  • 에러의 경우 살펴보기

 

2. 전체 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace chapter_03
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelapp = new Application();
            Workbook read_wb = excelapp.Workbooks.Open(Filename: @"C:\test\123.xlsx");
            Worksheet ws = read_wb.Worksheets.Item[1];


            Range rg1 = ws.Cells[1, 1];

            Range rg2 = ws.Range["A1"];

            Range rg3 = ws.Range[ws.Cells[1, 1], ws.Cells[3, 3]];


            //에러

            //Range rg2_1 = ws.Range[1, 1];
            //Range rg2_2 = ws.Range[ws.Cells[1,1]];
            //Console.WriteLine(rg3_1);


            read_wb.Close();
            excelapp.Quit();
            Marshal.ReleaseComObject(rg1);
            Marshal.ReleaseComObject(rg2);
            Marshal.ReleaseComObject(rg3);
            Marshal.ReleaseComObject(read_wb);
            Marshal.ReleaseComObject(excelapp);
        }
    }
}

 

 

3. 뜯어 보기

Range rg1 = ws.Cells[1, 1];
  • rg1이란 범위 객체에 셀을 할당한다

  • ws.Cells[1,1]은 1개의 셀만 선택할 때 사용된다.

Range rg2 = ws.Range["A1"];
  • rg2에 범위를 설정한다.

  • 위와 다르게 Ragne를 써서 "A1"이라는 엑셀의 셀 좌표 표현 방식을 그대로 사용한다.

  • "A1:C:4"와 같이 엑셀 함수에서 사용하는 표현법으로 선택도 가능하다.

Range rg3 = ws.Range[ws.Cells[1, 1], ws.Cells[3, 3]];
  • rg3의 범위를 시작 셀과 마지막셀을 이용하여 범위를 선택한다.

  • 1개의 셀을 선택할땐 Cells[1,1]을, 범위를 선택할땐 Range를 사용한다.

//Range rg2_1 = ws.Range[1, 1];
//Range rg2_2 = ws.Range[ws.Cells[1,1]];
  • 두 경우 모두 Range의 매개변수가 잘못되어 에러가 난다.

  • Range는 시작셀과 끝셀이 지정되어야만 한다.

 

 

 

 

반응형
반응형

C#으로 엑셀 워크시트 선택, 생성, 컨트롤

 

 

1. 목표

  • 원하는 워크북 열기

  • 워크시트 수 확인

  • 워크시트 생성, 삭제

  • 워크시트 선택 방법

  • 워크시트 이름 변경

2. 전체 코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace Chapter_02
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelapp = new Application();
            Workbook read_wb = excelapp.Workbooks.Open(Filename: @"c:\test\123.xlsx");

            Console.WriteLine(read_wb.Worksheets.Count);

            Worksheet ws1 = read_wb.Worksheets.Item["sheet1"];
            Worksheet ws2 = read_wb.Worksheets.Item[2];

			ws1.Name = "가나다";
            
            Console.WriteLine("read_wb.Worksheets.Item[\"sheet1\"] = " + ws1.Name);
            Console.WriteLine("read_wb.Worksheets.Item[2] = " + ws2.Name);

            ws2.Delete();
            
            read_wb.Worksheets.Add(After: read_wb.Worksheets[1]);
            read_wb.Worksheets.Add(Before: read_wb.Worksheets[2]);

			read_wb.Save();

            read_wb.Close();
            excelapp.Quit();

            Marshal.ReleaseComObject(ws1);
            Marshal.ReleaseComObject(ws2);
            Marshal.ReleaseComObject(read_wb);
            Marshal.ReleaseComObject(excelapp);
        }
    }
}

 

3. 뜯어 보기

Workbook read_wb = excelapp.Workbooks.Open(Filename: @"c:\test\123.xlsx");
  • 경로(Filename)에 있는 엑셀 파일을 불러 온다.

 

Console.WriteLine(read_wb.Worksheets.Count);
  • 읽어온 워크북(read_wb)에 있는 워크시트의 숫자를 콘솔창에 출력한다.

 

Worksheet ws1 = read_wb.Worksheets.Item["sheet1"];
Worksheet ws2 = read_wb.Worksheets.Item[2];
  • 워크북에 있는 워크시트를 선택하는 방법이다

  • Item["Sheet1"]처럼 시트 명을 이용해서 선택이 가능하다.

  • Item[1]처럼 워크시트의 순서를 이용 할 수 있다. (순서는 1부터 시작한다.)

ws1.Name = "가나다";
  • ws1의 시트 이름을 변경한다.

Console.WriteLine("read_wb.Worksheets.Item[\"sheet1\"] = " + ws1.Name);
Console.WriteLine("read_wb.Worksheets.Item[2] = " + ws2.Name);
  • ws1, ws2의 시트명을 출력하여 변경되었는지 확인한다.

ws2.Delete();
  • ws2 시트를 삭제한다.

read_wb.Worksheets.Add(After: read_wb.Worksheets[1]);
read_wb.Worksheets.Add(Before: read_wb.Worksheets[2]);
  • 시트를 추가한다.

  • 'After : read_wb.Worksheets[1]'은 첫번째 시트 뒤에 새 시트를 생성한다.

  • 'Before : read_wb.Worksheets[2]'는 두번째 시트 앞에 새 시트를 생성한다.

  • 'Count'를 이용하여 여러개의 시트를 한번에 만들 수 있다.

read_wb.Save();

read_wb.Close();
excelapp.Quit();

Marshal.ReleaseComObject(ws1);
Marshal.ReleaseComObject(ws2);
Marshal.ReleaseComObject(read_wb);
Marshal.ReleaseComObject(excelapp);
  • 파일을 세이브하고 엑셀을 닫는다.

  • 'Marshal.ReleaseComObject(ws1)'를 이용하여 사용한 'ws1', 'ws2'객체도 해제(Release) 해주어야 한다.

반응형
반응형

C#으로 엑셀 열기, 저장, 닫기

 

 

1. 목표

  • 엑셀을 사용 할 수 있도록 참조 추가

  • 엑셀 인스턴스 생성

  • 워크북 생성

  • 내용 저장 ( Save(), SaveAs() )

  • 엑셀 프로그램 닫기 (엑셀 릴리즈)

 

2. 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
 
namespace chapter_01
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excelapp = new Application();
            Workbook wb = excelapp.Workbooks.Add();
            
 
            wb.SaveAs(Filename: @"c:\test\123.xlsx");
 
 
            wb.Close();
            excelapp.Quit();
 
            Marshal.ReleaseComObject(wb);
            Marshal.ReleaseComObject(excelapp);
        }
    }
}
 
cs

 

 

3. 뜯어 보기

1
2
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
cs

using Microsoft.Office.Interop.Excel;

  > 엑셀 사용을 위한 참조 추가

     (참조 - COM - Microsoft Excel 16.0 Object Library 체크)

  > 참조 추가는 앞선 글 참고

 

using System.Runtime.InteropServices;

  > 사용한 엑셀 객체들을 해제(Release)를 해주기 위한 참조

 

 

1
2
Application excelapp = new Application();
Workbook wb = excelapp.Workbooks.Add();
cs

Application excelapp = new Application();

  > 엑셀 사용을 위한 인스턴스 생성

 

Workbook wb = excelapp.Workbooks.Add();

  > 엑셀 파일 생성 (워크북 생성)

 

 

1
wb.SaveAs(Filename: @"c:\test\123.xlsx");
cs

wb.SaveAs(Filename: @"c:\test\123.xlsx");

  > 다른 이름으로 저장하기

  > Filename 뒤에 경로와 확장자명 입력

  > wb.Save()의 경우 현재 파일에 저장 (덮어쓰기)

 

 

1
2
3
4
5
wb.Close();
excelapp.Quit();
 
Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(excelapp);
cs

wb.Close();

  > 워크 북 닫기

excelapp.Quit();

  > 엑셀 닫기

 

Marshal.ReleaseComObject(wb);

  > 워크북 닫기 (릴리즈)

Marshal.ReleaseComObject(excelapp);

  > 엑셀 닫기 (릴리즈)

 

* 이중으로 닫는(릴리즈) 이유는 Close(), Quit()만으로 닫히지 않는(해제되지 않는) 객체들이 발생한다.

  (직접 실행되는 것이 아닌 백그라운드에서 실행되어 있다)

  그래서 using System.Runtime.InteropServices;를 참조하여 한번 더 객체를 해제시켜 준다.

반응형

+ Recent posts