diff --git a/README-V2.md b/README-V2.md
index ccec8fcc..5127a44c 100644
--- a/README-V2.md
+++ b/README-V2.md
@@ -1161,7 +1161,7 @@ templater.ApplyTemplate(path, templatePath, value, config)
### Attributes and configuration
-#### 1. Specify the column name, column index, or ignore the column entirely
+#### 1. Specify the column name, column index, or ignore the column entirely.

@@ -1300,7 +1300,22 @@ public class Dto
}
```
-#### 8. DynamicColumnAttribute
+#### 8. Resource based localization
+
+Support for localizable resources is available for both `MiniExcelColumnAttribute` and `MiniExcelColumnNameAttribute`:
+
+```csharp
+public class Dto
+{
+ [MiniExcelColumn(Name = "Column1", ResourceType = typeof(MyResources))]
+ public string Test1 { get; set; }
+
+ [MiniExcelColumnName("Column2", ResourceType = typeof(MyResources))]
+ public string Test2 { get; set; }
+}
+```
+
+#### 9. DynamicColumnAttribute
Attributes can also be set on columns dynamically:
```csharp
@@ -1321,7 +1336,7 @@ var exporter = MiniExcel.Exporters.GetOpenXmlExporter();
exporter.Export(path, value, configuration: config);
```
-#### 9. MiniExcelSheetAttribute
+#### 10. MiniExcelSheetAttribute
It is possible to define the name and visibility of a sheet through the `MiniExcelSheetAttribute`:
diff --git a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs
index a49e964f..1c139327 100644
--- a/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs
+++ b/src/MiniExcel.Core/Attributes/MiniExcelColumnAttribute.cs
@@ -1,9 +1,10 @@
+using System.Resources;
+
namespace MiniExcelLib.Core.Attributes;
public class MiniExcelColumnAttribute : MiniExcelAttributeBase
{
- private int _index = -1;
- private string? _xName;
+ private ResourceManager? _resourceManager;
public string? Name { get; set; }
public string[]? Aliases { get; set; } = [];
@@ -15,39 +16,73 @@ public class MiniExcelColumnAttribute : MiniExcelAttributeBase
public double Width { get; set; } = 8.42857143;
public ColumnType Type { get; set; } = ColumnType.Value;
+ private int _index = -1;
public int Index
{
get => _index;
set => Init(value);
}
+ private string? _indexName;
public string? IndexName
{
- get => _xName;
+ get => _indexName;
set => Init(CellReferenceConverter.GetNumericalIndex(value), value);
}
+ private Type? _resourceType;
+ public Type? ResourceType
+ {
+ get => _resourceType;
+ set
+ {
+ if (_resourceType == value)
+ return;
+
+ _resourceType = value;
+ if (value is null)
+ return;
+
+ const BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
+ if (value.GetProperty(nameof(ResourceManager), bindingFlags) is { } property &&
+ property.GetValue(null) is ResourceManager resourceManager)
+ {
+ _resourceManager = resourceManager;
+ }
+ else
+ {
+ _resourceManager = new ResourceManager(value);
+ }
+ }
+ }
+
+ internal string? GetColumnName(string? resourceKey = null)
+ {
+ if (Name is not null)
+ return _resourceManager?.GetString(Name) ?? Name;
+
+ if (resourceKey is not null)
+ return _resourceManager?.GetString(resourceKey) ?? resourceKey;
+
+ return null;
+ }
+
private void Init(int index, string? columnName = null)
{
if (index < 0)
throw new ArgumentOutOfRangeException(nameof(index), index, $"Column index {index} must be greater or equal to zero.");
_index = index;
- _xName ??= columnName ?? CellReferenceConverter.GetAlphabeticalIndex(index);
+ _indexName ??= columnName ?? CellReferenceConverter.GetAlphabeticalIndex(index);
}
public void SetFormatId(int formatId) => FormatId = formatId;
}
-public class DynamicExcelColumn : MiniExcelColumnAttribute
+public class DynamicExcelColumn(string key) : MiniExcelColumnAttribute
{
- public string Key { get; set; }
+ public string Key { get; set; } = key;
public Func