2016-10-05 20 views
2

EPPlusを使用すると、ドキュメントをあらかじめ定義されたパスに保存するのは簡単ですが、毎回異なるパスに保存する必要があるため、標準の保存ダイアログを表示するにはEPPlusが必要です。EPPlusライブラリ

は、データテーブルからExcelファイルを作成することができます私のコード、それを少しフォーマットし、それが指定された場所に保存します。

  DirectoryInfo outputDir = new DirectoryInfo(@"C:\Users\user001\Downloads"); 
      FileInfo newFile = new FileInfo(outputDir.FullName + @"\Crit.xlsx"); 

      if (newFile.Exists) {newFile.Delete();} 

      using (ExcelPackage pck = new ExcelPackage(newFile)) 
      { 
       ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Crit"); 
       ws.Cells["A1"].LoadFromDataTable(dtCrit, true); 
       ws.Cells.AutoFitColumns(0); 
       ws.Cells["A1:Z1"].Style.Border.Top.Style = ExcelBorderStyle.Thin; 
       ws.Cells["A1:Z1"].Style.Font.Bold = true; 
       pck.Save(); 
      } 

がどのように手動でコピー先のフォルダを選択したためにダイアログボックスを表示することができますか? 私はpck.SaveAsてみましたが、私はそれを動作させることができず、このことについて多くの情報がありません...

UPDATE: プロジェクト内から、またはサーバーから実行時にアプリケーションが動作します。 shourcutで実行するとクラッシュするか、exeをデスクトップにコピー/ペーストします。

string mydocpath = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

     try { 
       DirectoryInfo outputDir = new DirectoryInfo(mydocpath); 
       FileInfo newFile = new FileInfo(outputDir.FullName + @"\Requerimientos_" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm") + ".xlsx"); 

       if (newFile.Exists) { newFile.Delete(); } 

       using (ExcelPackage pck = new ExcelPackage(newFile)) 
       { 
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Requerimientos"); 
        ws.Cells["A1"].LoadFromDataTable(dtReque, true); 
        ws.Cells.AutoFitColumns(0); 
        ws.Cells["A1:Z1"].Style.Border.Top.Style = ExcelBorderStyle.Thin; 
        ws.Cells["A1:Z1"].Style.Font.Bold = true; 

        var dlg = new SaveFileDialog { FileName = "Requerimientos_" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm"), DefaultExt = ".xlsx", Filter = "Excel Sheet (.xlsx)|*.xlsx", InitialDirectory = mydocpath }; 
        var result = dlg.ShowDialog(); 
        if (result == true) 
        { 
         using (var stream = dlg.OpenFile()) 
         { 
          pck.SaveAs(stream); 
          OpenDialog("File Created", "Export"); 
         } 
        } 
       } 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
+0

あなたは 'SaveFileDialog'を使ってみましたか? – Jose

+0

これはWPFで動作しますか?それを見つけることができません。 – Piston

+0

win32ライブラリでは、WPFにはsavefiledialog自体がありません。しかし、私はWPFプロジェクトに取り組んでおり、そのライブラリを使用しています。 – Jose

答えて

1

WPFはMicrosoft.Win32名前空間を通じて、標準のファイルダイアログを提供します。 SaveFileDialogを使用してダイアログボックスを表示し、保存するファイルを選択または作成することができます。あなたがファイルを選択したら

、あなたはパスからのFileInfoを作成して渡し、SaveAsに渡し、例えば:

// Configure save file dialog box 
var dlg = new Microsoft.Win32.SaveFileDialog 
       { 
        FileName = "NewSheet", // Default file name 
        DefaultExt = ".xlsx", // Default file extension 
        Filter = "Excel Sheet (.xlsx)|*.xlsx" // Filter files by extension 
       } 

// Show save file dialog box 
var result = dlg.ShowDialog(); 

// Process save file dialog box results 
if (result == true) 
{ 
    // Save document 
     string filename = new FileInfo(dlg.FileName); 
     package.SaveAs(newFile); 
} 

それともに保存するストリームを作成し、ダイアログ自身を持っているSaveFileDialog.OpenStreamを使用することができます:

if (result == true) 
{ 
     // Save document 
     using(var stream=dlg.OpenStream()) 
     { 
      package.SaveAs(stream); 
     } 
} 
+0

ありがとう、それは動作しますが、自分のコンピュータから実行しようとすると、私は直面しています。プロジェクトはサーバーに格納されており、自分のプロジェクト(サーバーから)から実行すると機能します。私はシャウトカットを作成するか、デスクトップにアプリケーションをコピー/ペーストします。私の更新を見て、最終的なコードを見てください。 – Piston

+0

@Piston何がエラーですか? Exception.ToString()によって返される*完全な例外は何ですか? –

+0

この場合、どうすれば入手できますか?アプリケーションは、典型的な "Program stopped working"ウィンドウでクラッシュします。更新されたコードをご覧ください。 – Piston

1

SaveFileDialogを使用してみてください:

private static bool? saveExcelPackageDialog(string fileName, string workingDirectory, byte[] rawBinaryObject) 
{ 
    SaveFileDialog sfd = new SaveFileDialog(); 
    sfd.Filter = EXCEL_FILTER_FILE_DIALOG; 
    sfd.InitialDirectory = workingDirectory; 
    sfd.FileName = fileName; 

    bool? result = sfd.ShowDialog(); 
    if (result == true) 
    { 
     File.WriteAllBytes(sfd.FileName, rawBinaryObject); 
     System.Diagnostics.Process.Start(sfd.FileName); 
    } 
    return result; 
} 

あなたはそのようにそれを使用する必要があります。

saveExcelPackageDialog(newFile.FullName, outputDir.FullName, pkg.GetAsByteArray()); 
+0

@Piston編集した回答を確認してください。 – Jose

+0

シートをメモリに生成する必要はありません。これにより、メモリの使用量が2倍になり、ユーザーがキャンセルするとメモリが無駄になります。 'SaveAs'は内容をファイルまたはストリームに保存できます。 –