[개발] C#, .Net

[C#, Spread] 엑셀 바로 실행하는 참고 코드, How to showExcel Program

  • -
반응형

해당 글은 엑셀 파일은 저장하는 로직이 아닌, 바로 엑셀 프로그램을 실행하고 싶을때 참고할만한 코드입니다 :)

 

언제 사용하는가?

: 엑셀버튼 클릭 했을 때 Spread 정보를 바로 엑셀에 옮김과 동시에 엑셀프로그램을 바로 실행하고 싶을때 사용

즉, Spread의 정보를 엑셀 프로그램으로 바로 실행하고 싶을때 사용하는 코드

< >

엑셀 파일로 저장하는 건 아님

public static void ShowExcel(FpSpread fpSpread, string title = "")
{
    Excel.Application excelApp = null;
    Excel.Workbook workbook = null;
    Excel.Worksheet worksheet = null;

    try
    {
        excelApp = new Excel.Application();
        excelApp.Visible = false;
        workbook = excelApp.Workbooks.Add();
        worksheet = (Excel.Worksheet)workbook.Sheets[1];

        // 컬럼 셀의 숫자 형식
        worksheet.Columns.NumberFormat = "0"; //@ : 텍스트 형식

        // 스프레드 복제
        FarPoint.Win.Spread.FpSpread spread = new FarPoint.Win.Spread.FpSpread();
        spread.Sheets.Add(fpSpread.Sheets[0].Clone());

        // 첫번째 줄 제목 세팅
        if (!string.IsNullOrEmpty(title))
        {
            SetSpreadTitle(spread, title);
        }

        // 헤더 입력
        var columnHeader = spread.Sheets[0].ColumnHeader;
        int headerRowCount = columnHeader.Rows.Count;

        for (int row = 0; row < headerRowCount; row++)
        {
            for (int col = 0; col < columnHeader.Columns.Count; col++)
            {
                // 헤더 셀 값 설정
                var cell = worksheet.Cells[row + 1, col + 1];
                cell.Value = columnHeader.Cells[row, col].Text;
                // 헤더 셀 가운데 정렬
                cell.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
            }
        }

        int rowCount = spread.Sheets[0].RowCount;
        int columnCount = spread.Sheets[0].ColumnCount;
        object[,] cellValues = new object[rowCount, columnCount];

        for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
        {
            for (int colIndex = 0; colIndex < columnCount; colIndex++)
            {
                object cellValue = spread.Sheets[0].Cells[rowIndex, colIndex].Value;
                string formattedValue = "";

                if (cellValue != null)
                {
                    string stringValue = cellValue.ToString();

                    if (IsNumericWithCommas(stringValue))
                    {
                        // 천단위 컴마가 포함된 숫자인 경우
                        formattedValue = stringValue;
                    }
                    else
                    {
                        formattedValue = stringValue;
                    }
                }

                Excel.Range cell = worksheet.Cells[rowIndex + headerRowCount + 1, colIndex + 1];
                cell.Value = formattedValue;

                // 숫자일 경우에만 숫자 형식 적용
                if (!string.IsNullOrEmpty(formattedValue) && IsNumericWithCommas(formattedValue))
                {
                    cell.NumberFormat = "#,##0"; // 천단위 컴마를 적용한 숫자 형식
                }

                cellValues[rowIndex, colIndex] = formattedValue;
            }
        }

        // Excel에 배열 값 할당
        Excel.Range startCell = worksheet.Cells[headerRowCount + 1, 1];
        Excel.Range endCell = worksheet.Cells[headerRowCount + rowCount, columnCount];
        Excel.Range writeRange = worksheet.Range[startCell, endCell];

        writeRange.Value = cellValues;

        // 컬럼 자동 맞춤
        worksheet.Columns.AutoFit();

        // 변경 사항 저장 팝업 미표시
        workbook.Saved = true;

        // 엑셀 표시
        excelApp.Visible = true;
    }
    catch (Exception ex)
    {
        MCComm.Log(MCComm.ELogType.ERROR, ex.Message, ex);
    }
    finally
    {
        // Excel 인스턴스 해제
        if (worksheet != null) Marshal.ReleaseComObject(worksheet);
        if (workbook != null) Marshal.ReleaseComObject(workbook);
        if (excelApp != null) Marshal.ReleaseComObject(excelApp);
    }
}

ps.

1. 스프레드를 복제하는 이유

: 상단에 화면을 제목을 세팅해주는 과정에서 기존 스프레드에 제목을 세팅해주면, Spread에도 영향이 가기 때문에, 기존 스프레드를 복제해서 사용함

 

 

2. Excel.Range를 사용하는 이유

: 이렇게 하지않고, 일일이 Cell에 1:1 대응으로 넣어주면, 데이터가 많을수록 시간이 오래걸림

반대로, 데이터를 배열에 담아준 뒤에, Range를 이용해서 한번에 넣어주면,

Cell에 1:1 대응해서 넣는 것에 비해서 몇백배 빨리 데이터가 엑셀표에 담겨지고 프로그램이 실행되는 속도가 빨라짐

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.