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