Восстановленные записи: информация о ячейке из листа, созданного с нуля - PullRequest
27 голосов
/ 22 февраля 2012

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

Ответы [ 7 ]

57 голосов
/ 26 марта 2012

Если вы добавляете строку в ячейку, а не число (или строку, которая может быть преобразована в число), вам следует использовать встроенную строку или общую строку вместо 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" для встроенной строки и что атрибут типа ячейки имеет значение "inlineStr".

Вот код C # для генерации правильного XML для ячейки, содержащей текст:

cell.DataType = CellValues.InlineString;
cell.InlineString = new InlineString() { Text = new Text(textToInsert) };

Из того, что я прочитал, использование общих строк предпочтительнее, но использование встроенных строк позволяет избежать ошибки и выглядит очень хорошо при открытии файла в Excel.

9 голосов
/ 13 октября 2014

Я понимаю, что это старый поток, но у меня только что всплыло то же сообщение об ошибке для сгенерированного программным способом листа Excel.Моя проблема заключалась в том, что я задавал имя листа с именем, в котором была косая черта.

Надеюсь, это поможет кому-то еще, кто наткнется на эту тему, так как это самая популярная тема в теме.

2 голосов
/ 10 июня 2015

Еще один поздний - но проверьте, как вы добавляете ячейки в строку. Вы вырезали и вставляли код ячейки, в котором есть «простое» сравнение с существующей ссылкой на ячейку (A1 и т. Д.) В строке? В этом случае, если у вас есть ячейка за столбцом Z - AA1 и далее - тогда вы можете попытаться вставить ячейку (например, AB1) перед ячейкой B1. Затем вы получите эту ошибку при открытии письменного листа в Excel. Вместо этого, если вы просто добавляете ячейку за ячейкой вдоль каждой строки, просто идите прямо, чтобы вставить до, с ячейкой ссылки, установленной в ноль - т.е. добавить новую ячейку в конец.

Надеюсь, что это имеет смысл.

1 голос
/ 09 января 2018

Добавление в список потенциальных решений (Год2017 :)):

Я столкнулся с этой проблемой, потому что я не использовал правильный объект книги для записи в FileOutputStream.

Надеюсь, это кому-нибудь поможет.

1 голос
/ 04 августа 2016

Наткнулся на эту проблему сам и нашел эту ветку. Разница в моем случае не могла восстановить файл. Проблема заключалась в индексе строки, который я передал 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.

0 голосов
/ 14 февраля 2019

В моем случае свойства заполнителя SSRS имели пользовательский номер.

Исправлено:

  1. Перейдите ко всем полям по одному в конструкторе SSRS.
  2. Проверьте, есть ли какие-либо буквенно-цифровые значения, поступающие из бэкэнда.(перекрестное сравнение набора данных со всеми ячейками в отчете SSRS.
  3. двойной щелчок по полю -> перейдите на вкладку «Число»
  4. Щелкните по умолчанию -> ok

Спасибо Umakanth Nelige

0 голосов
/ 29 января 2019

Это старая ветка, однако у меня возникла та же проблема, и для кого-то вроде меня, которая попала в эту ветку, было бы полезно найти ответ:)

Проблема со мной заключалась в том, что в моем приложении был экспортмодуль и экспортированный файл из одной среды работали нормально, а из другой - нет.Это была та же ошибка:

Repaired Records: Cell information from /xl/worksheets/sheet19.xml part

После глубокого исследования я обнаружил, что для одной из записей на этом листе превышение предела ячеек 32767 символов (ограничение Excel) и, уменьшив размер текстов на БД напрямую, решил проблему.:)

Надеюсь, это поможет:)

...