Отремонтированные записи: информация соты из листа, созданного с нуля
Я получаю сообщение об ошибке при открытии моей открытой таблицы OpenXML. Ошибка следующая.
Repaired Records: Cell information from /xl/worksheets/sheet.xml part
Repaired Records: Cell information from /xl/worksheets/sheet2.xml part
Repaired Records: Cell information from /xl/worksheets/sheet3.xml part
Единственная вещь, которую я мог найти в Интернете, которая была полезна, - это проблема алгоритма, который несколько раз меняет отдельную ячейку, вызывая проблему. Сказав это, я собираюсь связать свой конструктор для документа SpreadsheetDocument, а также три функции для обновления ячейки (что я делаю один раз).
Я могу предоставить любые дополнительные функции по мере необходимости, но я считаю, что проблема находится где-то в двух перечисленных ниже.
Кстати,
GetWorksheetPartByName
InsertCellInWorksheet
GetCell
если все будет работать по назначению.
Фактическая программа
static void Main(string[] args)
{
//Full path for File
const string newFile = "@C:\test.xlsx";
//Constructor creates default worksheet called "mySheet"
var spreadsheet = new XLSXHelper(newFile);
//updating some cells.
spreadsheet.UpdateCell("mySheet", "D2", "R", 2);
}
Конструктор
public XLSXHelper(string filepath)
{
newFile = filepath;
spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
this.workbookPart = spreadsheetDocument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
this.worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
AppendChild<Sheets>(new Sheets());
Sheet sheet = new Sheet()
{
Id = spreadsheetDocument.WorkbookPart.
GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "mySheet"
};
sheets.Append(sheet);
workbookPart.Workbook.Save();
spreadsheetDocument.Close();
}
Обновить ячейку
public void UpdateCell(string worksheetName, string textToInsert, string columnName, uint rowIndex)
{
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(newFile, true))
{
WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName);
if (worksheetPart != null)
{
InsertCellInWorksheet(columnName, rowIndex, worksheetPart);
Cell cell = GetCell(worksheetPart.Worksheet,columnName, rowIndex);
cell.CellValue = new CellValue(textToInsert);
worksheetPart.Worksheet.Save();
}
}
}
Ответы
Ответ 1
Если вы добавляете строку в ячейку, а не число (или строку, которая может быть преобразована в число), вы должны использовать встроенную строку или общую строку вместо CellValue. Вы можете использовать CellValue только в том случае, если значение является числовым.
XML, созданный при использовании CellValue, выглядит примерно так:
<x:row>
<x:c>
<x:v>12345</x:v>
</x:c>
</x:row>
когда вы используете встроенную строку, она выглядит так:
<x:row>
<x:c t="inlineStr">
<x:is>
<x:t>Foo</x:t>
</x:is>
</x:c>
</x:row>
обратите внимание на "is" node для встроенной строки и что для атрибута типа ячейки установлено значение "inlineStr".
Вот код С# для генерации правильного XML для ячейки, содержащей текст:
cell.DataType = CellValues.InlineString;
cell.InlineString = new InlineString() { Text = new Text(textToInsert) };
Из того, что я читал, используя общие строки, предпочтительнее, но использование встроенных строк позволяет избежать ошибки и выглядит просто отлично, когда вы открываете файл в Excel.
Ответ 2
Я понимаю, что это старый поток, но у меня просто появилось такое же сообщение об ошибке для программно созданного листа Excel. Моя проблема заключалась в том, что я установил имя рабочего листа с именем, имеющим в нем косую черту.
Надеюсь, это поможет кому-то другому, кто наткнулся на эту нить, поскольку это самый популярный поток в теме.
Ответ 3
Еще один поздний - но проверьте, как вы добавляете ячейки в строку. Вы вырезали и вставляли код ячейки, в котором "простая" сравнивается с существующей ссылкой на ячейку (A1 и т.д.) В строке? В этом случае, если у вас есть ячейка за столбцом Z - AA1, то вы можете попытаться вставить ячейку (например, AB1) перед ячейкой B1. Затем вы получите эту ошибку при открытии письменного листа в excel. Вместо этого, если просто добавить ячейку после ячейки вдоль каждой строки, просто пойдите прямо, чтобы вставить ее до того, как эталонная ячейка установится в нуль - т.е. добавьте новую ячейку в конец.
Надеюсь, что это имеет смысл.
Ответ 4
Наткнулся на эту проблему сам и нашел эту нить. Разница в моем случае не могла восстановить файл.
Проблема была номером строки, который я передал в InsertCellInWorksheet
взятый из примера на MSDN.
Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart);
При вставке строки убедитесь, что индекс строки равен 1, а не 0. Однако 0 для коллекции SheetData
.
sheetData.InsertAt(new Row() { RowIndex = 1 }, 0);
lastRow = sheetData.Elements<Row>().LastOrDefault();
В надежде спасти кого-то, кто переживает те же проблемы.
Интересно, что мой интеграционный тест прошел, однако, при открытии файла через Excel он показывал всплывающее окно о коррупции. Кажется, есть строка с индексом 0, однако, бит секретный, поскольку вы не сможете открыть файл с помощью Excel.
Ответ 5
Добавление в список потенциальных решений (Год2017 :)):
Я столкнулся с этой проблемой, потому что я не использовал правильный объект книги для записи в FileOutputStream.
Надеюсь, это кому-нибудь поможет.
Ответ 6
Это старая ветка, однако у меня возникла та же проблема, и для кого-то вроде меня, которая попала в эту ветку, было бы полезно найти ответ :)
Проблема со мной заключалась в том, что в моем приложении был модуль экспорта, и экспортированный файл из одной среды работал нормально, а из другой - нет. Это была та же ошибка:
Repaired Records: Cell information from /xl/worksheets/sheet19.xml part
Проведя глубокое исследование, я обнаружил, что для одной из записей в этом листе, превышающей предел ячеек 32767 символов (ограничение Excel) и путем уменьшения размера текстов непосредственно в БД, решена проблема. :)
Надеюсь, это поможет :)
Ответ 7
В моем случае свойства заполнителя SSRS имели пользовательский номер.
Fix:
- Перейдите ко всем полям по одному в конструкторе SSRS.
- Посмотрите, есть ли какие-либо буквенно-цифровые значения, поступающие из бэкэнда. (сравните ваш набор данных со всеми ячейками в отчете SSRS.
- дважды щелкните по полю → перейдите на вкладку "Номер"
- Нажмите по умолчанию → хорошо
Спасибо Умакант Нелиге