Как добавить линии сетки на один лист, а не на другой (С# Excel Interop)?

Подобно некоторым ответам здесь, я отключаю линии сетки в своем файле Excel таким образом. :

private ApplicationClass _xlApp;
. . .
_xlApp = new ApplicationClass { UserControl = true };
_xlApp.ActiveWindow.DisplayGridlines = false;

Однако в моей рабочей книге я создаю два листа, и второй должен отображать линии сетки. Как я могу переключить отображение линий сетки на уровне рабочего листа?

Я пробовал это:

private ApplicationClass _xlApp;
private ApplicationClass _xlApp2;
. . .
_xlApp = new ApplicationClass { UserControl = true };
_xlApp.ActiveWindow.DisplayGridlines = false;
. . .
_xlApp2 = new ApplicationClass { UserControl = true };
_xlApp2.ActiveWindow.DisplayGridlines = true;

... но это выдало электронное письмо, информирующее меня во время выполнения, что «Ссылка на объект не указывает на экземпляр объекта» в последней строке, отображаемой выше.

Итак, могу ли я установить один лист с сеткой, а другой без сетки, или мне придется взять на себя ответственность и добавить универсальные границы на второй лист?

ОБНОВИТЬ

Ссылка от Дэвида Тэнси была интригующей, но она не давала никакого конкретного или даже абстрактного примера того, как использовать объект Worksheetview. Итак, я проглотил (бац?) «Пример отображения таблицы взаимодействия c# Excel» и нашел это.

Затем я экстраполировал этот код «Виртуального шутовства»:

Dim wsv As WorksheetView 
Set wsv = wnd.SheetViews(1) 
' Display formulas and zeros, but hide 
' gridlines, headings, and outlines: 
wsv.DisplayFormulas = True 
wsv.DisplayGridlines = False 
wsv.DisplayHeadings = False 
wsv.DisplayOutline = False 
wsv.DisplayZeros = True 

... и С# определил это так:

// existing:
private ApplicationClass _xlApp;
_xlApp = new ApplicationClass { UserControl = true };

// new / extrapolated:
WorksheetView wsv = _xlApp.ActiveWindow.SheetViews(2);
wsv.DisplayGridlines = true;
wsv.DisplayZeros = true;

... но получил шутку во время компиляции: «Не вызываемый элемент Microsoft.Office.Interop.Excel.Window.SheetViews не может использоваться как метод.»

Итак, я попробовал это:

WorksheetView wsv = (WorksheetView)_xlApp.Sheets[2];    
wsv.DisplayGridlines = true;
wsv.DisplayZeros = true;

Он скомпилирован, но во время выполнения я очень разочарован (и даже расстроен, цитируя Хампердинка) тем, что «невозможно привести тип COM-объекта «System.__ComObject» к типу интерфейса «Microsoft.Office.Interop.Excel.WorksheetView». .'...Такой интерфейс не поддерживается"

Так есть ли способ сделать это на С#, или это одна из тех областей, где Virus Bits имеет это по сравнению с С#?

ОБНОВЛЕНИЕ 2

Эта вариация на тему вызывает такой же отклик у электронных духов:

_xlSheetDelPerf = (Worksheet)_xlSheets.Item[2];
WorksheetView wsv = (WorksheetView)_xlSheetDelPerf;
wsv.DisplayGridlines = true;
wsv.DisplayZeros = true;

person B. Clay Shannon    schedule 01.12.2015    source источник
comment
Взгляните на объект WorksheetView, который имеет свойство DisplayGridLines msdn.microsoft. .com/EN-US/library/office/ff837066.aspx   -  person David Tansey    schedule 01.12.2015
comment
Ну, похоже, ваша конкретная проблема заключается в том, что ваше приведение к WorksheetView не работает. Является ли ваш вызов Sheets[2] нулевым? Он даже возвращает WorksheetView?   -  person The Muffin Man    schedule 02.12.2015
comment
@TheMuffinMan: Это отлично работает: _xlSheetDelPerf = (Worksheet)_xlSheets.Item[2];   -  person B. Clay Shannon    schedule 02.12.2015


Ответы (1)


Мне не удалось найти простой способ сделать это, поэтому я "принудил к этому" следующим образом:

// Add borders to the sheet
var delPerfDataRange =
    _xlSheetDelPerf.Range[_xlSheetDelPerf.Cells[1, _xlSheetDelPerf.UsedRange.Columns.Count],            
_xlSheetDelPerf.Cells[_xlSheetDelPerf.UsedRange.Rows.Count, _xlSheetDelPerf.UsedColumns.Count]];
Borders _dataBorders = delPerfDataRange.Borders;
_dataBorders[XlBordersIndex.xlEdgeLeft].LineStyle = XlLineStyle.xlContinuous;
_dataBorders[XlBordersIndex.xlEdgeRight].LineStyle = XlLineStyle.xlContinuous;
_dataBorders[XlBordersIndex.xlEdgeTop].LineStyle = XlLineStyle.xlContinuous;
_dataBorders[XlBordersIndex.xlEdgeBottom].LineStyle = XlLineStyle.xlContinuous;
_dataBorders.Color = Color.Black;

На самом деле, мне все равно пришлось ограничить диапазон сетки, поэтому я сделал следующее:

// Add borders around all the data
var delPerfDataRange =
    _xlSheetDelPerf.Range[_xlSheetDelPerf.Cells[DEL_PERF_FIRST_DATA_ROW, PROACT_DISTRIBUTOR_COLUMN],            
        _xlSheetDelPerf.Cells[curDelPerfRow - 1, TOTAL_PACKAGE_COUNT_COLUMN]];
Borders _dataBorders = delPerfDataRange.Borders;
_dataBorders[XlBordersIndex.xlEdgeLeft].LineStyle = XlLineStyle.xlContinuous;
_dataBorders[XlBordersIndex.xlEdgeRight].LineStyle = XlLineStyle.xlContinuous;
_dataBorders[XlBordersIndex.xlEdgeTop].LineStyle = XlLineStyle.xlContinuous;
_dataBorders[XlBordersIndex.xlEdgeBottom].LineStyle = XlLineStyle.xlContinuous;
_dataBorders.Color = Color.Black;
person B. Clay Shannon    schedule 01.12.2015