Как работать с XML-обработкой в .NET
XLSX файлы хранят свои данные в XML-частей внутри пакета OPC ZIP. Aspose.Cells для .NET обрабатывает эти данные через четыре класса XML mapper: WorkbookXmlMapper, WorksheetXmlMapper, SharedStringTableXmlMapper, и StylesheetXmlMapper.Понимание этих классов помогает диагностировать сбои в анализе и правильно настроить загрузку, способную выдержать ошибки. dotnet add package Aspose.Cells_FOSS.
Пошаговое руководство
Шаг 1: Установите пакет
dotnet add package Aspose.Cells_FOSSШаг 2: Импортировать пространства имён
using Aspose.Cells_FOSS;Шаг 3: Понимание обязанностей XML Mapper
Каждый картограф обрабатывает одну часть XML структуры XLSX:
| Карта | XML часть | Руки |
|---|---|---|
WorkbookXmlMapper | xl/workbook.xml | Метаданные рабочей книги, список листов, определенные имена |
WorksheetXmlMapper | xl/worksheets/sheetN.xml | Данные ячейки, формулы, гиперссылки, валидации, условные форматы |
SharedStringTableXmlMapper | xl/sharedStrings.xml | Де-двойные значения строк |
StylesheetXmlMapper | xl/styles.xml | Стили ячейки, шрифты, заполнения, границы |
Эти карты автоматически отображаются во время Workbook строительство и Save().Вы не инстантируете их непосредственно в прикладном коде.
Шаг 4: Управление XmlParsingException
XmlParsingException выброшен, когда картограф сталкивается с неправильно сформированным XML, который нельзя исправить. TryRepairXml = true В LoadOptions Для того чтобы активировать путь пассивного анализа маппера.
using Aspose.Cells_FOSS;
var opts = new LoadOptions
{
TryRepairPackage = true,
TryRepairXml = true,
};
try
{
var wb = new Workbook("malformed.xlsx", opts);
Console.WriteLine("Loaded: " + wb.Worksheets.Count + " sheet(s)");
var diag = wb.LoadDiagnostics;
if (diag.HasRepairs)
Console.WriteLine("XML repairs applied. Data loss risk: " + diag.HasDataLossRisk);
}
catch (XmlParsingException ex)
{
Console.WriteLine("Unrecoverable XML error: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
Console.WriteLine("Load failed: " + ex.Message);
}Шаг 5: Используйте LoadDiagnostics для выявления проблем XML
После успешной загрузки проверьте LoadDiagnostics.Issues для DiagnosticEntry Записи, чтобы понять, какие XML-ремонт были применены и если какой-либо из них привел к потере данных.
using Aspose.Cells_FOSS;
var opts = new LoadOptions { TryRepairXml = true };
var wb = new Workbook("file.xlsx", opts);
var diag = wb.LoadDiagnostics;
foreach (var entry in diag.Issues)
{
Console.WriteLine($"[{entry.Severity}] {entry.Code}");
Console.WriteLine($" Message: {entry.Message}");
Console.WriteLine($" RepairApplied: {entry.RepairApplied} DataLossRisk: {entry.DataLossRisk}");
}Общие проблемы и решения
XmlParsingException Даже с TryRepairXml = true. XML настолько сформирован, что не может восстановить его толерантный к ошибкам аналитик.Это может произойти с файлами, созданными нестандартными инструментами, которые производят синтаксически недействительный XML.
Стиль не хватает после загрузки. ТЭ StylesheetXmlMapper Может быть, он встретил коррумпированного человека. xl/styles.xml.Проверьте LoadDiagnostics.Issues для записей с кодом, связанным со стилями; и DataLossRisk = true для пораженных клеток.
Разделенные строки появляются как пустые ячейки. Корумпированный xl/sharedStrings.xml может привести к тому, что клетки, ссылающиеся на общую таблицу строк, будут отображаться как пустые. TryRepairXml Попытка окупаемости .
Часто задаваемые вопросы
Можно ли использовать XML mapper?
Класс XML-карточка является запечатанной внутренней инфраструктурой и не предназначен для расширения.
Почему это SharedStringTableXmlMapper Отдельно ли?
Спецификация OOXML разделяет повторяющиеся значения строк в общую таблицу строков для уменьшения размера файла.
делает TryRepairXml Решить все проблемы с XML-паразитом?
TryRepairXml обрабатывает восстановимые ошибки, такие как незакрытые элементы, отсутствующие именные пространства и отрезанные значения атрибутов. Структурно действительный, но семантически несовместимый XML (например, формулы токенов, ссылающихся на несуществующих ячейки) все равно будет анализироваться без ошибок.