Open XML SDK:¿Cómo actualizar la celda de Excel?

 C Programming >> Programación C >  >> Tags >> Excel
Open XML SDK:¿Cómo actualizar la celda de Excel?

La solución para Open XML SDK:¿Cómo actualizar la celda de Excel?
se proporciona a continuación:

Estoy tratando de actualizar una celda en la hoja de cálculo de Excel a través de Open XML SDK:

prueba.xlsx

using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace DotNetSandbox.SO
{
    public class CellUpdating
    {
        public static void Update()
        {
            using SpreadsheetDocument doc = SpreadsheetDocument.Open(@"c:temptest.xlsx", true);
            Sheet sheet = doc.WorkbookPart.Workbook.Descendants<Sheet>().First();
            WorksheetPart wsPart = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
            Cell cell = wsPart.Worksheet.Descendants<Cell>().First(c => c.CellReference == "A2");

            cell.CellValue = new CellValue("new");

            wsPart.Worksheet.Save();
        }
    }
}

Eso actualiza la celda, pero solo después de recuperarla con la aplicación de Excel:

Entorno:

  • DocumentFormat.OpenXml:2.13.0
  • Excel:Microsoft 265 MSO (16.0.14026.20270) 64 bits

¿Qué hago mal?

Excel prefiere usar SharedStrings en lugar de cadenas en línea.

Si el Cell.DataType == EnumValue<CellValues>(CellValues.SharedString) no puede reemplazar CellValue sin agregar también SharedString.

La forma más sencilla de solucionar esto es cambiar el tipo de datos a una cadena en línea, también conocido como:CellValues.String y luego asignar el valor de la cadena:

    cell.DataType = new EnumValue<CellValues>(CellValues.String); 
    cell.CellValue = new CellValue("new");

Tenga en cuenta que Excel reescribirá su cadena en línea a cadenas compartidas durante la carga, lo cual es algo que debe tener en cuenta en caso de que espere que el archivo antes y después de guardarlo sin realizar ningún cambio sea exactamente igual.