私のプログラムは、特定の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以外の方法はありますか?
ありがとうございました!ここで
は、エラーのスクリーンショットは、あなたがスタックトレースを確認する必要があります
System.NullReferenceExceptionが発生したときに停止を設定できます。また、どのコードがわからないのかわかりません。 – lindexi
エラーのスクリーンショットを追加しました... – Guilian
'image'オブジェクトか' ImagePath'がその2行でヌルであることを確認しますか? – AnjumSKhan