Подтвердить что ты не робот

Отремонтированные записи: информация соты из листа, созданного с нуля

Я получаю сообщение об ошибке при открытии моей открытой таблицы 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();
            }
        }
    }
4b9b3361

Ответ 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:

  1. Перейдите ко всем полям по одному в конструкторе SSRS.
  2. Посмотрите, есть ли какие-либо буквенно-цифровые значения, поступающие из бэкэнда. (сравните ваш набор данных со всеми ячейками в отчете SSRS.
  3. дважды щелкните по полю → перейдите на вкладку "Номер"
  4. Нажмите по умолчанию → хорошо

Спасибо Умакант Нелиге