언제쓰는가?
C#, .Net환경에서
스프레드에 출력된 데이터를 엑셀로 옮긴 후 그대로 다운로드하고 싶은 경우에 사용
public static void DownloadExcel(FpSpread fpSpread, string title = "")
{
string msg = "";
if (string.IsNullOrEmpty(title))
{
msg = "엑셀을 다운로드하시겠습니까?";
}
else
{
msg = $@"{title} 을(를) 엑셀로 다운로드하시겠습니까?";
}
if (MessageBox.Show(msg, "엑셀파일작성", MessageBoxButtons.YesNo).Equals(DialogResult.No))
{
return;
}
// 제거할 특수 문자 목록
char[] invalidChars = { '<', '>', '?', '[', ']', ':', '|', '*', '"' };
// 특수 문자를 제거하고 공백을 추가한 새 파일 이름 생성
string transformedTitle = new string(title.Select(c => invalidChars.Contains(c) ? ' ' : c).ToArray());
// 저장 대화상자를 생성하고 사용자에게 파일 경로를 선택하도록 합니다.
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // 바탕화면으로 설정
sfd.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
sfd.FilterIndex = 1;
sfd.FileName = transformedTitle + ".xlsx"; // 파일 이름 설정
if (sfd.ShowDialog() == DialogResult.OK)
{
string fileName = sfd.FileName;
// 엑셀 객체 생성
Excel.Application excelApp = new Excel.Application();
excelApp.Visible = false;
Excel.Workbook workbook = excelApp.Workbooks.Add();
Excel.Worksheet worksheet = workbook.Sheets[1];
// 컬럼 셀의 숫자 형식을 Text로 설정
worksheet.Columns.NumberFormat = "@";
// 스프레드 복제
FarPoint.Win.Spread.FpSpread spread = new FarPoint.Win.Spread.FpSpread();
spread.Sheets.Add(fpSpread.Sheets[0].Clone());
// 첫번째 줄 제목 세팅
if (!string.IsNullOrEmpty(title))
{
//SetSpreadTitle(spread, title);
SetSpreadTitle(spread, title, worksheet);
}
// 헤더 입력
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;
cellValues[rowIndex, colIndex] = cellValue != null ? Convert.ToString(cellValue) : "";
}
}
// 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();
// 변경 사항 저장 및 Excel 종료
workbook.SaveAs(fileName);
workbook.Close();
excelApp.Quit();
MessageBox.Show("다운로드가 완료되었습니다.", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}