279 lines
11 KiB
C#
279 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using Excel = Microsoft.Office.Interop.Excel;
|
|
|
|
namespace DwgExtractorManual.Models
|
|
{
|
|
/// <summary>
|
|
/// Excel 시트에 데이터를 쓰는 작업을 담당하는 클래스
|
|
/// </summary>
|
|
internal class ExcelDataWriter
|
|
{
|
|
private readonly ExcelManager excelManager;
|
|
|
|
public ExcelDataWriter(ExcelManager excelManager)
|
|
{
|
|
this.excelManager = excelManager ?? throw new ArgumentNullException(nameof(excelManager));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Title Block 데이터를 Excel 시트에 기록
|
|
/// </summary>
|
|
public void WriteTitleBlockData(List<TitleBlockRowData> 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++;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Text Entity 데이터를 Excel 시트에 기록
|
|
/// </summary>
|
|
public void WriteTextEntityData(List<TextEntityRowData> 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++;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 매핑 데이터를 Excel 시트에 기록
|
|
/// </summary>
|
|
public void WriteMappingDataToExcel(Dictionary<string, Dictionary<string, (string, string, string, string)>> 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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Excel 매핑 시트에서 FileName과 AILabel이 매칭되는 행을 찾아 Pdf_value를 업데이트
|
|
/// </summary>
|
|
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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// DWG 전용 매핑 워크북을 생성하고 저장 (PDF 컬럼 제외)
|
|
/// </summary>
|
|
public void SaveDwgOnlyMappingWorkbook(Dictionary<string, Dictionary<string, (string, string, string, string)>> 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;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Height 정렬된 Excel 파일 생성
|
|
/// </summary>
|
|
public void WriteHeightSortedData(List<TextEntityInfo> 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();
|
|
}
|
|
}
|
|
} |