From 65e834cf9d37dfeee9762573190d728bce80c886 Mon Sep 17 00:00:00 2001 From: VinothSF5015 Date: Wed, 29 Apr 2026 18:21:23 +0530 Subject: [PATCH] 1021712 - AI Sample Added --- .../.NET/AIExcelCleanUp/AIExcelCleanUp.slnx | 3 + .../AIExcelCleanUp/AIExcelCleanUp.csproj | 22 +++ .../AIExcelCleanUp/ChatWithExcelPipeline.cs | 170 ++++++++++++++++++ .../AIExcelCleanUp/Data/InputTemplate.xlsx | Bin 0 -> 10096 bytes .../AIExcelCleanUp/AIExcelCleanUp/Program.cs | 21 +++ 5 files changed, 216 insertions(+) create mode 100644 Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp.slnx create mode 100644 Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/AIExcelCleanUp.csproj create mode 100644 Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/ChatWithExcelPipeline.cs create mode 100644 Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/Data/InputTemplate.xlsx create mode 100644 Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/Program.cs diff --git a/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp.slnx b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp.slnx new file mode 100644 index 00000000..2c34d40c --- /dev/null +++ b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp.slnx @@ -0,0 +1,3 @@ + + + diff --git a/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/AIExcelCleanUp.csproj b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/AIExcelCleanUp.csproj new file mode 100644 index 00000000..49faef7b --- /dev/null +++ b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/AIExcelCleanUp.csproj @@ -0,0 +1,22 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + Always + + + Always + + + + diff --git a/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/ChatWithExcelPipeline.cs b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/ChatWithExcelPipeline.cs new file mode 100644 index 00000000..2ea381d6 --- /dev/null +++ b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/ChatWithExcelPipeline.cs @@ -0,0 +1,170 @@ +using System.Text; +using Azure; +using Azure.AI.OpenAI; +using OpenAI.Chat; +using Syncfusion.XlsIO; + +namespace AIExcelCleaner; + +/// +/// AI-Powered Excel Cleaning Pipeline +/// Workflow: Excel → CSV → AI Cleaning → Cleaned Excel +/// +public class ChatWithExcelPipeline +{ + private readonly ChatClient _chatClient; + + public ChatWithExcelPipeline() + { + string? apiKey = "Add your API key here"; + string? endpoint = "Add your endpoint here"; + string? modelId = "Add your model ID here"; + + if (string.IsNullOrWhiteSpace(apiKey)) + throw new InvalidOperationException("Please set AZURE_OPENAI_API_KEY environment variable"); + if (string.IsNullOrWhiteSpace(endpoint)) + throw new InvalidOperationException("Please set AZURE_OPENAI_ENDPOINT environment variable"); + if (string.IsNullOrWhiteSpace(modelId)) + throw new InvalidOperationException("Please set OPENAI_MODEL environment variable"); + + var azureClient = new AzureOpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey)); + _chatClient = azureClient.GetChatClient(modelId); + } + + private static void ValidateExcelFile(string excelFilePath) + { + if (string.IsNullOrWhiteSpace(excelFilePath) || !File.Exists(excelFilePath)) + throw new FileNotFoundException($"Excel file not found: {excelFilePath}"); + + if (!excelFilePath.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) && + !excelFilePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase)) + throw new ArgumentException("File must be an Excel file (.xlsx or .xls)"); + } + + private static string BuildCsvContext(string excelFilePath) + { + using var excelEngine = new ExcelEngine(); + var excelApp = excelEngine.Excel; + excelApp.DefaultVersion = ExcelVersion.Xlsx; + + using var fileStream = File.OpenRead(excelFilePath); + var workbook = excelApp.Workbooks.Open(fileStream); + + var csvBuilder = new StringBuilder(); + + foreach (var worksheet in workbook.Worksheets) + { + using var csvStream = new MemoryStream(); + worksheet.SaveAs(csvStream, ","); + string csvData = Encoding.UTF8.GetString(csvStream.ToArray()); + csvBuilder.Append(csvData); + } + + return csvBuilder.ToString(); + } + + private async Task SendToAzureOpenAIAsync(string csvContent, string systemPrompt, string userPrompt) + { + var chatHistory = new List + { + new SystemChatMessage(systemPrompt), + new UserChatMessage($"{userPrompt}\n\n--- EXCEL DATA (CSV FORMAT) ---\n{csvContent}") + }; + + var options = new ChatCompletionOptions + { + Temperature = 0.3f, + MaxOutputTokenCount = 8000 + }; + + var response = await _chatClient.CompleteChatAsync(chatHistory, options); + return response.Value.Content[0].Text ?? string.Empty; + } + + private static void SaveResponseToExcel(string csvResponse, string outputPath) + { + using var excelEngine = new ExcelEngine(); + var excelApp = excelEngine.Excel; + excelApp.DefaultVersion = ExcelVersion.Xlsx; + + var workbook = excelApp.Workbooks.Create(1); + var worksheet = workbook.Worksheets[0]; + worksheet.Name = "Cleaned Data"; + + string csvContent = ExtractCsvFromResponse(csvResponse); + + // Split CSV into lines + var lines = csvContent.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + var validLines = lines.Where(l => !string.IsNullOrWhiteSpace(l)).ToList(); + + // Write directly to Excel + int row = 1; + foreach (var line in validLines) + { + var cells = line.Split(','); + for (int col = 0; col < cells.Length; col++) + worksheet[row, col + 1].Value = cells[col].Trim(); + row++; + } + + // Auto-fit columns + for (int col = 1; col <= worksheet.UsedRange.LastColumn; col++) + worksheet.AutofitColumn(col); + + workbook.SaveAs(outputPath); + workbook.Close(); + Console.WriteLine($"✓ Cleaned Excel saved: {outputPath}"); + } + + private static string ExtractCsvFromResponse(string aiResponse) + { + if (aiResponse.Contains("```csv")) + { + int start = aiResponse.IndexOf("```csv") + 6; + int end = aiResponse.IndexOf("```", start); + if (end > start) return aiResponse.Substring(start, end - start).Trim(); + } + + if (aiResponse.Contains("```")) + { + int start = aiResponse.IndexOf("```") + 3; + int end = aiResponse.IndexOf("```", start); + if (end > start) return aiResponse.Substring(start, end - start).Trim(); + } + + return aiResponse; + } + + public async Task ExecuteChatWithExcelAsync() + { + Console.WriteLine("AI-Powered Excel Cleaner (Excel → CSV → AI → Cleaned Excel)\n"); + + Console.Write("Enter Excel file path: "); + string? filePath = Console.ReadLine()?.Trim().Trim('"'); + + try + { + ValidateExcelFile(filePath ?? string.Empty); + + Console.WriteLine("Converting to CSV..."); + string csvContent = BuildCsvContext(filePath!); + + Console.WriteLine("Cleaning with AI..."); + string systemPrompt = "You are an expert Excel data cleaning assistant. Clean and standardize the provided data. Return ONLY the cleaned CSV data, nothing else."; + string userPrompt = "Please clean this Excel data. Return ONLY cleaned CSV data."; + + string aiResponse = await SendToAzureOpenAIAsync(csvContent, systemPrompt, userPrompt); + + string outputPath = Path.Combine( + Path.GetDirectoryName(filePath) ?? ".", + Path.GetFileNameWithoutExtension(filePath) + "_cleaned.xlsx"); + + SaveResponseToExcel(aiResponse, outputPath); + Console.WriteLine("✓ Complete!"); + } + catch (Exception ex) + { + Console.WriteLine($"✗ Error: {ex.Message}"); + } + } +} diff --git a/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/Data/InputTemplate.xlsx b/Use Cases/AIExcelCleanUp/.NET/AIExcelCleanUp/AIExcelCleanUp/Data/InputTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1ca9eb9b58b2077c34c83b086b36abd1059285b5 GIT binary patch literal 10096 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