2012-04-15 18 views
1

私はうまく動作しているようだ、次のアプローチは、しかし、それは同じように、代わりに私は、ユーザーに選択肢を与えるためにそれをたいと思い、事前に定義された場所にファイルを保存し実装しました通常のダウンロードポップアップ:開く、保存する、名前を付けて保存する。何か案が?。名前を付けて保存/開く]で必要なポップアップ


例外「OLEの呼び出しを行うことができる前に、現在のスレッドがシングルスレッドアパートメント(STA)モードに設定する必要があります」克服するために、スレッドは、EDITを参照して、実装する必要がありました!

EDIT:EDIT OF

1)

using System.Threading; 

2)

[STAThread] 
private static void ExportToExcel(DataTable dt) 
{ 
    Thread t = new Thread(SaveIt); 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(dt); 
} 

3)

static void SaveIt(Object dt) 
{ 
    DataTable table = (DataTable)dt; 
    System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog(); 

    if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     SaveName = sfd.FileName; 
    else 
     SaveName = "ResourceProfile"; 
    workbook.SaveAs(..... 
} 

END。

private static void ExportToExcel(DataTable dt) 
{ 
    Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
    Microsoft.Office.Interop.Excel.Workbook workbook = excel.Application.Workbooks.Add(true); 

    int iCol = 0; 
    foreach (DataColumn c in dt.Columns) 
    { 
     iCol++; 
     excel.Cells[1, iCol] = c.ColumnName; 
    } 

    int iRow = 0; 
    foreach (DataRow r in dt.Rows) 
    { 
     iRow++; 

     // add each row's cell data... 
     iCol = 0; 
     foreach (DataColumn c in dt.Columns) 
     { 
      iCol++; 
      excel.Cells[iRow + 1, iCol] = r[c.ColumnName]; 
     } 
    } 

    object missing = System.Reflection.Missing.Value; 

    DateTime CurrentDate = DateTime.Now;   

    String CurDate = CurrentDate.ToShortDateString().Replace("/","."); 

    workbook.SaveAs("ResourceProfile-" + CurDate + ".xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); 

    excel.Visible = true; 
    Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveSheet; 
    ((Microsoft.Office.Interop.Excel._Worksheet)worksheet).Activate(); 

    ((Microsoft.Office.Interop.Excel._Application)excel).Quit(); 
} 

答えて

2

ちょうどあなたのアプリケーションにSaveFileDialogを追加し、ユーザからファイル名を取得:

String SaveName; 

if saveFileDialog1.ShowDialog = DialogResult.OK 
{ 
    SaveName := saveFileDialog1.FileName; 
    workBook.SaveAs(SaveName, ...); 
} 

あなたがのさまざまなプロパティを設定することで、デフォルトのフォルダの場所、ファイル拡張子、およびその他の情報を設定することができますSaveFileDialog。あなたも、それらを受け入れるか、または変更するためにあなたがあなたの前にShowDialog上に作成したデフォルトの名前にSaveDialog.FileNameを設定することができます。

ます。また、それはexcel.Application.get_FileDialogを使用してくださいすることができます - ここでの例です:

Microsoft.Office.Core.FileDialog fd = 
    excel.Application.get_FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogSaveAs); 

fd.AllowMultiSelect = true; 
fd.Filters.Clear(); 
fd.Filters.Add("Excel Files", "*.xls;*.xlw", missing); 
fd.Filters.Add("All Files", "*.*", missing); 

if (fd.Show() != 0) 
{ 
    fd.Execute(); 
} 
+0

ありがとうございます。私はSFDを追加し、「sfd.ShowDialog()」に達した時点で次のエラーを受け取っています。現在のスレッドは、OLE呼び出しを行う前にシングルスレッドアパートメント(STA)モードに設定する必要があります。 Main関数にSTAThreadAttributeが設定されていることを確認してください。この例外は、デバッガがプロセスにアタッチされている場合にのみ発生します。それはどんな鐘も鳴らしますか? – Jake

+0

コードは通常正常に動作します。バックグラウンドスレッドで処理していますか?エラーメッセージによると、 'Main'関数に' STAThreadAttribute'を追加することができます。それはデバッガの下でのみ発生するので、あなたのアプリケーションを実行している実際のプロセスであるデバッガと何か関係があるかもしれません。申し訳ありませんが、私はその問題の答えを知らない。 2番目のコードセグメント(Excelの独自のダイアログを使用)は何か変更されますか? –

+0

は、それは全くのAjaxとは何かを持ってもらえますか?私はあなたの他の解決策を調べようとしています。 – Jake

0

多数のレコードを処理している場合は、「foreachの」ループを行っている方法は非常に多くの時間がかかります(そして、より多くを言うことができます20000以上)。

私はEPPlusのlibが使用することをお勧めします。ここで

は、あなたが直接Excelにデータテーブルに置くことができる方法である。

worksheet.Cells["A1"].LoadFromDataTable(dtForExcel, true); 

私はそれをテストし、そのわずか約2秒を取ってきました。 MSが「Microsoft.Office.Interop.Excel」で、このような機能を与えられていない理由を

は、私は理解していませんか?

関連する問題