diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs index b3de0395..dd9088da 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlConfiguration.cs @@ -17,6 +17,7 @@ public class OpenXmlConfiguration : MiniExcelBaseConfiguration public bool EnableWriteNullValueCell { get; set; } = true; public bool WriteEmptyStringAsNull { get; set; } = false; public bool TrimColumnNames { get; set; } = true; + public bool TrimSheetNames { get; set; } = false; public bool IgnoreEmptyRows { get; set; } = false; public bool EnableSharedStringCache { get; set; } = true; public long SharedStringCacheSize { get; set; } = 5 * 1024 * 1024; diff --git a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs index fc3e8ca2..e47188bc 100644 --- a/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs +++ b/src/MiniExcel.Core/OpenXml/OpenXmlWriter.DefaultOpenXml.cs @@ -9,6 +9,7 @@ internal partial class OpenXmlWriter : IMiniExcelWriter { private readonly Dictionary _zipDictionary = []; private Dictionary _cellXfIdMap; + private const int MaxCharactersSheetName = 31; private IEnumerable> GetSheets() { @@ -44,6 +45,11 @@ internal partial class OpenXmlWriter : IMiniExcelWriter private ExcellSheetInfo GetSheetInfos(string sheetName) { + if (_configuration.TrimSheetNames) + { + sheetName = sheetName[..Math.Min(sheetName.Length, MaxCharactersSheetName)]; + } + var info = new ExcellSheetInfo { ExcelSheetName = sheetName, diff --git a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs index 3c912ef9..42c184f4 100644 --- a/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs +++ b/tests/MiniExcel.Core.Tests/MiniExcelIssueTests.cs @@ -3690,4 +3690,31 @@ public void TestIssue869(string fileName, DateOnlyConversionMode mode, bool thro } } } + + [Theory(DisplayName = "#876: Enabling trimming only trims too long values when enabled")] + [InlineData("ShortName", false, "ShortName")] + [InlineData("SomeVeryLongNameWithMoreThan32Characters", false, "SomeVeryLongNameWithMoreThan32Characters")] + [InlineData("ShortName", true, "ShortName")] + [InlineData("SomeVeryLongNameWithMoreThan32Characters", true, "SomeVeryLongNameWithMoreThan32C")] // Trimmed to 31 chars + public async Task TestIssue876(string sheetName, bool trimSheetName, string sheetNameToReadWith) + { + // Arrange + var exporter = MiniExcel.Exporters.GetOpenXmlExporter(); + var someTable = new[] + { + new { Name = "Jack", Age = 25 }, + }; + var sheets = new Dictionary + { + [sheetName] = someTable + }; + var outputPath = PathHelper.GetTempFilePath(); + + // Act + await exporter.ExportAsync(outputPath, sheets, configuration: new OpenXmlConfiguration{ TrimSheetNames = trimSheetName}); + + // Assert + var resultsFromTrimmedSheet = MiniExcel.Importers.GetOpenXmlImporter().Query(outputPath, sheetName: sheetNameToReadWith); + Assert.Equal(2, resultsFromTrimmedSheet.Count()); // 2, header and one record + } } \ No newline at end of file