it-swarm.com.de

Reparierte Datensätze: Zellinformationen aus einem von Grund auf erstellten Arbeitsblatt

Beim Öffnen meiner von OpenXML erstellten Tabelle wird eine Fehlermeldung angezeigt. Der Fehler lautet wie folgt.

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

Das einzige, was ich online finden konnte, war hilfreich, da dieses Problem die Diskussion eines Algorithmus war, der eine einzelne Zelle mehrmals ändert, was das Problem verursacht. Trotzdem werde ich meinen Konstruktor für das SpreadsheetDocument sowie die drei Funktionen für das Aktualisieren einer Zelle (was ich einmal mache) verknüpfen.

Ich kann nach Bedarf zusätzliche Funktionen bereitstellen, aber ich glaube, das Problem liegt irgendwo in den beiden unten aufgeführten. 

Apropos,

 GetWorksheetPartByName
 InsertCellInWorksheet
 GetCell

sollten alle wie vorgesehen arbeiten.

Das aktuelle Programm

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);
    }

Konstrukteur

    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();
    }

Zelle aktualisieren

    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

Wenn Sie einer Zelle statt einer Zahl einen String hinzufügen (oder einen String, der in eine Zahl konvertiert werden kann), sollten Sie anstelle des CellValue einen Inline-String oder einen gemeinsam genutzten String verwenden. Sie können CellValue nur verwenden, wenn der Wert numerisch ist.

Das bei der Verwendung von CellValue generierte XML sieht ungefähr so ​​aus:

<x:row>
  <x:c>
    <x:v>12345</x:v>
  </x:c>
</x:row>

wenn Sie einen Inline-String verwenden, sieht es folgendermaßen aus:

<x:row>
  <x:c t="inlineStr">
    <x:is>
      <x:t>Foo</x:t>
    </x:is>
  </x:c>
</x:row>

beachten Sie den "is" -Knoten für die Inline-Zeichenfolge, und das Zellentypattribut ist auf "inlineStr" gesetzt.

Hier ist C # -Code zum Generieren von korrektem XML für eine Zelle mit Text:

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

Von dem, was ich gelesen habe, ist die Verwendung von gemeinsamen Strings vorzuziehen, aber die Verwendung von Inline-Strings vermeidet den Fehler und sieht gut aus, wenn Sie die Datei in Excel öffnen.

55
Josh

Mir ist klar, dass dies ein alter Thread ist, aber ich hatte gerade die gleiche Fehlermeldung für eine programmgesteuert erzeugte Excel-Tabelle. Mein Problem war, dass ich den Namen des Arbeitsblatts mit einem Namen angegeben hatte, der einen Schrägstrich enthielt.

Hoffentlich hilft dies jemandem, der auf diesen Thread stößt, da er der beliebteste Thread zu diesem Thema ist.

9
Steve Danner

Noch etwas spät - aber prüfen Sie, wie Sie einer Zeile Zellen hinzufügen. Haben Sie den Zellencode ausschneiden und einfügen, in dem es einen "einfachen" Vergleich mit der vorhandenen Zellenreferenz (A1 usw.) in der Zeile gibt? In diesem Fall, wenn Sie eine Zelle nach der Spalte Z - AA1 oder höher haben, können Sie am Ende versuchen, die Zelle (z. B. AB1) vor der Zelle B1 einzufügen. Sie erhalten dann diese Fehlermeldung, wenn Sie das geschriebene Arbeitsblatt in Excel öffnen. Wenn Sie stattdessen einfach Zelle für Zelle entlang jeder Zeile hinzufügen, gehen Sie einfach vor und fügen Sie die Referenzzelle auf null ein - dh. neue Zelle am Ende hinzufügen.

Hoffe das macht Sinn.

2
Gary Walker

Ich bin über dieses Thema gestolpert und habe diesen Thread gefunden. Unterschied in meinem Fall konnte die Datei nicht reparieren. Problem war der Zeilenindex, den ich an InsertCellInWorksheetaus dem Beispiel in MSDN übergeben habe.

Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart);

Stellen Sie beim Einfügen einer Zeile sicher, dass der Index der Zeile 1 und nicht 0 ist. Jedoch 0 für die SheetData-Auflistung.

sheetData.InsertAt(new Row() { RowIndex = 1 }, 0);
lastRow = sheetData.Elements<Row>().LastOrDefault();

In der Hoffnung, jemandem Zeit zu sparen, der die gleichen Schwierigkeiten durchmacht.

Interessanterweise hat mein Integrationstest bestanden. Beim Öffnen der Datei über Excel wurde jedoch das Popup über Korruption angezeigt. Anscheinend gibt es eine Zeile mit dem Index 0, jedoch etwas geheimnisvoll, da Sie eine Datei nicht mit Excel öffnen können.

1
Janis S.

Hinzufügen zur Liste der möglichen Lösungen (Jahr2017 :)): 

Ich war mit diesem Problem konfrontiert, weil ich nicht das richtige Arbeitsmappenobjekt zum Schreiben auf FileOutputStream verwendet habe.

Hoffe das hilft jemandem.

1
UzumakiL

In meinem Fall hatten die Eigenschaften des SSRS-Platzhalters eine benutzerdefinierte Nummer.

Fix:

  1. Gehen Sie im SSRS-Designer nacheinander zu allen Feldern.
  2. Prüfen Sie, ob alphanumerische Werte vom Backend stammen. (Vergleichen Sie Ihren Datensatz mit allen Zellen im SSRS-Bericht.
  3. doppelklicken Sie auf das Feld -> Gehen Sie zur Registerkarte 'Nummer'
  4. Klicken Sie auf die Standardeinstellung -> OK

Vielen Dank. Umakanth Nelige

0
Umakanth Nelige

Es ist ein alter Thread, aber ich hatte das gleiche Problem und es könnte für jemanden wie mich nützlich sein, der in diesem Thread gelandet ist, um eine Antwort zu finden :)

Das Problem bei mir war, dass meine Anwendung ein Exportmodul hat und die exportierte Datei aus einer Umgebung einwandfrei funktionierte, bei anderen jedoch nicht. Es war der gleiche Fehler:

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

Nach einer eingehenden Untersuchung fand ich heraus, dass das Problem für einen der Datensätze in diesem Datenblatt, der die Zellgrenze von 32767 Zeichen (Excel-Einschränkung) überschritt (- Excel-Einschränkung) und durch die Verringerung der Textgröße auf der DB direkt gelöst wurde. :)

Ich hoffe es wird helfen :)

0
Hitesh