it-roy-ru.com

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

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

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

55
Josh

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

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

9
Steve Danner

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

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

2
Gary Walker

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

1
Janis S.

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

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

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

1
UzumakiL

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

Fix:

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

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

0
Umakanth Nelige

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

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

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

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

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

0
Hitesh