Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support multiple sheets of the same type #5

Merged
merged 3 commits into from
Jun 16, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ jobs:
steps:
- name: Checkout source
uses: actions/checkout@v2
- name: Use .NET Core 2.2 SDK
uses: actions/setup-dotnet@v1
with:
dotnet-version: '2.2.x'
- name: Use .NET Core 3.1 LTS SDK
uses: actions/setup-dotnet@v1
with:
Expand Down
4 changes: 2 additions & 2 deletions src/Shane32.ExcelLinq.Tests/Builders/Sheet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,11 @@ public void CantAddDuplicateSheetName()
}

[TestMethod]
public void CantAddDuplicateSheetClass()
public void CanAddDuplicateSheetClass()
{
var builder = new ExcelModelBuilder();
builder.Sheet<Class1>("Sheet1");
Assert.ThrowsException<InvalidOperationException>(() => builder.Sheet<Class1>("Sheet2"));
builder.Sheet<Class1>("Sheet2");
}

[TestMethod]
Expand Down
44 changes: 44 additions & 0 deletions src/Shane32.ExcelLinq.Tests/General/EndToEnd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,5 +170,49 @@ public void ReadDynamicallyGeneratedFile()
Assert.AreEqual(true, sheet1Data[1].BooleanColumn);
mock.Verify();
}

[TestMethod]
public void ReadWriteFileWithSimilarSheets()
{
var file = new TestFileContextSimilarSheets();
Assert.AreEqual(file.GetSheet<Class1>(), file.GetSheet<Class1>("Sheet1"));
file.GetSheet<Class1>("Sheet1").Add(new Class1 { StringColumn = "a", IntColumn = 1 });
file.GetSheet<Class1>("Sheet1").Add(new Class1 { StringColumn = "b", IntColumn = 2 });
file.GetSheet<Class1>("Sheet2").Add(new Class1 { StringColumn = "c", IntColumn = 3 });
file.GetSheet<Class1>("Sheet3").Add(new Class1 { StringColumn = "d", IntColumn = 4 });
var stream = file.SerializeToStream();
file = new TestFileContextSimilarSheets(stream);
Assert.AreEqual(file.GetSheet<Class1>(), file.GetSheet<Class1>("Sheet1"));
var sheet1 = file.GetSheet<Class1>("Sheet1");
Assert.AreEqual(sheet1.Count, 2);
Assert.AreEqual(sheet1[0].StringColumn, "a");
Assert.AreEqual(sheet1[0].IntColumn, 0);
Assert.AreEqual(sheet1[1].StringColumn, "b");
Assert.AreEqual(sheet1[1].IntColumn, 0);
var sheet2 = file.GetSheet<Class1>("Sheet2");
Assert.AreEqual(sheet2.Count, 1);
Assert.AreEqual(sheet2[0].StringColumn, "c");
Assert.AreEqual(sheet2[0].IntColumn, 0);
var sheet3 = file.GetSheet<Class1>("Sheet3");
Assert.AreEqual(sheet3.Count, 1);
Assert.AreEqual(sheet3[0].StringColumn, "d");
Assert.AreEqual(sheet3[0].IntColumn, 4);
}

private class TestFileContextSimilarSheets : ExcelContext
{
public TestFileContextSimilarSheets() : base() { }
public TestFileContextSimilarSheets(Stream stream) : base(stream) { }
protected override void OnModelCreating(ExcelModelBuilder modelBuilder)
{
var sheet1 = modelBuilder.Sheet<Class1>("Sheet1");
sheet1.Column(x => x.StringColumn);
var sheet2 = modelBuilder.Sheet<Class1>("Sheet2");
sheet2.Column(x => x.StringColumn);
var sheet3 = modelBuilder.Sheet<Class1>("Sheet3");
sheet3.Column(x => x.StringColumn);
sheet3.Column(x => x.IntColumn);
}
}
}
}
5 changes: 2 additions & 3 deletions src/Shane32.ExcelLinq/Builders/SheetModelBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,10 @@ public SheetModelBuilder(ExcelModelBuilder excelModelBuilder, string name)
_excelModelBuilder = excelModelBuilder ?? throw new ArgumentNullException(nameof(name));
if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException(nameof(name));
_sheetName = name.Trim();
if (excelModelBuilder._typeDictionary.ContainsKey(typeof(T)))
throw new InvalidOperationException($"Type {typeof(T).Name} already exists in the database model");
excelModelBuilder._sheetDictionary.Add(_sheetName.ToLower(), this);
excelModelBuilder._sheets.Add(this);
excelModelBuilder._typeDictionary.Add(typeof(T), this);
if (!excelModelBuilder._typeDictionary.ContainsKey(typeof(T)))
excelModelBuilder._typeDictionary.Add(typeof(T), this);
}

public SheetModelBuilder<T> AlternateName(string name)
Expand Down
15 changes: 13 additions & 2 deletions src/Shane32.ExcelLinq/ExcelContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ protected ExcelContext()
_sheets.Add(CreateListForSheet(sheet.Type));
_sheetNameLookup.Add(sheet.Name, i);
foreach (var sheetName in sheet.AlternateNames) _sheetNameLookup.Add(sheetName, i);
_typeLookup.Add(sheet.Type, i);
if (!_typeLookup.ContainsKey(sheet.Type))
_typeLookup.Add(sheet.Type, i);
}
_initialized = true;
}
Expand All @@ -50,7 +51,8 @@ internal ExcelContext(IExcelModel model)
_sheets.Add(CreateListForSheet(sheet.Type));
_sheetNameLookup.Add(sheet.Name, i);
foreach (var sheetName in sheet.AlternateNames) _sheetNameLookup.Add(sheetName, i);
_typeLookup.Add(sheet.Type, i);
if (!_typeLookup.ContainsKey(sheet.Type))
_typeLookup.Add(sheet.Type, i);
}
_initialized = true;
}
Expand Down Expand Up @@ -479,6 +481,15 @@ public List<T> GetSheet<T>()
return (List<T>)_sheets[_typeLookup[typeof(T)]];
}

public List<T> GetSheet<T>(string name)
{
if (!_initialized)
throw new InvalidOperationException();
if (name == null)
throw new ArgumentNullException(nameof(name));
return (List<T>)_sheets[_sheetNameLookup[name]];
}

public virtual ExcelPackage SerializeToExcelPackage()
{
var excelPackage = new ExcelPackage();
Expand Down