From eccb12b83c681198ff5cfccc77bfc57c795f7963 Mon Sep 17 00:00:00 2001 From: melekhin Date: Tue, 16 Jun 2026 15:52:08 +0700 Subject: [PATCH] Text() debug --- QWERTYkez.ExcelProcessor/Editors/ExcelCell.cs | 32 ++++++++++++++++--- .../Editors/Interfaces.cs | 2 +- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/QWERTYkez.ExcelProcessor/Editors/ExcelCell.cs b/QWERTYkez.ExcelProcessor/Editors/ExcelCell.cs index 53cf5e7..e0a9019 100644 --- a/QWERTYkez.ExcelProcessor/Editors/ExcelCell.cs +++ b/QWERTYkez.ExcelProcessor/Editors/ExcelCell.cs @@ -426,15 +426,34 @@ internal sealed class ExcelCell : ICell } /// - public ICellText? Text() + public ICellText Text() { _writer.ThrowIfDisposed(); lock (_writer._syncLock) { - var cell = GetCellElement(); - if (cell == null || cell.DataType?.Value != CellValues.InlineString || cell.InlineString == null) - return null; + // 1. Получаем или создаём элемент ячейки + var cell = GetOrCreateCellElement(); + // 2. Убедимся, что у ячейки правильный тип и есть InlineString + if (cell.DataType == null || cell.DataType.Value != CellValues.InlineString) + { + // Если был другой тип (например, число) — меняем на InlineString + cell.DataType = CellValues.InlineString; + // Удаляем старый InlineString, если был + cell.InlineString?.Remove(); + // Создаём новый пустой InlineString + cell.InlineString = new InlineString(); + // Добавляем пустой Text (обязательно для Open XML) + cell.InlineString.AppendChild(new Text()); + } + else if (cell.InlineString == null) + { + // Если тип InlineString, но сам элемент отсутствует + cell.InlineString = new InlineString(); + cell.InlineString.AppendChild(new Text()); + } + + // 3. Строим объект ICellText на основе содержимого InlineString var textObj = new ExcelCellText(); foreach (var run in cell.InlineString.Elements()) { @@ -442,11 +461,14 @@ internal sealed class ExcelCell : ICell RunFormat? format = null; if (run.RunProperties != null) { - // Преобразуем RunProperties в RunFormat (можно вынести в отдельный метод) format = RunFormat.FromRunProperties(run.RunProperties); } textObj.Run(text, format); } + + // Если не было ни одного Run, текст всё равно должен быть доступен (пустой) + // Можно оставить textObj пустым, а можно сразу добавить пустой Run + // (но это не обязательно – пользователь может добавить run позже) return textObj; } } diff --git a/QWERTYkez.ExcelProcessor/Editors/Interfaces.cs b/QWERTYkez.ExcelProcessor/Editors/Interfaces.cs index e1fc048..954f898 100644 --- a/QWERTYkez.ExcelProcessor/Editors/Interfaces.cs +++ b/QWERTYkez.ExcelProcessor/Editors/Interfaces.cs @@ -706,7 +706,7 @@ public interface ICell bool TryText(out ICellText cellText); /// Возвращает объект для редактирования богатого текста ячейки (если ячейка содержит InlineString). - ICellText? Text(); + ICellText Text(); /// Устанавливает простое текстовое значение (без форматирования). ICell Set(string value);