La solución es mover todo el contenido por debajo del número especificado de líneas hacia abajo una línea y luego insertar contenido nuevo.
Código de muestra:
utilizando el sistema;
usando System.Collections.Generic;
utilizando System.Linq;
utilizando System.Web;
utilizando System.Web.UI;
utilizando System.Web.UI.WebControls;
utilizando DocumentFormat.OpenXml;
utilizando DocumentFormat.OpenXml.Spreadsheet;
utilizando DocumentFormat.OpenXml.Packaging;
utilizando System.IO;
usando System.Text.RegularExpressions;
espacio de nombres OpenXmlTest
{
Clase parcial pública OpenXml : System.Web.UI. Página
{
Page_Load vacío protegido ( remitente del objeto , EventArgs e)
{
intentar
{
string sfile = Server.MapPath( "~/Office/template.xlsx" );
archivo de cadena = Server.MapPath( "~/Office" ) + "/" + DateTime .Now.ToString( "yyyyMMddHHmmssffff" ) + ".xlsx" ;
Archivo .Copiar(archivo, archivo);
utilizando ( Documento de hoja de cálculo xl = Documento de hoja de cálculo . Abrir (archivo, verdadero ))
{
WorkbookPart wp = xl.WorkbookPart;
Libro de trabajo wb = wp.Libro de trabajo;
Hoja s = wb.Descendientes<Hoja> ( ).Dónde(w => w.Nombre == "Hoja1" ).FirstOrDefault();
WorksheetPart sp = wp.GetPartById(s.Id) as WorksheetPart ;
si (esp! = nulo )
{
SheetData sda = sp.Worksheet.Descendants< SheetData >().FirstOrDefault();
//SharedStringTable stringTable = xl.WorkbookPart.SharedStringTablePart.SharedStringTable;
//Fila fila = sp.Worksheet.Descendants<Row>().ToList()[1];
int insertIndex = 3; // insertar en la tercera línea
// Mueve todo el contenido de las siguientes lineas hacia abajo
foreach ( Fila fila en sp.Worksheet.Descendants< Fila >())
{
índice int = int .Parse(row.RowIndex.ToString());
if (índice >= insertIndex)
{
// comienza a moverte desde esta línea
fila.RowIndex = nuevo UInt32Value (( uint )índice + 1);
foreach ( Celda celda en fila. Descendientes < Celda >())
{
Regex r = nueva expresión regular ( @"[0-9]+" );
cadena num = r.Match(cell.CellReference.ToString()).Value;
r = nueva Regex ( @"[a-zA-Z]+" );
string chr = r.Match(cell.CellReference.ToString()).Value;
cadena newRef = cadena .Format( "{0}{1}" , chr, ( int .Parse(num) + 1));
celda.CellReference = newRef;
}
}
}
// Insertar uno nuevo después de mover
Fila nrow = nueva Fila () { RowIndex = ( UInt32Value )3U };
Celda ncel = nueva Celda ();
ncell.CellReference = string .Format( "A{0}" , insertIndex);
ncell.DataType = CellValues .String;
ncell.CellValue = new CellValue ( " recién insertado " );
nrow.Append(ncell);
sda.InsertAt< Fila >(nrow, insertIndex - 1);
//cell.DataType = CellValues.String;
//celda.ValorCelda = new ValorCelda("1");
//Fila nfila = nueva Fila();
//Celda ncel = nueva Celda();
//ncell.StyleIndex = fila.Descendientes<Cell>().ToList()[0].StyleIndex;
//ncell.CellValue = new CellValue(DateTime.Now.ToOADate().ToString());
//nrow.Append(ncell);
//sda.Append(nfila);
wb.Guardar();
}
wb.Clone();
}
}
captura ( excepción ex)
{
tirar ex;
}
}
}
}