C# 导出Excel的,导出时弹出保存对话框
各位大侠,帮忙看看我的代码有什么问题,怎么解决?万分感谢!!!
protected void btnocexport_Click(object sender, EventArgs e)
{
StringBuilder sqlsb = new StringBuilder("SELECT ID,Date,Batch_Job,OC_Rsync,SU_Rsync FROM IT_BatchJob WHERE 1=1");
if (this.txtdate.Text.ToString() != "" && this.txtenddate.Text.ToString() == "")
sqlsb.Append(" AND Date = '" + this.txtdate.Text.ToString().Trim().Replace("'", "''") + "'");
if (this.txtdate.Text.ToString() != "" && this.txtenddate.Text.ToString() != "")
sqlsb.Append(" AND Date >= '" + this.txtdate.Text.ToString().Trim().Replace("'", "''") + "' AND Date <= '" + this.txtenddate.Text.ToString().Trim().Replace("'", "''") + "'");
ViewState["_VsSql"] = sqlsb.ToString();
//输出SQL语句
//Response.Write(ViewState["_VsSql"]);
using (DBSql db = new DBSql())
{
DataTable dt = db.QueryDt(ViewState["_VsSql"].ToString());
string saveFileName = "";
bool fileSaved = false;
System.Windows.Forms.SaveFileDialog saveDialog = new System.Windows.Forms.SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = "Sheet1";
saveDialog.ShowDialog();//执行到这里出错:错误提示:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
System.Windows.Forms.MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
return;
}
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得Sheet1
int rows = dt.Rows.Count; //行数
int columns = dt.Columns.Count;//列数
Workbook book = new Workbook();
Worksheet sheet = new Worksheet("sheet1");
//Excel列名
sheet.Cells[0, 0] = new Cell("ID");
sheet.Cells[0, 1] = new Cell("Date");
sheet.Cells[0, 2] = new Cell("Batch Job");
sheet.Cells[0, 3] = new Cell("OC Rsync");
sheet.Cells[0, 4] = new Cell("SU Rsync");
string value = "";
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < columns; c++)
{
if (dt.Rows[r][c].ToString() != " ")
{
//value = dt.Rows[r].Cells[c].Text;
value = dt.Rows[r][c].ToString();
if (value == "True")
{
sheet.Cells[r + 1, c] = new Cell(1);
}
else if (value == "False")
{
sheet.Cells[r + 1, c] = new Cell(0);
}
else
{
sheet.Cells[r + 1, c] = new Cell(value);
}
}
}
}
//book.Worksheets.Add(sheet);
//book.Save(@"D:\导出.xls");
worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
//if (cmbxType.Text != "Notification")
//{
// Excel.Range rg = worksheet.get_Range(worksheet.Cells[2, 2], worksheet.Cells[ds.Tables[0].Rows.Count + 1, 2]);
// rg.NumberFormat = "00000000";
//}
if (saveFileName != "")
{
try
{
workbook.Saved = true;
workbook.SaveCopyAs(saveFileName);
fileSaved = true;
}
catch (Exception ex)
{
fileSaved = false;
System.Windows.Forms.MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
}
}
else
{
fileSaved = false;
}
xlApp.Quit();
GC.Collect();//强行销毁
if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打开EXCEL
}
}