Вставка строк и изменение границ ячеек в Excel Interop из C#

Задача: вставить строки в таблицу Excel и проставить границы ячеек. Вставка строки может потребовать если ниже динамически заполняемой таблицы находятся еще какие-то данные, например подвал документа с подписями и/или статистикой.

при наличии

using Excel = Microsoft.Office.Interop.Excel;
// разный код
private Excel.Worksheet _workSheet;

вставка строки будет выглядеть так

        public void InsertRow(int rowNum)
        {
            Excel.Range cellRange = (Excel.Range) _workSheet.Cells[rowNum, 1];
            Excel.Range rowRange = cellRange.EntireRow;
            rowRange.Insert(Excel.XlInsertShiftDirection.xlShiftDown, false); 
        }

При этом надо учитывать то, что во вставляемую строку будет копироваться стиль текста предыдущей строки, но не будет копироваться стиль границ.Избавится от копирования стиля текста из шапки таблицы можно тупо начав встовлять строки со второй, но вот границы придется проставлять вручную.

Границы в Excel задаются сочетанием двух параметров - типа линии XlLineStyle и толщины линии XlBorderWeight, для задания границ надо вытащить из ячейки обьект типа Borders. При этом надо учитывать, что если мы в общей куче зададим для одной ячейки отсуствующие у нее внутренние границы, то Excel 2007 и старше отработает нормально, а Excel 2003 вылетит с ошибкой.

При наличии

public enum ExcelLineType { DotsSmall, Dots, None, Normal, Thick, Double }

Можно использовать такие методы для класса, инкапсулирующего документ Excel

       public void SetCellBorders(int rowNumber, int columnNumber, ExcelLineType lineType)
        {
            Excel.XlLineStyle lineStyle;
            Excel.XlBorderWeight lineWeight;
            setLineStyleAndWeight(lineType, out lineStyle, out lineWeight);

            Excel.Range cellRange = (Excel.Range)_workSheet.Cells[rowNumber, columnNumber];
            Excel.Borders borders = cellRange.Borders;

            borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = lineStyle;
            borders[Excel.XlBordersIndex.xlEdgeTop].Weight = lineWeight;

            borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = lineStyle;
            borders[Excel.XlBordersIndex.xlEdgeBottom].Weight = lineWeight;

            borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = lineStyle;
            borders[Excel.XlBordersIndex.xlEdgeLeft].Weight = lineWeight;

            borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = lineStyle;
            borders[Excel.XlBordersIndex.xlEdgeRight].Weight = lineWeight;
        }

        private void setLineStyleAndWeight(ExcelLineType lineType, out Excel.XlLineStyle lineStyle, out Excel.XlBorderWeight lineWeight)
        {
            lineStyle = Excel.XlLineStyle.xlContinuous;
            lineWeight = Excel.XlBorderWeight.xlThin;

            if (lineType == ExcelLineType.DotsSmall)
            {
                lineStyle = Excel.XlLineStyle.xlDot;
                lineWeight = Excel.XlBorderWeight.xlHairline;
            }
            else if (lineType == ExcelLineType.Thick)
            {
                lineStyle = Excel.XlLineStyle.xlDot;
                lineWeight = Excel.XlBorderWeight.xlMedium;
            }
            else if (lineType == ExcelLineType.None)
            {
                lineStyle = Excel.XlLineStyle.xlLineStyleNone;
            }
            else if (lineType == ExcelLineType.Double)
            {
                lineStyle = Excel.XlLineStyle.xlDouble;
                lineWeight = Excel.XlBorderWeight.xlThick;
            }
            else if (lineType == ExcelLineType.Dots)
            {
                lineStyle = Excel.XlLineStyle.xlDot;
            }
        }

XlLineStyle Enumeration
XlBorderWeight Enumeration
Borders Interface


Комментарии

Вставка строк и изменение границ ячеек в Excel Interop из C# — Комментарии (2)

  1. А можно ли как то объединить ячейки между собой? Иными словами стереть границы у определенных ячеек? То есть суть в том что в Excel у меня есть объединенные между собой ячейки, но в датагридвиев они у меня не объединены? Перерыл гугл, находил несколько способов но ни 1 не получился(

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>