2010-06-24 35 views
5

Estoy usando openxml para crear un informe de Excel. El archivo openxml opera en una plantilla de archivo de Excel usando rangos con nombre.openxml - insertar una fila, mover otros

El cliente requiere una fila de totales al final de la lista de filas. ¡Suena como una solicitud razonable!

Sin embargo, la tabla de datos que estoy devolviendo de la base de datos puede contener cualquier cantidad de filas. Usando filas de plantilla e 'Insertar antes de mí', mi fila de totales queda anulada.

Mi pregunta es, usando openxml, ¿cómo puedo insertar filas en la hoja de cálculo, haciendo que la fila de totales se mueva hacia abajo cada vez que se inserta una fila?

Saludos ...

Respuesta

7

Suponiendo que está utilizando el SDK 2.0, hice algo similar mediante el uso de esta función:

private static Row CreateRow(Row refRow, SheetData sheetData) 
    { 
     uint rowIndex = refRow.RowIndex.Value; 
     uint newRowIndex; 
     var newRow = (Row)refRow.Clone(); 

     /*IEnumerable<Row> rows = sheetData.Descendants<Row>().Where(r => r.RowIndex.Value >= rowIndex); 
     foreach (Row row in rows) 
     { 
      newRowIndex = System.Convert.ToUInt32(row.RowIndex.Value + 1); 

      foreach (Cell cell in row.Elements<Cell>()) 
      { 
       string cellReference = cell.CellReference.Value; 
       cell.CellReference = new StringValue(cellReference.Replace(row.RowIndex.Value.ToString(), newRowIndex.ToString())); 
      } 

      row.RowIndex = new UInt32Value(newRowIndex); 
     }*/ 

     sheetData.InsertBefore(newRow, refRow); 
     return newRow; 
    } 

No estoy seguro de cómo se estaban haciendo con InsertBeforeSelf antes , entonces tal vez esto no sea una gran mejora, pero esto funcionó para mí. Estaba pensando que podrías usar tu fila de totales como la fila de referencia. (La parte comentada es para si tenía filas después de la fila de referencia que quería mantener. Hice algunas modificaciones, pero la mayoría proviene de este hilo: http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/65c9ca1c-25d4-482d-8eb3-91a3512bb0ac)

Como devuelve la nueva fila, puede usar ese objeto luego edita los valores de la celda con los datos de la base de datos. Espero que esto sea al menos algo útil para cualquiera que trate de hacer esto ...

+0

Muchas gracias! ¡¡¡¡Yo estaba buscando esto!!!! –

+0

Tenga en cuenta que las celdas de fusión se guardan en objetos separados. Si desea mantener el formato de combinación correcto, debe actualizar sus referencias. Por favor, consulte http://stackoverflow.com/a/11455088/1099945 – gyosifov

2

[¿Puede alguien con más puntos por favor ponga este texto como un comentario de respuesta del M_R_H.]

La solución que dio ayudó M_R_H yo, pero introduce un nuevo error para el problema. Si usa el método CreateRow tal como está, si alguna de las filas que se mueven/se referencian nuevamente tiene fórmulas, se romperá CalcChain.xml (en el paquete). Agregué el siguiente código a la solución CreateRow propuesta. Todavía no se soluciona el problema, porque, creo que este código sólo es la fijación del momento-ser-copiado referencia de fila:

if (cell.CellFormula != null) { 
    string cellFormula = cell.CellFormula.Text; 
    cell.CellFormula = new CellFormula(cellFormula.Replace(row.RowIndex.Value.ToString(), newRowIndex.ToString())); 
} 

¿Cuál es la forma correcta para fijar/actualización CalcChain.xml?

PS: sheetData puede ser obtenido de la hoja de trabajo como:

worksheet.GetFirstChild<SheetData>(); 
Cuestiones relacionadas