Skip to content
Merged
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
35 changes: 13 additions & 22 deletions src/MiniExcel/OpenXml/ExcelOpenXmlSheetReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,14 @@ internal async IAsyncEnumerable<IDictionary<string, object>> InternalQueryRangeA
// TODO: need to optimize performance
// Q. why need 3 times openstream merge one open read? A. no, zipstream can't use position = 0

var mergeCellsResult = await TryGetMergeCellsAsync(sheetEntry, cancellationToken).ConfigureAwait(false);
if (_config.FillMergedCells && !mergeCellsResult.IsSuccess)
var mergeCellsContext = new MergeCellsContext { };

if (_config.FillMergedCells && !await TryGetMergeCellsAsync(sheetEntry, mergeCellsContext, cancellationToken).ConfigureAwait(false))
{
yield break;
}

_mergeCells = mergeCellsResult.MergeCells;
_mergeCells = mergeCellsContext.MergeCells;

var maxRowColumnIndexResult = await TryGetMaxRowColumnIndexAsync(sheetEntry, cancellationToken).ConfigureAwait(false);
if (!maxRowColumnIndexResult.IsSuccess)
Expand Down Expand Up @@ -698,7 +699,7 @@ private async Task<CellAndColumn> ReadCellAndSetColumnIndexAsync(XmlReader reade
}
else if (XmlReaderHelper.IsStartElement(reader, "is", _ns))
{
var rawValue = await StringHelper.ReadStringItemAsync(reader,cancellationToken).ConfigureAwait(false);
var rawValue = await StringHelper.ReadStringItemAsync(reader, cancellationToken).ConfigureAwait(false);
if (!string.IsNullOrEmpty(rawValue))
ConvertCellValue(rawValue, aT, xfIndex, out value);
}
Expand Down Expand Up @@ -1076,25 +1077,13 @@ internal static async Task<GetMaxRowColumnIndexResult> TryGetMaxRowColumnIndexAs
return new GetMaxRowColumnIndexResult(true, withoutCR, maxRowIndex, maxColumnIndex);
}

internal class MergeCellsResult
internal class MergeCellsContext
{
public bool IsSuccess { get; }
public MergeCells MergeCells { get; }

public MergeCellsResult(bool isSuccess)
{
IsSuccess = isSuccess;
}

public MergeCellsResult(bool isSuccess, MergeCells mergeCells)
: this (isSuccess)
{
MergeCells = mergeCells;
}
public MergeCells MergeCells { get; set; }
}

[Zomp.SyncMethodGenerator.CreateSyncVersion]
internal static async Task<MergeCellsResult> TryGetMergeCellsAsync(ZipArchiveEntry sheetEntry, CancellationToken cancellationToken = default)
internal static async Task<bool> TryGetMergeCellsAsync(ZipArchiveEntry sheetEntry, MergeCellsContext mergeCellsContext, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();

Expand All @@ -1110,7 +1099,7 @@ internal static async Task<MergeCellsResult> TryGetMergeCellsAsync(ZipArchiveEnt
using (XmlReader reader = XmlReader.Create(sheetStream, xmlSettings))
{
if (!XmlReaderHelper.IsStartElement(reader, "worksheet", _ns))
return new MergeCellsResult(false);
return false;
while (await reader.ReadAsync().ConfigureAwait(false))
{
if (!XmlReaderHelper.IsStartElement(reader, "mergeCells", _ns))
Expand All @@ -1119,7 +1108,7 @@ internal static async Task<MergeCellsResult> TryGetMergeCellsAsync(ZipArchiveEnt
}

if (!await XmlReaderHelper.ReadFirstContentAsync(reader, cancellationToken).ConfigureAwait(false))
return new MergeCellsResult(false);
return false;

while (!reader.EOF)
{
Expand Down Expand Up @@ -1155,7 +1144,9 @@ internal static async Task<MergeCellsResult> TryGetMergeCellsAsync(ZipArchiveEnt
}
}
}
return new MergeCellsResult(true, mergeCells);

mergeCellsContext.MergeCells = mergeCells;
return true;
}
}

Expand Down
Loading