Поделиться через


Практическое руководство. Задание значений для диапазонов

Дата последнего изменения: 1 мая 2010 г.

Применимо к: SharePoint Server 2010

Веб-службы Excel включают четыре метода задания значений в книге Excel: SetCell, SetCellA1, SetRange и SetRangeA1.

ПримечаниеПримечание

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

Если требуется сохранять изменения, внесенные в книгу, можно использовать метод GetWorkbook и затем сохранить книгу с помощью программного интерфейса конечного хранилища файла. Дополнительные сведения см. в разделах Получение рабочей книги целиком или ее снимка и How to: Save a Workbook.

Методы SetCell и SetCellA1 используются для задания значений в отдельной ячейке. При попытке задать значения для диапазона, например путем предъявления ссылки на диапазон, такой как "D3:G5", или именованный диапазон, превышающий отдельную ячейку, и т. д., произойдет сбой вызова метода. Для задания значений для диапазона ячеек необходимо использовать методы SetRange и SetRangeA1.

Методы, имеющие суффикс A1(SetCellA1 и SetRangeA1) используют систему координат, отличную от той, что используют методы, не имеющие этого суффикса (SetCell и SetRange). Если требуется использовать ссылки на ячейки типа Excel, такие как ссылки на диапазоны (например, H8, A3:D5, Sheet2!A12:G18) или именованные диапазоны, необходимо использовать методы с суффиксом A1. Такие методы позволяют предъявлять нужные имя листа и адрес диапазона.

Если требуется получить доступ к диапазону ячеек Excel, используя числовую систему координат, необходимо использовать методы, не имеющие суффикса A1. Гораздо проще использовать координаты диапазона при наличии кода, который выполняет циклическую итерацию по набору ячеек, или при динамическом вычислении координат диапазона в составе алгоритма.

Координаты строки и столбца ячейки отсчитываются от нуля. Таким образом, координата "0,0" возвращает ячейку A1, как в этом примере:

// Call the SetCell method to set a value, 8, into a cell.
// The cell is in the first row and first column; that is, cell A1.
xlservice.SetCell(sessionId, sheetName, 0, 0, 8);
' Call the SetCell method to set a value, 8, into a cell.
' The cell is in the first row and first column; that is, cell A1.
xlservice.SetCell(sessionId, sheetName, 0, 0, 8)

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

При задании значений для диапазона ячеек с помощью методов SetRange и SetRangeA1 используется массив объектов (object[] в C# и Object () в Visual Basic .NET). Массив объектов фактически является массивом массивов. Каждая запись в возвращаемом массиве будет представлять собой другой массив объектов, представляющий ячейки. Дополнительные сведения о массивах массивов см. в статье, посвященной массивам массивов (руководство по программированию на C#) (https://msdn.microsoft.com/ru-ru/library/2s05feca.aspx).

Задание значений с помощью методов SetCell и SetRange

  1. Метод SetCell используется для задания значения для ячейки в открытой книге на основе числовой системы координат:

    // Instantiate the Web service and make a status array object.
    ExcelService xlservice = new ExcelService();
    Status[] outStatus;
    RangeCoordinates rangeCoordinates = new RangeCoordinates();
    string sheetName = "Sheet2";
    
    // Set the path to a workbook.
    // The workbook must be in a trusted location.
    string targetWorkbookPath = "http://myserver02/example/Shared%20Documents/Book1.xlsx";
    
    // Set credentials for requests.
    xlservice.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
    // Call the open workbook, and point to the trusted 
    // location of the workbook to open.
    string sessionId = xlservice.OpenWorkbook(targetWorkbookPath, "en-US", "en-US", out outStatus);
    
    // Call the SetCell method to set the cell's value to 28.
    // The cell is in the ninth row and second column, which is cell B9.
    xlservice.SetCell(sessionId, sheetName, 8, 1, 28);
    
    ' Instantiate the Web service and make a status array object.
    Dim xlservice As New ExcelService()
    Dim outStatus() As Status
    Dim rangeCoordinates As New RangeCoordinates()
    Dim sheetName As String = "Sheet2"
    
    ' Set the path to a workbook.
    ' The workbook must be in a trusted location.
    Dim targetWorkbookPath As String = "http://myserver02/example/Shared%20Documents/Book1.xlsx"
    
    ' Set credentials for requests.
    xlservice.Credentials = System.Net.CredentialCache.DefaultCredentials
    
    ' Call the open workbook, and point to the trusted 
    ' location of the workbook to open.
    Dim sessionId As String = xlservice.OpenWorkbook(targetWorkbookPath, "en-US", "en-US", outStatus)
    
    ' Call the SetCell method to set the cell's value to 28.
    ' The cell is in the ninth row and second column, which is cell B9.
    xlservice.SetCell(sessionId, sheetName, 8, 1, 28)
    
  2. Метод SetRange используется для задания значений для диапазона ячеек в открытой книге на основе числовой системы координат:

    // Instantiate the Web service and make a status array object.
    ExcelService xlservice = new ExcelService();
    Status[] outStatus;
    RangeCoordinates rangeCoordinates = new RangeCoordinates();
    
    ...
    private void Form1_Load(object sender, EventArgs e)
    {
    ...
    ...
    //Prepare object to define range coordinates
    //and call the GetRange method.
    //startCol, startRow, startHeight, and startWidth
    //get their values from user input.
    rangeCoordinates.Column = (int)startCol.Value;
    rangeCoordinates.Row = (int)startRow.Value;
    rangeCoordinates.Height = (int)startHeight.Value;
    rangeCoordinates.Width = (int)startWidth.Value;
    ...
    ...
    }
    private void SetRangeButton_Click(object sender, EventArgs e)
    {
    object[] values = new object[rangeCoordinates.Height];
    string[] fieldValues =    
        SetRangeTextBox.Text.Split((",").ToCharArray());
    
    if (fieldValues.Length != rangeCoordinates.Height * 
    rangeCoordinate.Width)
        {
            throw new Exception("The number of inputs (" + 
                fieldValues.Length + ") does not match" +
                " the product of Height (" +             rangeCoordinates.Height + ") and Width (" + 
                rangeCoordinates.Width + ")");
        }
    
    for (int i = 0; i < rangeCoordinates.Height; i++)
        {
            object[] currentRow = 
                new object[rangeCoordinates.Width];
            for (int j = 0; j < rangeCoordinates.Width; j++)
            {
                currentRow[j] = fieldValues[i *             rangeCoordinates.Width + j];
            }
            values[i] = currentRow;
        }
    
    SetStatusText("Waiting for SetRange...");
    outStatus = xlservice.SetRange(
        sessionID, SheetNameTextBox.Text, 
        rangeCoordinates, values);
    }
    catch (SoapException exc)
    {
    StopTimer("SetRange");
    GenerateErrorMessage("SetRange", exc);
    }
    catch (Exception exc)
    {
    StopTimer("SetRange");
    GenerateToolErrorMessage("While calling SetRange", exc);
    }
    }
    
    ' Instantiate the Web service and make a status array object.
    Private xlservice As New ExcelService()
    Private outStatus() As Status
    Private rangeCoordinates As New RangeCoordinates()
    
    ...
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    ...
    ...
    'Prepare object to define range coordinates
    'and call the GetRange method.
    'startCol, startRow, startHeight, and startWidth
    'get their values from user input.
    rangeCoordinates.Column = CInt(Fix(startCol.Value))
    rangeCoordinates.Row = CInt(Fix(startRow.Value))
    rangeCoordinates.Height = CInt(Fix(startHeight.Value))
    rangeCoordinates.Width = CInt(Fix(startWidth.Value))
    ...
    ...
    End Sub
    Private Sub SetRangeButton_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim values(rangeCoordinates.Height - 1) As Object
    Dim fieldValues() As String = SetRangeTextBox.Text.Split((",").ToCharArray())
    
    If fieldValues.Length <> rangeCoordinates.Height * rangeCoordinate.Width Then
            Throw New Exception("The number of inputs (" & fieldValues.Length & ") does not match" & " the product of Height (" & rangeCoordinates.Height & ") and Width (" & rangeCoordinates.Width & ")")
    End If
    
    For i As Integer = 0 To rangeCoordinates.Height - 1
            Dim currentRow(rangeCoordinates.Width - 1) As Object
            For j As Integer = 0 To rangeCoordinates.Width - 1
                currentRow(j) = fieldValues(i * rangeCoordinates.Width + j)
            Next j
            values(i) = currentRow
    Next i
    Try
    SetStatusText("Waiting for SetRange...")
    outStatus = xlservice.SetRange(sessionID, SheetNameTextBox.Text, rangeCoordinates, values)
    Catch exc As SoapException
    StopTimer("SetRange")
    GenerateErrorMessage("SetRange", exc)
    Catch exc As Exception
    StopTimer("SetRange")
    GenerateToolErrorMessage("While calling SetRange", exc)
    End Try
    End Sub
    

Задание значений с помощью методов SetCellA1 и SetRangeA1

  1. Метод SetCellA1 используется для задания значения для ячейки в открытой книге с помощью спецификации диапазона Excel "A1":

    // Instantiate the Web service and make a status array object.
    ExcelService xlservice = new ExcelService();
    Status[] outStatus;
    
    xlservice.SetCellA1(sessionId, String.Empty, "InterestRateParam", 8);
    
    ' Instantiate the Web service and make a status array object.
    Dim xlservice As New ExcelService()
    Dim outStatus() As Status
    
    xlservice.SetCellA1(sessionId, String.Empty, "InterestRateParam", 8)
    
  2. Метод SetRangeA1 используется для задания значения для диапазона ячеек в открытой книге с помощью спецификации диапазона Excel "A1":

    // Instantiate the Web service and make a status array object.
    ExcelService xlservice = new ExcelService();
    Status[] outStatus;
    ...
    
    void SetRangeA1Button_ServerClick(object sender, EventArgs e)
    {
        int height, width;
        CalculateHeightAndWidth(RangeNameTextBox5.Value.Trim(), 
            out height, out width);
    
        object[] values = new object[height];
        string[] fieldValues = 
            RangeValuesTextBox1.Value.Split((",").ToCharArray());
        if (fieldValues.Length != height * width)
        {
            throw new Exception("The number of inputs (" + 
                fieldValues.Length + ") does not match" +
                " the product of Height (" + height + ") and 
                Width (" + width + ")");
        }
    
        for (int i = 0; i < height; i++)
        {
            object[] currentRow = new object[width];
            for (int j = 0; j < width; j++)
            {
                currentRow[j] = fieldValues[i * width + j];
            }
            values[i] = currentRow;
        }
        try
        {
            xlservice.SetRangeA1(SessionIDTextBox.Value, 
                SheetNameTextBox1.Value,RangeNameTextBox5.Value,
                values, out outStatus);
        }
        catch (SoapException exc)
        {
            ExceptionTextBox1.Value = exc.Message;
        }
    
    }
    
    ' Instantiate the Web service and make a status array object.
    Private xlservice As New ExcelService()
    Private outStatus() As Status
    ...
    
    Private Sub SetRangeA1Button_ServerClick(ByVal sender As Object, ByVal e As EventArgs)
        Dim height, width As Integer
        CalculateHeightAndWidth(RangeNameTextBox5.Value.Trim(), height, width)
    
        Dim values(height - 1) As Object
        Dim fieldValues() As String = RangeValuesTextBox1.Value.Split((",").ToCharArray())
        If fieldValues.Length <> height * width Then
            Throw New Exception("The number of inputs (" & fieldValues.Length & ") does not match" & " the product of Height (" & height & ") and Width (" & width & ")")
        End If
    
        For i As Integer = 0 To height - 1
            Dim currentRow(width - 1) As Object
            For j As Integer = 0 To width - 1
                currentRow(j) = fieldValues(i * width + j)
            Next j
            values(i) = currentRow
        Next i
        Try
            xlservice.SetRangeA1(SessionIDTextBox.Value, SheetNameTextBox1.Value,RangeNameTextBox5.Value, values, outStatus)
        Catch exc As SoapException
            ExceptionTextBox1.Value = exc.Message
        End Try
    
    End Sub
    

См. также

Задачи

Установка адреса диапазона и имени листа

Практическое руководство. Получение значений из диапазонов

Пошаговое руководство. Разработка настраиваемого приложения с помощью веб-служб Excel

Концепции

Доступ к API-интерфейсу SOAP