Compare commits
No commits in common. "1f9dd20c87c0c98a3b047dd56feed19f209d9031" and "b85080c2ceffc1de4e1a1f96512abb4d6e805d03" have entirely different histories.
1f9dd20c87
...
b85080c2ce
|
|
@ -1,5 +0,0 @@
|
||||||
################################################################################
|
|
||||||
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
/src/.vs
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
{
|
|
||||||
// 使用 IntelliSense 了解相关属性。
|
|
||||||
// 悬停以查看现有属性的描述。
|
|
||||||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": ".NET Core Launch (console)",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "launch",
|
|
||||||
"preLaunchTask": "build",
|
|
||||||
"program": "${workspaceFolder}/src/ExcelHelper/bin/Debug/net9.0-windows/ExcelHelper.dll",
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}/src/ExcelHelper",
|
|
||||||
"console": "internalConsole",
|
|
||||||
"stopAtEntry": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": ".NET Core Attach",
|
|
||||||
"type": "coreclr",
|
|
||||||
"request": "attach"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
{
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "build",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"${workspaceFolder}/src/ExcelHelper/ExcelHelper.csproj",
|
|
||||||
"/property:GenerateFullPaths=true",
|
|
||||||
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "publish",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"publish",
|
|
||||||
"${workspaceFolder}/src/ExcelHelper/ExcelHelper.csproj",
|
|
||||||
"/property:GenerateFullPaths=true",
|
|
||||||
"/consoleloggerparameters:NoSummary;ForceNoAlign"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "watch",
|
|
||||||
"command": "dotnet",
|
|
||||||
"type": "process",
|
|
||||||
"args": [
|
|
||||||
"watch",
|
|
||||||
"run",
|
|
||||||
"--project",
|
|
||||||
"${workspaceFolder}/src/ExcelHelper/ExcelHelper.csproj"
|
|
||||||
],
|
|
||||||
"problemMatcher": "$msCompile"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -192,7 +192,7 @@ public class MarkdownWpfRenderer
|
||||||
tableElement
|
tableElement
|
||||||
.BindTableBackground();
|
.BindTableBackground();
|
||||||
|
|
||||||
foreach (var _ in table.ColumnDefinitions)
|
foreach (var col in table.ColumnDefinitions)
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
return new FrameworkElement();
|
return new FrameworkElement();
|
||||||
|
|
@ -200,7 +200,7 @@ public class MarkdownWpfRenderer
|
||||||
tableContentElement.ColumnDefinitions.Add(
|
tableContentElement.ColumnDefinitions.Add(
|
||||||
new ColumnDefinition()
|
new ColumnDefinition()
|
||||||
{
|
{
|
||||||
Width = GridLength.Auto,
|
Width = GridLength.Auto
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,12 +219,12 @@ public class MarkdownWpfRenderer
|
||||||
Height = GridLength.Auto
|
Height = GridLength.Auto
|
||||||
});
|
});
|
||||||
|
|
||||||
var colIndex = 0;
|
int colIndex = 0;
|
||||||
foreach (var colBlock in row)
|
foreach (var colBlock in row)
|
||||||
{
|
{
|
||||||
if (colBlock is not TableCell cell)
|
if (colBlock is not TableCell cell)
|
||||||
continue;
|
continue;
|
||||||
var col = table.ColumnDefinitions[colIndex];
|
|
||||||
Border cellElement = new Border()
|
Border cellElement = new Border()
|
||||||
{
|
{
|
||||||
Padding = new Thickness(NormalSize / 2, NormalSize / 4, NormalSize / 2, NormalSize / 4)
|
Padding = new Thickness(NormalSize / 2, NormalSize / 4, NormalSize / 2, NormalSize / 4)
|
||||||
|
|
@ -236,7 +236,7 @@ public class MarkdownWpfRenderer
|
||||||
cellElement.Child = cellContentElement;
|
cellElement.Child = cellContentElement;
|
||||||
cellElement
|
cellElement
|
||||||
.BindTableBorder();
|
.BindTableBorder();
|
||||||
//block.
|
|
||||||
cellContentElement.Margin = new Thickness(4);
|
cellContentElement.Margin = new Thickness(4);
|
||||||
|
|
||||||
if (rowIndex % 2 == 1)
|
if (rowIndex % 2 == 1)
|
||||||
|
|
@ -244,19 +244,6 @@ public class MarkdownWpfRenderer
|
||||||
|
|
||||||
Grid.SetRow(cellElement, rowIndex);
|
Grid.SetRow(cellElement, rowIndex);
|
||||||
Grid.SetColumn(cellElement, colIndex);
|
Grid.SetColumn(cellElement, colIndex);
|
||||||
if (col.Alignment == TableColumnAlign.Left)
|
|
||||||
{
|
|
||||||
cellContentElement.HorizontalAlignment = HorizontalAlignment.Left;
|
|
||||||
}
|
|
||||||
else if (col.Alignment == TableColumnAlign.Center)
|
|
||||||
{
|
|
||||||
cellContentElement.HorizontalAlignment = HorizontalAlignment.Center;
|
|
||||||
}
|
|
||||||
else if (col.Alignment == TableColumnAlign.Right)
|
|
||||||
{
|
|
||||||
cellContentElement.HorizontalAlignment = HorizontalAlignment.Right;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
tableContentElement.Children.Add(cellElement);
|
tableContentElement.Children.Add(cellElement);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ public class Excel2Prompt
|
||||||
/// <param name="columns"></param>
|
/// <param name="columns"></param>
|
||||||
/// <param name="startCell">A</param>
|
/// <param name="startCell">A</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string ConverterToPrompt(IEnumerable<dynamic> excelData, Dictionary<string,string> columns, string startCell)
|
public static string ConverterToPrompt(IEnumerable<dynamic> excelData, IEnumerable<string> columns, string startCell)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
示例:
|
示例:
|
||||||
|
|
@ -46,15 +46,13 @@ public class Excel2Prompt
|
||||||
int columnIndex = startColumnIndex;
|
int columnIndex = startColumnIndex;
|
||||||
foreach (var column in columns)
|
foreach (var column in columns)
|
||||||
{
|
{
|
||||||
var colOriName = column.Key;
|
|
||||||
var safeColName = column.Value;
|
|
||||||
columnIndex++;
|
columnIndex++;
|
||||||
string columnLetter = GetExcelColumnName(columnIndex);
|
string columnLetter = GetExcelColumnName(columnIndex);
|
||||||
|
|
||||||
var columnData = dataList.Select(row =>
|
var columnData = dataList.Select(row =>
|
||||||
{
|
{
|
||||||
var rowDict = (IDictionary<string, object>)row;
|
var rowDict = (IDictionary<string, object>)row;
|
||||||
return rowDict.ContainsKey(safeColName) ? rowDict[safeColName] : null;
|
return rowDict.ContainsKey(column) ? rowDict[column] : null;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
var nonNullData = columnData.Where(value => value != null).ToList();
|
var nonNullData = columnData.Where(value => value != null).ToList();
|
||||||
|
|
@ -65,7 +63,7 @@ public class Excel2Prompt
|
||||||
// 自动识别数据类型
|
// 自动识别数据类型
|
||||||
var dataType = GetColumnDataType(nonNullData);
|
var dataType = GetColumnDataType(nonNullData);
|
||||||
|
|
||||||
var prompt = $"- Column '{column.Key.Replace("\n", " ")}' (Excel Column {columnLetter})" +
|
var prompt = $"- Column '{column.Replace("\n", " ")}' (Excel Column {columnLetter})" +
|
||||||
$" - Type: {dataType}" +
|
$" - Type: {dataType}" +
|
||||||
$" - Sample values: ['{string.Join("', '", sampleValues)}']";
|
$" - Sample values: ['{string.Join("', '", sampleValues)}']";
|
||||||
prompts.Add(prompt);
|
prompts.Add(prompt);
|
||||||
|
|
|
||||||
|
|
@ -80,24 +80,21 @@ public partial class AiMessageControll : UserControl
|
||||||
|
|
||||||
private void SendButton_Click(object sender, RoutedEventArgs e)
|
private void SendButton_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
InvokeSendCommand();
|
if (SendCommand != null && SendCommand.CanExecute(CurrentMessage))
|
||||||
|
{
|
||||||
|
SendCommand.Execute(CurrentMessage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MessageInput_KeyDown(object sender, KeyEventArgs e)
|
private void MessageInput_KeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.Key == Key.Enter && !string.IsNullOrEmpty(CurrentMessage) && !IsWaiting)
|
if (e.Key == Key.Enter && !string.IsNullOrEmpty(CurrentMessage) && !IsWaiting)
|
||||||
{
|
|
||||||
InvokeSendCommand();
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InvokeSendCommand()
|
|
||||||
{
|
{
|
||||||
if (SendCommand != null && SendCommand.CanExecute(CurrentMessage))
|
if (SendCommand != null && SendCommand.CanExecute(CurrentMessage))
|
||||||
{
|
{
|
||||||
SendCommand.Execute(CurrentMessage);
|
SendCommand.Execute(CurrentMessage);
|
||||||
CurrentMessage = "";
|
}
|
||||||
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,75 +15,13 @@ using ExcelHelper.Views.Components;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
using MiniExcelLibs.OpenXml;
|
using MiniExcelLibs.OpenXml;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Dynamic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
|
|
||||||
namespace ExcelHelper.Views.ViewModels;
|
namespace ExcelHelper.Views.ViewModels;
|
||||||
|
|
||||||
|
|
||||||
public partial class ImportViewModel : ObservableRecipient, IViewModel
|
public partial class ImportViewModel : ObservableRecipient, IViewModel
|
||||||
{
|
{
|
||||||
// 新增列名映射字典
|
|
||||||
private readonly Dictionary<string, string> _columnMappings = new();
|
|
||||||
|
|
||||||
private void GenColumns(IEnumerable<string> columns)
|
|
||||||
{
|
|
||||||
ExcelColumns.Clear();
|
|
||||||
TableColumns.Clear();
|
|
||||||
_columnMappings.Clear();
|
|
||||||
|
|
||||||
if (UseHeaderRow)
|
|
||||||
{
|
|
||||||
foreach (var columnName in columns)
|
|
||||||
{
|
|
||||||
// 修改正则表达式,保留中文字符(\u4e00-\u9fff)
|
|
||||||
var safeColumnName = Regex.Replace(columnName, @"[^a-zA-Z0-9\u4e00-\u9fff]", "_")
|
|
||||||
.Trim('_')
|
|
||||||
.ReplaceMultiple("__", "_");
|
|
||||||
_columnMappings[columnName] = safeColumnName; // 保存映射关系
|
|
||||||
|
|
||||||
var column = new DataGridTextColumn
|
|
||||||
{
|
|
||||||
Header = columnName,
|
|
||||||
Binding = new System.Windows.Data.Binding($"{safeColumnName}"), // 恢复方括号语法
|
|
||||||
Width = DataGridLength.Auto
|
|
||||||
};
|
|
||||||
ExcelColumns.Add(column);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (var i = 'A'; i < 'Z'; i++)
|
|
||||||
{
|
|
||||||
var column = new DataGridTextColumn
|
|
||||||
{
|
|
||||||
Header = $"{i}",
|
|
||||||
Binding = new System.Windows.Data.Binding($"{i}"),
|
|
||||||
Width = DataGridLength.Auto
|
|
||||||
};
|
|
||||||
ExcelColumns.Add(column);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var columnsSeq = 0;
|
|
||||||
foreach (var item in ExcelColumns)
|
|
||||||
{
|
|
||||||
TableColumns.Add(new TableColumnModel
|
|
||||||
{
|
|
||||||
ExcelColumnName = item.Header.ToString(),
|
|
||||||
TableColumnName = $"Column{columnsSeq}",
|
|
||||||
});
|
|
||||||
columnsSeq++;
|
|
||||||
}
|
|
||||||
if (ExcelColumns.Count > 0)
|
|
||||||
{
|
|
||||||
WeakReferenceMessenger.Default.Send(new UpdateDataGridColumnsMessage([.. ExcelColumns]));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WeakReferenceMessenger.Default.Send(new ErrorDialogMessage("未读取到列信息!"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private readonly AiHelper AiHelper = new("deepseek-r1-250120", false);
|
private readonly AiHelper AiHelper = new("deepseek-r1-250120", false);
|
||||||
|
|
||||||
public Task FileDrop(string[] files)
|
public Task FileDrop(string[] files)
|
||||||
|
|
@ -129,7 +67,15 @@ public partial class ImportViewModel : ObservableRecipient, IViewModel
|
||||||
IsLoading = false;
|
IsLoading = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var excelData = await GetExcelData(path, config);
|
||||||
|
if (MaxRow != 0)
|
||||||
|
{
|
||||||
|
ExcelData = excelData.Take(Math.Min(MaxRow, 300));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ExcelData = excelData.Take(300);
|
||||||
|
}
|
||||||
var currentSheetName = SelectedSheetName;
|
var currentSheetName = SelectedSheetName;
|
||||||
var columns = MiniExcel.GetColumns(path, useHeaderRow: UseHeaderRow, startCell: StartCell, sheetName: currentSheetName, configuration: config);
|
var columns = MiniExcel.GetColumns(path, useHeaderRow: UseHeaderRow, startCell: StartCell, sheetName: currentSheetName, configuration: config);
|
||||||
|
|
||||||
|
|
@ -144,42 +90,9 @@ public partial class ImportViewModel : ObservableRecipient, IViewModel
|
||||||
{
|
{
|
||||||
SelectedSheetName = Sheets.FirstOrDefault(it => it.Equals(currentSheetName));
|
SelectedSheetName = Sheets.FirstOrDefault(it => it.Equals(currentSheetName));
|
||||||
}
|
}
|
||||||
|
|
||||||
var excelData = await GetExcelData(path, config);
|
|
||||||
// 新增数据处理逻辑
|
|
||||||
if (UseHeaderRow)
|
|
||||||
{
|
|
||||||
var processedData = new List<ExpandoObject>();
|
|
||||||
foreach (var row in excelData)
|
|
||||||
{
|
|
||||||
var newRow = new ExpandoObject();
|
|
||||||
var newRowDict = (IDictionary<string, object>)newRow;
|
|
||||||
var originalRow = (IDictionary<string, object>)row;
|
|
||||||
foreach (var col in columns)
|
|
||||||
{
|
|
||||||
if (_columnMappings.TryGetValue(col, out var safeName)
|
|
||||||
&& originalRow.TryGetValue(col, out var value))
|
|
||||||
{
|
|
||||||
newRowDict[safeName] = value;
|
|
||||||
Debug.WriteLine($"Mapping {col} to {safeName}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
processedData.Add(newRow);
|
|
||||||
}
|
|
||||||
excelData = processedData;
|
|
||||||
}
|
|
||||||
if (MaxRow != 0)
|
|
||||||
{
|
|
||||||
ExcelData = excelData.Take(Math.Min(MaxRow, 300));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ExcelData = excelData.Take(300);
|
|
||||||
}
|
|
||||||
|
|
||||||
MaxRow = ExcelData.Count();
|
MaxRow = ExcelData.Count();
|
||||||
|
|
||||||
ExcelPromptString = Excel2Prompt.ConverterToPrompt(ExcelData, _columnMappings, StartCell);
|
ExcelPromptString = Excel2Prompt.ConverterToPrompt(ExcelData, columns,StartCell);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|
@ -195,6 +108,57 @@ public partial class ImportViewModel : ObservableRecipient, IViewModel
|
||||||
: MiniExcel.QueryRange(path, sheetName: SelectedSheetName, useHeaderRow: UseHeaderRow, startCell: StartCell, endCell: EndCell, configuration: config);
|
: MiniExcel.QueryRange(path, sheetName: SelectedSheetName, useHeaderRow: UseHeaderRow, startCell: StartCell, endCell: EndCell, configuration: config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void GenColumns(IEnumerable<string> columns)
|
||||||
|
{
|
||||||
|
ExcelColumns.Clear();
|
||||||
|
TableColumns.Clear();
|
||||||
|
if (UseHeaderRow)
|
||||||
|
{
|
||||||
|
foreach (var columnName in columns)
|
||||||
|
{
|
||||||
|
var column = new DataGridTextColumn
|
||||||
|
{
|
||||||
|
Header = columnName,
|
||||||
|
Binding = new System.Windows.Data.Binding($"{columnName}"),
|
||||||
|
Width = DataGridLength.Auto
|
||||||
|
};
|
||||||
|
ExcelColumns.Add(column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (var i = 'A'; i < 'Z'; i++)
|
||||||
|
{
|
||||||
|
var column = new DataGridTextColumn
|
||||||
|
{
|
||||||
|
Header = $"{i}",
|
||||||
|
Binding = new System.Windows.Data.Binding($"{i}"),
|
||||||
|
Width = DataGridLength.Auto
|
||||||
|
};
|
||||||
|
ExcelColumns.Add(column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var columnsSeq = 0;
|
||||||
|
foreach (var item in ExcelColumns)
|
||||||
|
{
|
||||||
|
TableColumns.Add(new TableColumnModel
|
||||||
|
{
|
||||||
|
ExcelColumnName = item.Header.ToString(),
|
||||||
|
TableColumnName = $"Column{columnsSeq}",
|
||||||
|
});
|
||||||
|
columnsSeq++;
|
||||||
|
}
|
||||||
|
if (ExcelColumns.Count > 0)
|
||||||
|
{
|
||||||
|
WeakReferenceMessenger.Default.Send(new UpdateDataGridColumnsMessage([.. ExcelColumns]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WeakReferenceMessenger.Default.Send(new ErrorDialogMessage("未读取到列信息!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
private void OnReLoadExcel()
|
private void OnReLoadExcel()
|
||||||
{
|
{
|
||||||
|
|
@ -467,14 +431,3 @@ public partial class ImportViewModel : ObservableRecipient, IViewModel
|
||||||
private string _excelPromptString;
|
private string _excelPromptString;
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将扩展方法移到类外部
|
|
||||||
public static class StringExtensions
|
|
||||||
{
|
|
||||||
public static string ReplaceMultiple(this string input, string oldValue, string newValue)
|
|
||||||
{
|
|
||||||
while (input.Contains(oldValue))
|
|
||||||
input = input.Replace(oldValue, newValue);
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue