EPPlus: копирование стиля в диапазон

я хотел бы вставить x-новые строки/столбцы в рабочий лист и применить стиль строки/столбца, из которого был вставлен (фоновый цвет/граница и т. д.).

Вот как я добавляю новые строки:

xlsSheet.InsertRow(18, RowCount);

Затем я хотел бы скопировать/применить стиль «базовой» строки к новым вставленным строкам:

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

Но этот код не копирует/применяет стиль «базовых» строк. На данный момент у меня есть обходной путь с взаимодействием, но это занимает годы по сравнению с epplus. :-/


person kassi    schedule 06.08.2015    source источник


Ответы (3)


В коде 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);
        }
    }
}

он использует значение copyStylesFromRow, но из-за последовательности кода использует новые номера строк. Итак, если вы хотите вставить 4 строки, начиная с строки 3:

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

Это вставляет 4 новые строки, начиная с строки 3, поскольку строка 3 включена, вы должны указать на 6-ю строку. Это ошибка, но вы можете объяснить это.

person Glenn D Orr    schedule 15.12.2015

Я думаю, что они сломали эту часть функций копирования в версии 4. Смотрите это:

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

Таким образом, можно просто вручную установить идентификаторы стилей после копирования:

[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();
    }
}
person Ernie S    schedule 07.08.2015
comment
Спасибо, Эрни, я попробую! - person kassi; 17.08.2015

Вы должны определить рабочий лист следующим образом:

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

Затем вы можете использовать следующий код, чтобы изменить стиль всего листа:

      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;
      // . . . . .

И используйте следующий код, чтобы изменить стиль диапазона:

       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;
person Mehmed    schedule 06.08.2015
comment
В диапазонах есть 5-6 разных цветов и стилей ячеек, поэтому я хотел применить стиль из диапазона. - person kassi; 07.08.2015