2016-10-03 10 views
0

私のプログラムは、特定のExcelファイルを別のフォルダにイメージ(SVG形式)としてフォルダからエクスポートする必要があります。これは、メソッドCopyAndSaveToとExportRangeAsImageによって行うことができ、彼らは仕事をします。 MainWindowには、この2つの機能を実行するボタンがあります。このボタンをクリックしたユーザーに、このプロセスの進行状況(コピー+エクスポート)が通知されるようにします(プログレスバー)。 私はBackgroundWorkerのを使用して、それを実現しようとしていると、それは私が(方法ExportRangeAsImageで)次のコードをコメントしている場合にのみ機能します。進捗バー+ clipboard.getimage()with backgroundworker - WPF C#

Bitmap image = new Bitmap(System.Windows.Forms.Clipboard.GetImage()); 
image.Save(ImagePath + Path.GetFileNameWithoutExtension(file) + ".svg"); 

そうでなければ、私は次のようなエラーメッセージ( はドイツ語からの翻訳)を取得:

System.NullReferenceExceptionで "System.Drawing.dll"型の例外が発生しましたが、これはユーザーコードで処理されませんでした。 追加情報:オブジェクト参照がオブジェクトインスタンスに設定されていません。 ハンドラがこの例外に対して使用可能な場合、プログラムは安全に実行され続けます。ここで

は、全体のコードです:

private void UpdateDataOfLine1(object sender, ExecutedRoutedEventArgs e) 
     { 
      string[] files = Directory.GetFiles(RootPath); 
  
      BackgroundWorker worker = new BackgroundWorker(); 
      worker.WorkerReportsProgress = true; 
      worker.DoWork += worker_DoWork; 
      worker.ProgressChanged += worker_ProgressChanged; 
      worker.RunWorkerAsync(); 
     } 
  

  
     void worker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      string[] files = Directory.GetFiles(RootPath); 
  
      for (int i = 0; i < files.Length; i++) 
      { 
       if (files[i].Contains("$") || files[i].Contains("~") || files[i].Contains("Thumb")) 
       { 
        continue; 
       } 
  
       File.Copy(files[i], DestPath + Path.GetFileName(files[i]), true); 
  
       string newFile = DestPath + Path.GetFileName(files[i]); 
  
       ExPortRangeAsImage(newFile); 
  
       (sender as BackgroundWorker).ReportProgress(i); 
       Thread.Sleep(100); 
      } 
     } 
  

  
     void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      Status.Value = e.ProgressPercentage; 
     } 
  

     public void ExPortRangeAsImage(string file) 
     { 
      var ExcelApp = new Microsoft.Office.Interop.Excel.Application(); 
  
      try 
      { 
       if (file.Contains("BeispielDatei")) 
       { 
        Workbook wb = ExcelApp.Workbooks.Open(file); 
        Worksheet ws = (Worksheet)wb.Sheets[1]; 
        Range range = ws.Range["A1:U35"]; 
        range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap); 
        wb.Close(SaveChanges: false); 
        Marshal.ReleaseComObject(wb); 
       } 
  
       else 
       { 
        Workbook wb = ExcelApp.Workbooks.Open(file); 
        Worksheet ws = (Worksheet)wb.Sheets[1]; 
        Range range = ws.Range["A1:U35"]; 
        range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap); 
        wb.Close(SaveChanges: false); 
        Marshal.ReleaseComObject(wb); 
       } 
      } 
  
      finally 
      { 
       Bitmap image = new Bitmap(System.Windows.Forms.Clipboard.GetImage()); 
       image.Save(ImagePath + Path.GetFileNameWithoutExtension(file) + ".svg"); 
  
       Marshal.ReleaseComObject(ExcelApp); 
      } 
     } 

あなたは私が間違ってやっているか、私はそれを実現することができますどのように私を見ることができますか? BackgroundWorker以外の方法はありますか?

ありがとうございました!ここで

は、エラーのスクリーンショットは、あなたがスタックトレースを確認する必要があります

+0

System.NullReferenceExceptionが発生したときに停止を設定できます。また、どのコードがわからないのかわかりません。 – lindexi

+0

エラーのスクリーンショットを追加しました... – Guilian

+0

'image'オブジェクトか' ImagePath'がその2行でヌルであることを確認しますか? – AnjumSKhan

答えて

0

ですが、私はあなたの内部例外が原因クロススレッドのアクセス違反の可能性が高いと思います。

ヌル参照がおそらくnullを返すSystem.Windows.Forms.Clipboard.GetImage()のためにトリガーされている可能性があります。

あなたはUIディスパッチャスレッドで、この部分を実行してみてくださいすることができます。これはまた、最も可能性が高い(コピー&ペーストの間でレース)同期の問題を紹介します

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(()=> 
{ 
    Bitmap image = new Bitmap(System.Windows.Forms.Clipboard.GetImage()); 
    image.Save(ImagePath + Path.GetFileNameWithoutExtension(file) + ".svg"); 
} 

。別のイメージをクリップボードにコピーする前に、イメージの書き込みが完了していることを確認するために、コードを再構成する必要があります。

+0

ありがとうございました。 – Guilian

+0

タスクはバックグラウンドでタスクを実行するときに 'System.Windows.Forms.Clipboard'を使用できますか? @loopedcode – lindexi

+0

UI同期コンテキストを使用する必要があります。以下の例を参照してください。https://blogs.msdn.microsoft.com/csharpfaq/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context/ – loopedcode

関連する問題