2012-02-22 9 views
25

Ricevo un errore durante l'apertura del foglio di calcolo creato con OpenXML. L'errore è il seguente.Record riparati: informazioni sulla cella dal foglio di lavoro creato da zero

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 

L'unica cosa che sono riuscito a trovare on-line che era disponibile era questo problema è stata la discussione di un algoritmo che altera una singola cella più volte la causa del problema. Detto questo, collegherò il mio Constructor per SpreadsheetDocument e le tre funzioni per l'aggiornamento di una cella (cosa che faccio una volta).

Posso fornire eventuali funzioni aggiuntive secondo necessità, ma credo che il problema sia da qualche parte nei due elencati di seguito.

A proposito,

GetWorksheetPartByName 
InsertCellInWorksheet 
GetCell 

dovrebbero essere tutti a lavorare come previsto.

il vero programma

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

Constructor

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

Aggiornamento cellulare

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

L'errore si è verificato nel mio codice, utilizzando [EPPlus] (http://epplus.codeplex.com/), quando ho creato un foglio di lavoro che ha un nome troppo lungo e/o contiene caratteri vietati. La soluzione era usare un nome breve e valido per il foglio di lavoro. –

risposta

47

Se si aggiunge una stringa su una cella anziché un numero (o una stringa che può essere convertita in un numero), allora dovresti usare una stringa inline o una stringa condivisa al posto di CellValue. È possibile utilizzare CellValue solo se il valore è numerico.

L'XML generato quando si utilizza CellValue sembra qualcosa di simile:

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

quando si utilizza una stringa in linea assomiglia:

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

nota la "è" nodo per archi in linea e che la l'attributo type cell è impostato su "inlineStr".

Ecco codice C# per generare corretta XML per una cella che contiene il testo:

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

Da quello che ho letto utilizzando le stringhe condivise è preferibile, ma utilizzando le stringhe in linea evita l'errore e sembra proprio bene quando si apre la file in Excel.

+1

Esattamente quello di cui avevo bisogno, grazie mille! :) – Chiramisu

+0

Ha aiutato molto grazie! C'è documentazione su tutti i tipi disponibili? Ho cercato google ma non ho trovato molto ... –

+0

Controlla http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.cellvalues.aspx – Josh

7

Mi rendo conto che questo è un thread precedente, ma ho appena visualizzato lo stesso messaggio di errore per un foglio Excel generato a livello di codice. Il mio problema era che avevo impostato il nome del foglio di lavoro con un nome che aveva una barra in avanti.

Speriamo che questo aiuti qualcun altro che si imbatte in questo thread poiché è il thread più popolare sull'argomento.

+0

Thnx, è venuto qui dalla ricerca dell'errore da un file generato con l'aiuto di SyncFusion lib, ed è stato aiutato da questo. Per me il problema era "[]" nel nome, che excel voleva cambiare in "()". – JOG

+1

Voglio solo notare che questo ha risolto anche il problema quando ho riscontrato un errore leggermente diverso rispetto a quello che la domanda in origine indica. "Record riparati: proprietà del foglio di lavoro dalla parte /xl/workbook.xml (cartella di lavoro)" Non era un carattere illegale, ma il nome della cartella di lavoro era troppo lungo. –

1

Un altro in ritardo - ma controlla come aggiungi celle a una riga. Hai tagliato e incollato aggiungi il codice cella in cui è presente un confronto "semplice" con il riferimento di cella esistente (A1 ecc.) Nella riga? Nel qual caso se hai una cella oltre la colonna Z - AA1 in poi - allora potresti finire per provare a inserire una cella (es. AB1) prima della cella B1.Otterrai questo errore aprendo il foglio scritto in Excel. Invece, se si aggiunge semplicemente una cella dopo l'altra lungo ogni riga, basta andare direttamente a inserire prima con la cella di riferimento impostata su null - cioè. aggiungi una nuova cella alla fine.

Spero che abbia senso.

1

In questo caso sono incappato in questo problema e ho trovato questo thread. Differenza nel mio caso non è stata in grado di riparare il file. Il problema era l'indice di riga che ho passato a InsertCellInWorksheettaken from example on MSDN.

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

Quando si inserisce una riga, assicurarsi che l'indice della riga è 1, non 0. Tuttavia, 0 per la raccolta SheetData.

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

Nella speranza di salvare qualcuno che passa attraverso lo stesso problema.

È interessante notare che il mio test di integrazione ha tuttavia superato l'apertura del file tramite Excel, mostrando il pop-up sulla corruzione. Sembra che ci sia una riga con indice 0, tuttavia, un po 'segreta in quanto non sarà possibile aprire un file con Excel.

0

Aggiungendo alla lista delle possibili soluzioni (Year2017 :)):

stavo affrontando questo problema perché non stavo usando l'oggetto di lavoro corretto scrivere tothe FileOutputStream.

Spero che questo aiuti qualcuno.

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [sufficiente] reputazione (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post;] (https://stackoverflow.com/help/privileges/comment) , [fornire risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i -do-invece). – mrun