sheet.Cell [,] класс-оболочка - PullRequest
1 голос
/ 22 июня 2011

Я пытаюсь создать класс оболочки C # для:

sheet.Cells[int row, int colmn].Value = "some value";

Есть какие-то предложения или нужно как-то обойти это?

Заранее спасибо.

Комментарий:
Чтобы уточнить, лист является листом Excel. У нас есть сторонний компонент для написания отчетов Excel. Теперь нам нужно обновить отчеты, потому что этот сторонний компонент обновился. Что мне нужно сделать, это создать класс, который будет имитировать

sheet.Cell[int row, int colmn].Value = “Some Value”;  

Я ищу то, что описано в этой статье:
http://pietschsoft.com/post/2007/03/17/C-Give-your-object-a-Default-Indexer-Property.aspx

Однако, когда индексатор имеет два параметра, это усложняется.

Это решение, которое я придумал. Вероятно, это не самое лучшее решение. Однако я не мог найти другого выхода.

public class SheetClass  
{  
    public SheetWrapper Cells;

    public SheetClass(Worksheet _sheet)
    {
      Cells = new SheetWrapper(_sheet);
    }
}

public class SheetWrapper 
{
    private readonly Worksheet sheet;

    public PFCell this[int x, int y]
    {
        get { return new PFCell(this.sheet, x-1, y-1); }
    }

    public SheetWrapper(Worksheet sheet) 
    {
        this.sheet = sheet; 
    }
}

public class PFCell
{
    Worksheet ws;
    int x;
    int y;

    public PFCell(Worksheet ws, int x, int y)
    {
        this.ws = ws;
        this.x = x;
        this.y = y;
    }

    public object Value
    {
      get { return ws.Cells[x,y].Value; }
      set { ws.Cells[x,y].Value = value; }
    }
}

Тогда на странице я могу сделать следующее:

SheetClass sc = new SheetClass(sheet);
sc.Cells[1, 1].Value = "test";

Если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Ответы [ 2 ]

1 голос
/ 23 июня 2011

Похоже, что вы пытаетесь сохранить тот же синтаксис, что и стандартный код взаимодействия Excel, но при этом индексирование ячейки основывается на 2, а не на 1. Я не знаю много об объектной модели Excel, но похоже, что это должно работать:

public class SheetClass  
{
    RangeWrapper cells;
    public RangeWrapper Cells { get; }

    public SheetClass(Worksheet _sheet)
    {
        cells = new RangeWrapper(_sheet.Cells);
    }
}

public class RangeWrapper 
{
    private readonly Range cells;

    public Cell this[int x, int y]
    {
        get { return Cells[x-1, y-1]; }
    }

    public RangeWrapper(Range cells)
    {
        this.cells = cells;
    }
}
1 голос
/ 22 июня 2011
class SheetWrapper
{
    private readonly Sheet sheet;

    public SheetWrapper(Sheet sheet) { this.sheet = sheet; }

    public object this[int row, int column]
    {
        get { return sheet.Cells[row, column].Value; } // add null checks, etc
        set { sheet.Cells[row, column].Value = value; }
    }
}
...