2015-08-06 23 views
5

Vorrei inserire x nuove righe/colonne in un foglio di lavoro e applicare lo stile della riga/colonna da cui è stato inserito (backgroundcolor/border ecc.).EPPlus: Copia stile in un intervallo

Questo è come mi aggiungere nuove righe:

xlsSheet.InsertRow(18, RowCount); 

Poi vorrei copiare/applicare lo stile della "base" fila per le nuove righe inserite:

for (int i = 0; i < RowCount; i++) 
{ 
    xlsSheet.Cells[16, 1, 16, xlsSheet.Dimension.End.Column].Copy(xlsSheet.Cells[16 + i + 1, 1]); 
} 

ma questo il codice non copia/applica lo stile delle righe "base". In questo momento ho una soluzione alternativa con l'interoperabilità, ma ciò richiede anni rispetto a epplus. : -/

risposta

2

è necessario definire un foglio di lavoro come questo:

string sheetName="Your Sheet Name"; 
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add(sheetName); 

quindi è possibile utilizzare il seguente codice per modificare lo stile di tutto il foglio:

 Color colFromHex = System.Drawing.ColorTranslator.FromHtml("#B8C9E9"); 
     ws.Cells.Style.Fill.PatternType = ExcelFillStyle.Solid; 
     ws.Cells.Style.Fill.BackgroundColor.SetColor(colFromHex); 
     ws.Cells.Style.Border.Top.Style = ExcelBorderStyle.Medium; 
     // . . . . . 

E utilizzare il seguente codice per cambiare lo stile di un intervallo:

 Color colFromHex = System.Drawing.ColorTranslator.FromHtml("#B8C9E9"); 
     ws.Cells["A1:H16"].Style.Fill.PatternType = ExcelFillStyle.Solid; 
     ws.Cells["A1:H16"].Style.Fill.BackgroundColor.SetColor(colFromHex); 
     ws.Cells["A1:H16"].Style.Border.Top.Style = ExcelBorderStyle.Medium; 
+0

Ci sono 5-6 colori e stili di cella diversi nelle gamme, ecco perché stavo cercando di applicare lo stile dalla gamma. – kassi

4

Penso che abbiano rotto quella parte delle funzioni di copia con la versione 4. Vedere questo:

http://epplus.codeplex.com/workitem/15068

Quindi, potrebbe essere solo impostare manualmente gli ID stile dopo la copia:

[TestMethod] 
public void Copy_Styles_Test() 
{ 
    //http://stackoverflow.com/questions/31853046/epplus-copy-style-to-a-range 

    //Throw in some data 
    var datatable = new DataTable("tblData"); 
    datatable.Columns.AddRange(new[] {new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (int)) }); 

    for (var i = 0; i < 20; i++) 
    { 
     var row = datatable.NewRow(); 
     row[0] = i; row[1] = i * 10; row[2] = i * 100; 
     datatable.Rows.Add(row); 
    } 

    var existingFile = new FileInfo(@"c:\temp\test.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    using (var pck = new ExcelPackage(existingFile)) 
    { 
     const int rowCount = 5; 
     const int startRow = 18; 

     //Show the data 
     var xlsSheet = pck.Workbook.Worksheets.Add("Sheet1"); 
     xlsSheet.Cells.LoadFromDataTable(datatable, true); 

     //Throw in some styles for testing 
     xlsSheet.Row(startRow).Style.Fill.PatternType = ExcelFillStyle.Solid; 
     xlsSheet.Row(startRow).Style.Fill.BackgroundColor.SetColor(Color.Aqua); 
     xlsSheet.Cells[String.Format("A{0}:C{0}", startRow)].Style.Fill.BackgroundColor.SetColor(Color.Red); 

     //Insert new rows 
     xlsSheet.InsertRow(startRow, rowCount); 

     //Copy the cells and manually set the style IDs 
     var copyrow = startRow + rowCount; 
     for (var i = 0; i < rowCount; i++) 
     { 
      var row = startRow + i; 
      xlsSheet.Cells[String.Format("{0}:{0}", copyrow)].Copy(xlsSheet.Cells[String.Format("{0}:{0}", row)]); 
      xlsSheet.Row(row).StyleID = xlsSheet.Row(copyrow).StyleID; 
     } 

     //May not be needed but cant hurt 
     xlsSheet.Cells.Worksheet.Workbook.Styles.UpdateXml(); 

     //save it 
     pck.Save(); 
    } 
} 
+0

Grazie Ernie, ci provo! – kassi

2

Nel codice 4.0.4:

if (copyStylesFromRow > 0) 
{ 
    var cseS = new CellsStoreEnumerator<int>(_styles, copyStylesFromRow, 0, copyStylesFromRow, ExcelPackage.MaxColumns); //Fixes issue 15068 , 15090 
    while(cseS.Next()) 
    { 
     for (var r = 0; r < rows; r++) 
     { 
      _styles.SetValue(rowFrom + r, cseS.Column, cseS.Value); 
     } 
    } 
} 

si utilizza il valore copyStylesFromRow ma a causa della sequenza di codice, utilizza i nuovi numeri di riga. Quindi, se si voleva inserire 4 righe che iniziano nella riga 3:

workbook.Worksheets[1].InsertRow(3,4,6); 

Viene inserito un 4 nuove righe che iniziano nella riga 3, a causa riga 3 è incluso, si deve puntare al 6 ° fila. Questo è un bug, ma puoi renderlo conto.