앞서 작성한 SQATool의 경우 모든 모듈의 변경 사항을 Diff하여 각각의 Excel 문서로 떨궈준다.
근데 이러한 경우 여러 파일이 쌓이게 되어 보기 불편할 수 있다는 의뢰가 들어왔다.
따로 이에 대한 문제 해결 요구하는 말은 없으셨지만 말이 나온 김에 여러 모듈 Excel파일을 하나의 Excel파일에 여러 워크시트로 만들어주는 DLL을 만들어봤다.
요구사항
SQATool 작동 시 모든 모듈의 변경 사항을 Diff하여 각각의 Excel 문서로 떨궈주게 된다.
이러한 여러 엑셀 문서를 읽는 데에 불편함이 있어 하나의 엑셀 파일에 여러 워크시트를 포함하는 방식으로 수정하길 원한다.
기존 SQA Tool의 산출물
하나의 파일에 통합 된 워크시트 결과
빌드 된 dll 모습
소스코드
// 일부 소스 코드 생략
public List<string> getExcelFilePath(string directoryPath)
{
List<string> result = new List<string>();
DirectoryInfo di = new DirectoryInfo(directoryPath);
FileInfo[] fi = di.GetFiles("*.xlsx");
foreach (FileInfo f in fi)
{
// 작성하려는 엑셀 파일이 검출되면 패스함
if (f.Name.Contains("TotalChangeList"))
{
continue;
}
result.Add(f.FullName);
}
return result;
}
public bool writeExcel(List<string> filePath, string outputPath)
{
try
{
excel = new Excel.Application();
workBook = excel.Application.Workbooks.Add();
for (int i = filePath.Count - 1; i >= 0; i--)
{
Excel.Workbook tempwb = excel.Workbooks.Open(filePath[i]);
Excel.Worksheet tempws = tempwb.Worksheets.Item[1];
tempws.Copy(Type.Missing, workBook.Sheets["Sheet1"]);
workBook.Sheets["복사 대상 워크시트명"].Name = getModuleName(filePath[i]);
tempwb.Close(true);
}
workBook.Sheets["Sheet1"].Delete();
string excelFileName = "TotalChangeList.xlsx";
if (File.Exists(Path.Combine(outputPath, excelFileName)))
{
File.Delete(Path.Combine(outputPath, excelFileName));
}
excel.ActiveWorkbook.SaveAs(Path.Combine(outputPath, excelFileName));
workBook.Close(true);
excel.Quit();
// 릴리즈 해제 해줘야 함
ReleaseExcelObject(workSheet);
ReleaseExcelObject(workBook);
ReleaseExcelObject(excel);
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
동작 방법
SQATool의 메인에서 ChangeList(Diff 요약 엑셀 파일)을 만들어주게 되는데, 이 작업이 끝난 후 위 DLL을 불러와 작동하게 했다.
SQATool에서는 위 DLL을 불러와 DirectoryPath 설정, 엑셀 파일들 경로 저장, TotalChangeList 작성 순으로 진행한다.
마치며
이번 DLL을 제작하면서 어려웠던 점은 어떻게 엑셀 워크시트의 내용을 복사하여 하나의 엑셀 파일에 넣느냐였다. 사실 원리 자체는 쉬운데 구현이 어려웠다. ‘그냥 복사해서 띡! 갖다 놓으면 되는 거 아닌가??’ 맞는 말이고 실제 코드도 그러하나 Excel 접근에서 자꾸 이상하게 엉켜서 많은 시행 착오를 겪었다…그리고 처음 만들어보는 DLL, 메인 소스에서의 참조 등 이러한 경험으로 뭔가 방대한?(그렇진 않지만 ㅎ..) 프젝을 하는 것 같아 재밌었다.