1

正常に機能しているように見える次のアプローチを実装しましたが、ファイルを事前定義された場所に保存します。代わりに、通常のダウンロードポップアップと同様に、ユーザーにオプションを提供したいと思います:開く、保存する、名前を付けて保存します。何か案が?


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

編集:

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(.....
} 

編集の終わり。

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();
}
4

3 に答える 3

2

アプリケーションにSaveFileDialogを追加して、ユーザーからファイル名を取得するだけです。

String SaveName;

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

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

を使用して行うこともできます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();
}
于 2012-04-15T18:12:36.673 に答える
0

「foreach」ループの実行方法は、多数のレコード (20000 以上としましょう) を処理する場合、非常に時間がかかります。

EPPlus lib を使用することをお勧めします。

データテーブルをExcelに直接配置する方法は次のとおりです。

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

私はそれをテストしましたが、約2秒かかりました。

MS が "Microsoft.Office.Interop.Excel" でそのような機能を提供していない理由がわかりません。

于 2013-05-28T15:36:40.103 に答える