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


Получение рабочей книги целиком или ее снимка

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

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

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

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

Снимок рабочей книги, сохраненный ранее на сервере, можно получить даже в том случае, если отсутствуют права на доступ к исходному файлу на сервере.

Для получения снимка рабочей книги целиком или любого из видов снимков используется метод GetWorkbook веб-службы. Например, в следующем коде возвращается снимок рабочей книги Excel целиком. В этом примере перечисление WorkbookType.FullSnapshot используется в качестве второго аргумента метода GetWorkbook.

byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot, out status);
Dim workbook() As Byte = xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot, status)

Метод GetWorkbook возвращает массив байтов в формате Excel, соответствующем формату файла, загруженного в сеанс.

Чтобы получить снимок компонентов рабочей книги Excel, которые определены автором как доступные для просмотра при сохранении книги на сервере, воспользуйтесь перечислением WorkbookType.PublishedItemsSnapshot, как показано ниже:

byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.PublishedItemsSnapshot, out status);
Dim workbook() As Byte = xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot, status)

Чтобы получить снимок рабочей книги целиком в ее текущем состоянии в сеансе, воспользуйтесь перечислением WorkbookType.FullWorkbook:

byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullWorkbook, out status);
Dim workbook() As Byte = xlService.GetWorkbook(sessionId, WorkbookType.FullWorkbook, status)

Параметр WorkbookType.FullWorkbook работает только при наличии у пользователя прав на открытие файла. Если пользователю назначены только права на просмотр файла, вызов завершается сбоем.

В некоторых случаях в коде требуется сохранить результаты вызова метода GetWorkbook . Сведения о сохранении рабочей книги см. в примере How to: Save a Workbook.

Дополнительные сведения о методе GetWorkbook и перечислении WorkbookType см. в справочной документации по веб-службам Excel.

Пример

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

using System;
using System.IO;
using System.Text;
using System.Web.Services.Protocols;
// TODO: Change the using GetSnapshot.myServer02 statement 
// to point to the Web service you are referencing.
using GetSnapshot.myServer02;

namespace GetSnapshot
{
    class ExcelServicesSnapshot
    {
        static void Main(string[] args)
        {
            try
            {
                if (args.Length < 1)
                {
                    Console.Error.WriteLine("Command line arguments should be: GetSnapshot [workbook_path] > [snapshot_filename]");
                    return;
                }
                // Instantiate the Web service and 
                // create a status array object.
                ExcelService xlService = new ExcelService();
                Status[] status;
                
                xlService.Timeout = 600000;
                // Set credentials for requests.
                // Use the current user's logon credentials.
                xlService.Credentials =   
                    System.Net.CredentialCache.DefaultCredentials;
                 
                // Open the workbook, then call GetWorkbook 
                // and close the session.
                string sessionId = xlService.OpenWorkbook(args[0], "en-US", "en-US", out status);
                byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.PublishedItemsSnapshot, out status);
                // byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullWorkbook, out status);
                // byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot, out status);

                // Close the workbook. This also closes the session.
                status = xlService.CloseWorkbook(sessionId);

                // Write the resulting Excel file to stdout 
                // as a binary stream.
                BinaryWriter binaryWriter = new BinaryWriter(Console.OpenStandardOutput());
                binaryWriter.Write(workbook);
                binaryWriter.Close();
            }

            catch (SoapException e)
            {
                Console.WriteLine("SOAP Exception Message: {0}", e.Message);
            }

            catch (Exception e)
            {
                Console.WriteLine("Exception Message: {0}", e.Message);
            }   
        } 
    }
}
Imports System
Imports System.IO
Imports System.Text
Imports System.Web.Services.Protocols
' TODO: Change the using GetSnapshot.myServer02 statement 
' to point to the Web service you are referencing.
Imports GetSnapshot.myServer02

Namespace GetSnapshot
    Friend Class ExcelServicesSnapshot
        Shared Sub Main(ByVal args() As String)
            Try
                If args.Length < 1 Then
                    Console.Error.WriteLine("Command line arguments should be: GetSnapshot [workbook_path] > [snapshot_filename]")
                    Return
                End If
                ' Instantiate the Web service and 
                ' create a status array object.
                Dim xlService As New ExcelService()
                Dim status() As Status

                xlService.Timeout = 600000
                ' Set credentials for requests.
                ' Use the current user's logon credentials.
                xlService.Credentials = System.Net.CredentialCache.DefaultCredentials

                ' Open the workbook, then call GetWorkbook 
                ' and close the session.
                Dim sessionId As String = xlService.OpenWorkbook(args(0), "en-US", "en-US", status)
                Dim workbook() As Byte = xlService.GetWorkbook(sessionId, WorkbookType.PublishedItemsSnapshot, status)
                ' byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullWorkbook, out status);
                ' byte[] workbook = xlService.GetWorkbook(sessionId, WorkbookType.FullSnapshot, out status);

                ' Close the workbook. This also closes the session.
                status = xlService.CloseWorkbook(sessionId)

                ' Write the resulting Excel file to stdout 
                ' as a binary stream.
                Dim binaryWriter As New BinaryWriter(Console.OpenStandardOutput())
                binaryWriter.Write(workbook)
                binaryWriter.Close()

            Catch e As SoapException
                Console.WriteLine("SOAP Exception Message: {0}", e.Message)

            Catch e As Exception
                Console.WriteLine("Exception Message: {0}", e.Message)
            End Try
        End Sub
    End Class
End Namespace

Для запуска приложения GetSnapshot используйте следующие аргументы командной строки:

GetSnapshot.exe [workbook_path] > [snapshot_filename]

Например:

C:\>GetSnapshot.exe http://myServer02/reports/reports/OriginalWorkbook.xlsx > SnapshotCopy.xlsx

В предыдущем примере программа GetSnapshot помещает новый файл в каталог "C:\".

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

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

Надежное программирование

Убедитесь, что добавлена веб-ссылка на доступный сайт веб-служб Excel. Измените выражение using GetSnapshot.myServer02; таким образом, чтобы оно указывало на соответствующий сайт веб-службы.

См. также

Задачи

Шаг 1. Создание проекта клиента веб-службы

Этап 2. Добавление веб-ссылки

Этап 3. Получение доступа к веб-службе

Этап 4. Построение и тестирование приложения

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

Инструкции по определению надежного расположения

Концепции

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