formato - insertar datos en excel desde c#
Registros reparados: informaciĆ³n de la celda de la hoja de trabajo creada desde cero (5)
Agregando a la lista de posibles soluciones (Year2017 :)):
Estaba enfrentando este problema porque no estaba usando el objeto de libro correcto para escribir FileOutputStream.
Espero que esto ayude a alguien.
Recibo un mensaje de error al abrir mi hoja de cálculo creada en OpenXML. El error es el siguiente.
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
Lo único que pude encontrar en línea que fue útil fue que este tema fue la discusión de un algoritmo que altera una celda individual varias veces causando el problema. Habiendo dicho eso, voy a vincular mi Constructor para el SpreadsheetDocument así como las tres funciones para actualizar una celda (lo cual hago una vez).
Puedo suministrar funciones adicionales según sea necesario, pero creo que el problema se encuentra en alguna de las dos enumeradas a continuación.
Por cierto,
GetWorksheetPartByName
InsertCellInWorksheet
GetCell
deberían funcionar todos según lo previsto.
El programa real
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();
}
Actualizar Celda
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();
}
}
}
Me doy cuenta de que este es un hilo antiguo, pero también tuve el mismo mensaje de error emergente para una hoja de Excel generada por programación también. Mi problema era que había estado configurando el nombre de la hoja de trabajo con un nombre que tenía una barra inclinada.
Con suerte, esto ayuda a alguien más que tropieza con este hilo, ya que es el hilo más popular sobre el tema.
Otro último, pero comprueba cómo estás agregando celdas a una fila. ¿Ha cortado y pegado el código de celda agregada en el que hay una comparación ''simple'' con la referencia de celda existente (A1, etc.) en la fila? En ese caso, si tiene una celda más allá de la columna Z - AA1 en adelante, entonces podría terminar tratando de insertar una celda (por ejemplo) AB1) antes de la celda B1. A continuación, obtendrá este error al abrir la hoja escrita en Excel. En cambio, si simplemente agrega celda tras celda a lo largo de cada fila, simplemente vaya directamente a insertar antes con el conjunto de celda de referencia a nulo, es decir. agregar una nueva celda para finalizar
Espero que tenga sentido.
Si agrega una cadena a una celda en lugar de un número (o una cadena que se puede convertir a un número), debe usar una cadena en línea o una cadena compartida en lugar de CellValue. Solo puede usar CellValue si el valor es numérico.
El XML generado al usar CellValue tiene el siguiente aspecto:
<x:row>
<x:c>
<x:v>12345</x:v>
</x:c>
</x:row>
cuando usas una cadena en línea se ve así:
<x:row>
<x:c t="inlineStr">
<x:is>
<x:t>Foo</x:t>
</x:is>
</x:c>
</x:row>
tenga en cuenta el nodo "es" para la cadena en línea y que el atributo de tipo de celda se establece en "inlineStr".
Aquí está el código de C # para generar XML correcto para una celda que contiene texto:
cell.DataType = CellValues.InlineString;
cell.InlineString = new InlineString() { Text = new Text(textToInsert) };
De lo que he leído utilizando cadenas compartidas es preferible, pero el uso de cadenas en línea evita el error y se ve muy bien cuando abre el archivo en Excel.
Tropecé con este tema yo mismo y encontré este hilo. La diferencia en mi caso no pudo reparar el archivo. El problema era el índice de fila que pasé a InsertCellInWorksheet
tomado del ejemplo en MSDN .
Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart);
Al insertar una fila, asegúrese de que el índice de la fila sea 1, no 0. Sin embargo, 0 para la colección SheetData
.
sheetData.InsertAt(new Row() { RowIndex = 1 }, 0);
lastRow = sheetData.Elements<Row>().LastOrDefault();
Con la esperanza de salvar a alguien el tiempo que pasa por el mismo problema.
Curiosamente, mi prueba de integración pasó, sin embargo, al abrir el archivo a través de Excel, mostraba el mensaje emergente sobre corrupción. Parece que hay una fila con el índice 0, sin embargo, está reservado ya que no podrá abrir un archivo con Excel.