using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Excel = Microsoft.Office.Interop.Excel; namespace DwgExtractorManual.Models { /// /// Excel ��Ʈ�� �����͸� ���� �۾��� ����ϴ� Ŭ���� /// internal class ExcelDataWriter { private readonly ExcelManager excelManager; public ExcelDataWriter(ExcelManager excelManager) { this.excelManager = excelManager ?? throw new ArgumentNullException(nameof(excelManager)); } /// /// Title Block �����͸� Excel ��Ʈ�� ��� /// public void WriteTitleBlockData(List titleBlockRows) { if (excelManager.TitleBlockSheet == null || titleBlockRows == null || titleBlockRows.Count == 0) return; int currentRow = 2; // ��� ���� ����� ���� foreach (var row in titleBlockRows) { excelManager.TitleBlockSheet.Cells[currentRow, 1] = row.Type; excelManager.TitleBlockSheet.Cells[currentRow, 2] = row.Name; excelManager.TitleBlockSheet.Cells[currentRow, 3] = row.Tag; excelManager.TitleBlockSheet.Cells[currentRow, 4] = row.Prompt; excelManager.TitleBlockSheet.Cells[currentRow, 5] = row.Value; excelManager.TitleBlockSheet.Cells[currentRow, 6] = row.Path; excelManager.TitleBlockSheet.Cells[currentRow, 7] = row.FileName; currentRow++; } } /// /// Text Entity �����͸� Excel ��Ʈ�� ��� /// public void WriteTextEntityData(List textEntityRows) { if (excelManager.TextEntitiesSheet == null || textEntityRows == null || textEntityRows.Count == 0) return; int currentRow = 2; // ��� ���� ����� ���� foreach (var row in textEntityRows) { excelManager.TextEntitiesSheet.Cells[currentRow, 1] = row.Type; excelManager.TextEntitiesSheet.Cells[currentRow, 2] = row.Layer; excelManager.TextEntitiesSheet.Cells[currentRow, 3] = row.Text; excelManager.TextEntitiesSheet.Cells[currentRow, 4] = row.Path; excelManager.TextEntitiesSheet.Cells[currentRow, 5] = row.FileName; currentRow++; } } /// /// ���� �����͸� Excel ��Ʈ�� ��� /// public void WriteMappingDataToExcel(Dictionary> mappingData) { try { if (excelManager.MappingSheet == null || mappingData == null) return; int currentRow = 2; // ��� ���� ����� ���� Debug.WriteLine($"[DEBUG] Writing mapping data to Excel. Total files: {mappingData.Count}"); foreach (var fileEntry in mappingData) { string fileName = fileEntry.Key; var fileMappingData = fileEntry.Value; Debug.WriteLine($"[DEBUG] Processing file: {fileName}, entries: {fileMappingData.Count}"); foreach (var mapEntry in fileMappingData) { string mapKey = mapEntry.Key; (string aiLabel, string dwgTag, string attValue, string pdfValue) = mapEntry.Value; if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(mapKey)) { continue; } try { // ��ġ ������Ʈ�� ���� �迭 ��� object[,] rowData = new object[1, 6]; rowData[0, 0] = fileName; rowData[0, 1] = mapKey; rowData[0, 2] = aiLabel ?? ""; rowData[0, 3] = dwgTag ?? ""; rowData[0, 4] = attValue ?? ""; rowData[0, 5] = pdfValue ?? ""; Excel.Range range = excelManager.MappingSheet.Range[ excelManager.MappingSheet.Cells[currentRow, 1], excelManager.MappingSheet.Cells[currentRow, 6]]; range.Value = rowData; } catch (System.Exception ex) { Debug.WriteLine($"? Error writing row {currentRow}: {ex.Message}"); } currentRow++; } } Debug.WriteLine($"[DEBUG] Mapping data written to Excel. Total rows: {currentRow - 2}"); } catch (System.Exception ex) { Debug.WriteLine($"? ���� ������ Excel ��� �� ����: {ex.Message}"); throw; } } /// /// Excel ���� ��Ʈ���� FileName�� AILabel�� ��Ī�Ǵ� ���� ã�� Pdf_value�� ������Ʈ /// public bool UpdateExcelRow(string fileName, string aiLabel, string pdfValue) { try { if (excelManager.MappingSheet == null) return false; Excel.Range usedRange = excelManager.MappingSheet.UsedRange; if (usedRange == null) return false; int lastRow = usedRange.Rows.Count; for (int row = 2; row <= lastRow; row++) { var cellFileName = excelManager.MappingSheet.Cells[row, 1]?.Value?.ToString() ?? ""; var cellAiLabel = excelManager.MappingSheet.Cells[row, 3]?.Value?.ToString() ?? ""; if (string.Equals(cellFileName.Trim(), fileName.Trim(), StringComparison.OrdinalIgnoreCase) && string.Equals(cellAiLabel.Trim(), aiLabel.Trim(), StringComparison.OrdinalIgnoreCase)) { excelManager.MappingSheet.Cells[row, 6] = pdfValue; return true; } } return false; } catch (System.Exception ex) { Debug.WriteLine($"? Excel �� ������Ʈ �� ����: {ex.Message}"); return false; } } /// /// DWG ���� ���� ��ũ���� �����ϰ� ���� (PDF �÷� ����) /// public void SaveDwgOnlyMappingWorkbook(Dictionary> mappingData, string resultFolderPath) { try { string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); string savePath = System.IO.Path.Combine(resultFolderPath, $"{timestamp}_DwgOnly_Mapping.xlsx"); Debug.WriteLine($"[DEBUG] DWG ���� ���� ��ũ�� ���� ����: {savePath}"); var dwgOnlyWorkbook = excelManager.CreateNewWorkbook(); var dwgOnlyWorksheet = (Excel.Worksheet)dwgOnlyWorkbook.Worksheets[1]; dwgOnlyWorksheet.Name = "DWG Mapping Data"; // ��� ���� (PDF Value �÷� ����) dwgOnlyWorksheet.Cells[1, 1] = "���ϸ�"; dwgOnlyWorksheet.Cells[1, 2] = "Map Key"; dwgOnlyWorksheet.Cells[1, 3] = "AI Label"; dwgOnlyWorksheet.Cells[1, 4] = "DWG Tag"; dwgOnlyWorksheet.Cells[1, 5] = "DWG Value"; // ��� ��Ÿ�� ���� var headerRange = dwgOnlyWorksheet.Range["A1:E1"]; headerRange.Font.Bold = true; headerRange.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); headerRange.Borders.LineStyle = Excel.XlLineStyle.xlContinuous; // ������ �Է� int totalRows = mappingData.Sum(f => f.Value.Count); if (totalRows > 0) { object[,] data = new object[totalRows, 5]; int row = 0; foreach (var fileEntry in mappingData) { string fileName = fileEntry.Key; foreach (var mapEntry in fileEntry.Value) { string mapKey = mapEntry.Key; var (aiLabel, dwgTag, dwgValue, pdfValue) = mapEntry.Value; data[row, 0] = fileName; data[row, 1] = mapKey; data[row, 2] = aiLabel; data[row, 3] = dwgTag; data[row, 4] = dwgValue; row++; } } Excel.Range dataRange = dwgOnlyWorksheet.Range[ dwgOnlyWorksheet.Cells[2, 1], dwgOnlyWorksheet.Cells[totalRows + 1, 5]]; dataRange.Value = data; } dwgOnlyWorksheet.Columns.AutoFit(); excelManager.SaveWorkbookAs(dwgOnlyWorkbook, savePath); Debug.WriteLine($"? DWG ���� ���� ��ũ�� ���� �Ϸ�: {System.IO.Path.GetFileName(savePath)}"); dwgOnlyWorkbook.Close(false); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); } catch (System.Exception ex) { Debug.WriteLine($"? DWG ���� ���� ��ũ�� ���� �� ����: {ex.Message}"); throw; } } /// /// Height ���ĵ� Excel ���� ���� /// public void WriteHeightSortedData(List textEntities, Excel.Worksheet worksheet, string fileName) { // ��� ���� worksheet.Cells[1, 1] = "Height"; worksheet.Cells[1, 2] = "Type"; worksheet.Cells[1, 3] = "Layer"; worksheet.Cells[1, 4] = "Tag"; worksheet.Cells[1, 5] = "FileName"; worksheet.Cells[1, 6] = "Text"; // ��� ��Ÿ�� ���� var headerRange = worksheet.Range["A1:F1"]; headerRange.Font.Bold = true; headerRange.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightBlue); // �����ʹ� ExtractTextEntitiesWithHeight���� �̹� ���ĵǾ����Ƿ� �ٽ� �������� �ʽ��ϴ�. // ������ �Է� int row = 2; foreach (var entity in textEntities) // sortedEntities�� textEntities�� ���� { worksheet.Cells[row, 1] = entity.Height; worksheet.Cells[row, 2] = entity.Type; worksheet.Cells[row, 3] = entity.Layer; worksheet.Cells[row, 4] = entity.Tag; worksheet.Cells[row, 5] = fileName; worksheet.Cells[row, 6] = entity.Text; row++; } worksheet.Columns.AutoFit(); } /// /// Note 엔티티들을 Excel 워크시트에 기록합니다 (기존 데이터 아래에 추가). /// public void WriteNoteEntities(List noteEntities, Excel.Worksheet worksheet, string fileName) { if (noteEntities == null || noteEntities.Count == 0) { Debug.WriteLine("[DEBUG] Note 엔티티가 없습니다."); return; } try { // 현재 워크시트의 마지막 사용된 행 찾기 Excel.Range usedRange = null; int lastRow = 1; try { usedRange = worksheet.UsedRange; lastRow = usedRange?.Rows.Count ?? 1; } catch (System.Exception ex) { Debug.WriteLine($"[DEBUG] UsedRange 접근 오류, 기본값 사용: {ex.Message}"); lastRow = 1; } int startRow = lastRow + 2; // 한 줄 띄우고 시작 Debug.WriteLine($"[DEBUG] Note 데이터 기록 시작: {startRow}행부터 {noteEntities.Count}개 항목"); // Note 섹션 헤더 추가 (간단한 방식으로 변경) try { worksheet.Cells[startRow - 1, 1] = "=== Notes ==="; worksheet.Cells[startRow - 1, 2] = ""; worksheet.Cells[startRow - 1, 3] = ""; worksheet.Cells[startRow - 1, 4] = ""; worksheet.Cells[startRow - 1, 5] = ""; worksheet.Cells[startRow - 1, 6] = ""; // 헤더 스타일 적용 (개별 셀로 처리) var headerCell = worksheet.Cells[startRow - 1, 1]; headerCell.Font.Bold = true; headerCell.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightYellow); } catch (System.Exception ex) { Debug.WriteLine($"[DEBUG] Note 헤더 작성 오류: {ex.Message}"); } // Note 데이터 입력 (배치 방식으로 성능 향상) int row = startRow; try { foreach (var noteEntity in noteEntities) { worksheet.Cells[row, 1] = 0; // Height는 0으로 설정 worksheet.Cells[row, 2] = noteEntity.Type ?? ""; worksheet.Cells[row, 3] = noteEntity.Layer ?? ""; worksheet.Cells[row, 4] = ""; // Tag는 빈 값 worksheet.Cells[row, 5] = fileName ?? ""; worksheet.Cells[row, 6] = noteEntity.Text ?? ""; Debug.WriteLine($"[DEBUG] Excel 기록: Row {row}, Order {noteEntity.SortOrder}, Type {noteEntity.Type}, Pos({noteEntity.X:F1},{noteEntity.Y:F1}), Text: '{noteEntity.Text}'"); row++; } Debug.WriteLine($"[DEBUG] Note 데이터 기록 완료: {row - startRow}개 항목"); } catch (System.Exception ex) { Debug.WriteLine($"[DEBUG] Note 데이터 입력 오류: {ex.Message}"); Debug.WriteLine($"[DEBUG] 처리된 행: {row - startRow}개"); } // AutoFit 시도 (오류 발생시 무시) try { worksheet.Columns.AutoFit(); } catch (System.Exception ex) { Debug.WriteLine($"[DEBUG] AutoFit 오류 (무시됨): {ex.Message}"); } } catch (System.Exception ex) { Debug.WriteLine($"❌ WriteNoteEntities 전체 오류: {ex.Message}"); Debug.WriteLine($" 스택 트레이스: {ex.StackTrace}"); throw; // 상위로 예외 전파 } } } }