web-dev-qa-db-fra.com

Enregistrements réparés: informations de cellule à partir d'une feuille de calcul créée à partir de zéro

Je reçois une erreur lors de l'ouverture de la feuille de calcul créée par OpenXML. L'erreur est la suivante.

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

La seule chose que je pouvais trouver en ligne qui était utile était ce problème était la discussion d'un algorithme qui modifiait une cellule individuelle plusieurs fois, provoquant le problème. Cela dit, je vais lier mon constructeur pour le document SpreadsheetDocument ainsi que les trois fonctions permettant de mettre à jour une cellule (ce que je fais une fois).

Je peux fournir toutes les fonctions supplémentaires nécessaires, mais je pense que le problème se situe quelque part dans les deux énumérés ci-dessous. 

Au fait,

 GetWorksheetPartByName
 InsertCellInWorksheet
 GetCell

devrait tous fonctionner comme prévu.

Le programme actuel

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

Constructeur

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

Cellule de mise à jour

    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

Si vous ajoutez une chaîne à une cellule plutôt qu'un nombre (ou une chaîne pouvant être convertie en nombre), vous devez utiliser une chaîne en ligne ou une chaîne partagée au lieu de CellValue. Vous ne pouvez utiliser CellValue que si la valeur est numérique.

Le code XML généré lors de l'utilisation de CellValue ressemble à quelque chose comme:

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

lorsque vous utilisez une chaîne en ligne, cela ressemble à:

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

notez le noeud "is" pour la chaîne en ligne et que l'attribut de type de cellule est défini sur "inlineStr".

Voici le code C # pour générer le code XML correct pour une cellule contenant du texte:

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

D'après ce que j'ai lu, l'utilisation de chaînes partagées est préférable, mais l'utilisation de chaînes en ligne permet d'éviter les erreurs et se présente parfaitement lorsque vous ouvrez le fichier dans Excel.

55
Josh

Je me rends compte que c’est un vieux fil de discussion, mais je viens de recevoir le même message d’erreur pour une feuille Excel générée par programme également. Mon problème était que j'avais défini le nom de la feuille de calcul avec un nom comportant une barre oblique.

J'espère que cela aidera quelqu'un d'autre qui trébuche sur ce fil, car c'est le fil le plus populaire sur le sujet.

9
Steve Danner

Une autre en retard - mais vérifiez comment vous ajoutez des cellules à une ligne. Avez-vous coupé et collé ajouter du code de cellule dans lequel il existe une comparaison «simple» avec la référence de cellule existante (A1, etc.) dans la ligne? Dans ce cas, si vous avez une cellule au-delà de la colonne Z - AA1 et plus - vous pourriez alors essayer d’insérer une cellule (par exemple, AB1) avant la cellule B1. Vous obtiendrez alors cette erreur lors de l'ouverture de la feuille écrite dans Excel. Au lieu de cela, si vous ajoutez simplement cellule après cellule le long de chaque ligne, il vous suffit d'aller directement à insérer avant avec la cellule de référence définie sur null - c'est-à-dire. ajouter une nouvelle cellule à la fin.

J'espère que cela a du sens.

2
Gary Walker

Je suis tombé sur ce problème moi-même et j'ai trouvé ce fil. La différence dans mon cas ne pouvait pas réparer le fichier. La question était l’index de ligne que j’ai passé à InsertCellInWorksheettiré de l’exemple sous MSDN .

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

Lors de l'insertion d'une ligne, assurez-vous que l'index de la ligne est 1 et non 0. Toutefois, 0 pour la collection SheetData.

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

Dans l’espoir de gagner du temps en passant par le même problème.

Chose intéressante, mon test d'intégration a réussi. Cependant, lors de l'ouverture du fichier via Excel, il montrait une fenêtre contextuelle sur la corruption. On dirait qu'il y a une ligne avec l'index 0, cependant, bit secretive car vous ne pourrez pas ouvrir un fichier avec Excel.

1
Janis S.

Ajout à la liste des solutions potentielles (Year2017 :)): 

Je faisais face à ce problème parce que je n'utilisais pas le bon objet de classeur pour écrire dans FileOutputStream.

J'espère que ça aide quelqu'un.

1
UzumakiL

Dans mon cas, les propriétés d'espaces réservés SSRS avaient un numéro personnalisé.

Réparer:

  1. Accédez à tous les champs un par un dans le concepteur SSRS.
  2. Voir s'il y a des valeurs alphanumériques venant du backend. (Comparez vos données avec toutes les cellules du rapport SSRS.
  3. double-cliquez sur le champ -> allez à l'onglet 'Nombre'
  4. Cliquez sur la valeur par défaut -> ok

Merci Umakanth Nelige

0
Umakanth Nelige

C'est un vieux fil, cependant j'ai eu le même problème et cela pourrait être utile à quelqu'un comme moi qui a atterri sur ce fil pour trouver une réponse :)

Le problème avec moi était que mon application avait un module d’exportation et que le fichier exporté d’un environnement fonctionnait bien, mais que ce n’était pas le cas d’un autre. C'était la même erreur:

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

Après une enquête approfondie, j'ai découvert que pour l'un des enregistrements de cette feuille dépassant la limite de cell de 32767 caractères (limitation Excel), le problème était résolu en réduisant la taille des textes directement sous DB. :)

J'espère que cela aidera :)

0
Hitesh