해당 글은 엑셀 파일은 저장하는 로직이 아닌, 바로 엑셀 프로그램을 실행하고 싶을때 참고할만한 코드입니다 :)
언제 사용하는가?
: 엑셀버튼 클릭 했을 때 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 대응해서 넣는 것에 비해서 몇백배 빨리 데이터가 엑셀표에 담겨지고 프로그램이 실행되는 속도가 빨라짐