2017-02-06 5 views
0

Привет, ребята, новичок в надстройках VSTO, и я разрабатываю проект, который должен иметь возможность извлекать любой файл excel из указанного пользователем местоположения и изменять его. Он отлично работает до тех пор, пока пользователь не выберет файл из sharepoint (это работает, имея открыватель файлов, чтобы пользователь мог просматривать любое местоположение). Я просмотрел документацию Microsoft и в Интернете и даже не могу найти начальное руководство по тому, как это сделать. Любые предложения о том, как я могу получить файл из sharepoint и изменить его?Доступ к файлу, хранящемуся в sharepoint, из надстройки Excel VSTO

ответ

0

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

Например, вы можете использовать следующий код для загрузки файлов из URL-адресов:

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Net; 
using System.Threading; 

class FileDownloader 
{ 
    private readonly string _url; 
    private readonly string _fullPathWhereToSave; 
    private bool _result = false; 
    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0); 

    public FileDownloader(string url, string fullPathWhereToSave) 
    { 
     if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url"); 
     if (string.IsNullOrEmpty(fullPathWhereToSave)) throw new ArgumentNullException("fullPathWhereToSave"); 

     this._url = url; 
     this._fullPathWhereToSave = fullPathWhereToSave; 
    } 

    public bool StartDownload(int timeout) 
    { 
     try 
     { 
      System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWhereToSave)); 

      if (File.Exists(_fullPathWhereToSave)) 
      { 
       File.Delete(_fullPathWhereToSave); 
      } 
      using (WebClient client = new WebClient()) 
      { 
       var ur = new Uri(_url); 
       // client.Credentials = new NetworkCredential("username", "password"); 
       client.DownloadProgressChanged += WebClientDownloadProgressChanged; 
       client.DownloadFileCompleted += WebClientDownloadCompleted; 
       Console.WriteLine(@"Downloading file:"); 
       client.DownloadFileAsync(ur, _fullPathWhereToSave); 
       _semaphore.Wait(timeout); 
       return _result && File.Exists(_fullPathWhereToSave); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Was not able to download file!"); 
      Console.Write(e); 
      return false; 
     } 
     finally 
     { 
      this._semaphore.Dispose(); 
     } 
    } 

    private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
    { 
     Console.Write("\r  --> {0}%.", e.ProgressPercentage); 
    } 

    private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args) 
    { 
     _result = !args.Cancelled; 
     if (!_result) 
     { 
      Console.Write(args.Error.ToString()); 
     } 
     Console.WriteLine(Environment.NewLine + "Download finished!"); 
     _semaphore.Release(); 
    } 

    public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec) 
    { 
     return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec); 
    } 
} 

Чтобы использовать код:

static void Main(string[] args) 
{ 
    var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec); 
    Console.WriteLine("Done - success: " + success); 
    Console.ReadLine(); 
} 
+0

Привет спасибо за это я дам ему шанс, и пусть вас знать! – Harry

+0

Привет, я сожалею, что у меня было достаточно времени, чтобы посмотреть на это, подскажет ли пользователь пароль или имя пользователя или тайм-аут? – Harry

Смежные вопросы