본문 바로가기

Programing (프로그래밍)/WPF & C# (C Sharp)

WPF & C# - 엑셀 읽기 쓰기 ( Microsoft.Office.Interop.Excel )

728x90
반응형

 

 WPF & C# - 엑셀 읽기 쓰기 ( Microsoft.Office.Interop.Excel )

 

TestEXCEL (1).z01
19.00MB
TestEXCEL (1).z02
19.00MB
TestEXCEL (1).z03
19.00MB
TestEXCEL (1).z04
19.00MB
TestEXCEL (1).zip
1.55MB

 

 

Microsoft.Office.Interop.Excel

 

엑셀을 읽고 쓰는데에는 몇가지가 있다.

일단 마이크로소프트에서 제공하는 'Microsoft.Office.Interop.Excel' 가 있는데,

버전에 따라 되거나 안되거나 하는 부분때문에 꺼리게된다.

'참조추가' 에서 COM 에 있는 Microsoft.Office.Interop.Excel 가 아닌, 어셈블리 > 확장 에 있는 Microsoft.Office.Interop.Excel 을 가져다가 하면 버전 상관없이 11.0 까지는 된다고 하는데,

윈도우 11 인 지금은 잘 모르겠다.

어셈블리에 Microsoft.Office.Interop.Excel 가 안 보인다.

그냥 NuGet 에서 검색해서 썼다.

 

 

MainWindows.xaml

<Window x:Class="TestEXCEL.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestEXCEL"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
        <Grid>
        <StackPanel>
            <Button x:Name="btnOPEN" Height="30" Click="btnOPEN_Click">OPEN</Button>
            <Button x:Name="btnSAVE" Height="30" Click="btnSAVE_Click">SAVE</Button>
            <DataGrid x:Name="dtGrd" AutoGenerateColumns="True" IsReadOnly="False"></DataGrid>
        </StackPanel>

    </Grid>
</Window>

 

 

 

 

MainWindows.xaml.cs

using Microsoft.Office.Interop.Excel;
using Microsoft.Win32;
using System;
using System.Data;
using System.Windows;
using System.Windows.Controls;

namespace TestEXCEL
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnOPEN_Click(object sender, RoutedEventArgs e)
        {

            string filePath = string.Empty;

            OpenFileDialog openFileDialog = new OpenFileDialog
            {
                Filter = "Excel 파일 | *.xls; *.xlsx",
                CheckFileExists = true,
                CheckPathExists = true
            };

            if (openFileDialog.ShowDialog().GetValueOrDefault())
            {
                filePath = openFileDialog.FileName;
            }
            else
            {
                return;
            }


            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook workbook = excelApp.Workbooks.Open(filePath);
            Worksheet sheet = (Worksheet)workbook.Sheets[1];

            // 데이터를 담을 DataTable 생성
            System.Data.DataTable dt = new System.Data.DataTable();

            // 엑셀 파일의 첫 번째 행을 DataTable의 열로 추가
            for (int i = 1; i <= sheet.UsedRange.Columns.Count; i++)
            {
                dt.Columns.Add(((Range)sheet.Cells[1, i]).Value.ToString());
            }

            // 나머지 행을 DataTable에 추가
            for (int i = 2; i <= sheet.UsedRange.Rows.Count; i++)
            {
                DataRow row = dt.NewRow();
                for (int j = 1; j <= sheet.UsedRange.Columns.Count; j++)
                {
                    row[j - 1] = ((Range)sheet.Cells[i, j]).Value;
                }
                dt.Rows.Add(row);
            }

            // DataGridView에 DataTable 바인딩
            if(dtGrd.ItemsSource == null) dtGrd.Items.Clear();
            dtGrd.ItemsSource = dt.DefaultView;

            // Excel 파일 및 COM 객체 해제
            workbook.Close(false);
            excelApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
        }


        private void btnSAVE_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // SaveFileDialog 인스턴스 생성
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "Excel 파일 (*.xls, *.xlsx)|*.xlsx|모든 파일 (*.*)|*.*";
                saveFileDialog.Title = "저장 위치 및 파일 선택";

                // 다이얼로그 표시 및 사용자의 선택 결과 확인
                if (saveFileDialog.ShowDialog() == true)
                {
                    // Microsoft.Office.Interop.Excel을 사용하여 저장
                    string filePath = saveFileDialog.FileName;
                    SaveExcelFile(dtGrd, filePath);
                    MessageBox.Show("파일이 저장되었습니다.", "성공", MessageBoxButton.OK, MessageBoxImage.Information);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"저장 중 오류 발생: {ex.Message}", "오류", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void SaveExcelFile(DataGrid dtGrd, string filePath)
        {
            Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
            Workbook workbook = excelApp.Workbooks.Add(Type.Missing);
            Worksheet sheet = (Worksheet)workbook.ActiveSheet;

            // 헤더 행 추가
            for (int i = 0; i < dtGrd.Columns.Count; i++)
            {
                sheet.Cells[1, i + 1] = dtGrd.Columns[i].Header?.ToString() ?? string.Empty;
            }

            // 데이터 행 추가
            for (int i = 0; i < dtGrd.Items.Count; i++)
            {
                for (int j = 0; j < dtGrd.Columns.Count; j++)
                {
                    var cellValue = (dtGrd.Items[i] as DataRowView)?.Row[j]; // Assuming data binding to DataTable
                    sheet.Cells[i + 2, j + 1] = cellValue != null ? cellValue.ToString() : string.Empty;
                }
            }

            // Excel 파일 저장
            workbook.SaveAs(filePath);
            workbook.Close();
            excelApp.Quit();
        }
    }
}

 

 

 

728x90
반응형