如何在客户端保存导出的Excel文件?

时间:2015-07-14 06:34:02

标签: c# asp.net excel

我已经使用Microsoft.Office.Interop.Excel dll将数据导出到excel它工作正常但它只在服务器位置下载而不是在客户端位置。我们如何在客户端位置下载文件。这是我用于导出到excel的代码以及我们如何询问位置以保存excel文件。

DataSet dsColors = objClsCorp.GetBlockColorsForReport();
        if (dsReport.Tables.Count > 0 && dsColors.Tables.Count > 0)
        {
            Application ExcelApp = new Application();
            Workbook ExcelWorkBook = null;
            Worksheet ExcelWorkSheet = null;
            ExcelApp.Visible = true;
            ExcelWorkBook = ExcelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);

            for (int i = 1; i < dsColors.Tables[0].Rows.Count; i++)
            {
                ExcelWorkBook.Worksheets.Add(); //Adding New sheet in Excel Workbook
            }

            for (int i = 0; i < dsColors.Tables[0].Rows.Count; i++)
            {
                int r = 1; // Initialize Excel Row Start Position  = 1
                ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets[i + 1];
                //Writing Columns Name in Excel Sheet
                for (int col = 1; col <= dsReport.Tables[0].Columns.Count; col++)
                {
                    ExcelWorkSheet.Cells[r, col] = dsReport.Tables[0].Columns[col - 1].ColumnName;
                }
                r++;

                System.Data.DataTable table = dsReport.Tables[0];
                if (table.Rows.Count > 0)
                {
                    table.DefaultView.RowFilter = "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString()+"'";
                    table = table.DefaultView.ToTable();

                    //Writing Rows into Excel Sheet
                    for (int row = 0; row < table.Rows.Count; row++) //r stands for ExcelRow and col for ExcelColumn
                    {
                        // Excel row and column start positions for writing Row=1 and Col=1
                        for (int col = 1; col <= table.Columns.Count; col++)
                        {
                            ExcelWorkSheet.Cells[r, col] = table.Rows[row][col - 1].ToString();
                        }
                        r++;
                    }
                }                  

                if (table.Rows.Count > 0)
                {
                    int TotalStock = 0;
                    decimal TotalBQTYSFT = 0;
                    int TotalTodayMarked = 0;
                    decimal TotalMQTYSFT = 0;
                    int TotalMarked = 0;
                    decimal TotalTMQTYSFT = 0;
                    int TotalBalanceNos = 0;
                    decimal TotalGrandQTYSFT = 0;

                    TotalStock = Convert.ToInt32(table.Compute("SUM(Stock)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalBQTYSFT = Convert.ToDecimal(table.Compute("SUM(BQTYSFT)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalTodayMarked = Convert.ToInt32(table.Compute("SUM(TodayMarked)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalMQTYSFT = Convert.ToDecimal(table.Compute("SUM(MQTYSFT)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalMarked = Convert.ToInt32(table.Compute("SUM(TotalMarked)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalTMQTYSFT = Convert.ToDecimal(table.Compute("SUM(TMQTYSFT)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalBalanceNos = Convert.ToInt32(table.Compute("SUM(BalanceNos)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));
                    TotalGrandQTYSFT = Convert.ToDecimal(table.Compute("SUM(GrandQTYSFT)", "Color = '" + dsColors.Tables[0].Rows[i]["BlockColor"].ToString() + "'"));

                    for (int col = 1; col <= table.Columns.Count; col++)
                    {
                        ExcelWorkSheet.Cells[r, col] = "";
                    }
                    r++;

                    for (int col = 1; col <= table.Columns.Count; col++)
                    {
                        if (table.Columns[col - 1].ColumnName == "Stock")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalStock.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "BQTYSFT")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalBQTYSFT.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "TodayMarked")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalTodayMarked.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "MQTYSFT")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalMQTYSFT.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "TotalMarked")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalMarked.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "TMQTYSFT")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalTMQTYSFT.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "BalanceNos")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalBalanceNos.ToString();
                        }
                        if (table.Columns[col - 1].ColumnName == "GrandQTYSFT")
                        {
                            ExcelWorkSheet.Cells[r, col] = TotalGrandQTYSFT.ToString();
                        }
                    }
                    r++;
                }

                try
                {
                    ExcelWorkSheet.Name = dsColors.Tables[0].Rows[i]["Abbreviation"].ToString();//Renaming the ExcelSheets
                }
                catch (Exception ex)
                {
                    ExcelWorkSheet.Name = dsColors.Tables[0].Rows[i]["Abbreviation"].ToString() + string.Format("{0:d}", Math.Abs(i - DateTime.Now.Millisecond));
                }

            }
            string filePath = "C:\\NetStockReport\\";
            if (!Directory.Exists(filePath))
            {
                Directory.CreateDirectory(filePath);
            }
            string FileName = filePath+"NetStockReport" + DateTime.Now.ToString("dd-MM-yyyy-hh-mm-ss")+".xlsx";
            ExcelWorkBook.SaveAs(FileName);               
            ExcelWorkBook.Close();
            ExcelApp.Quit();
            Marshal.ReleaseComObject(ExcelWorkSheet);
            Marshal.ReleaseComObject(ExcelWorkBook);
            Marshal.ReleaseComObject(ExcelApp);
        }

谢谢, 普尔纳。

2 个答案:

答案 0 :(得分:2)

using (MemoryStream memoryStream = new MemoryStream())
        {
            using (var writer = new StreamWriter(memoryStream))
            {
                // your code to write the file content
            }
            string fileName = "yourfilename.csv";
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ContentType = "text/csv";
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
            HttpContext.Current.Response.End();
        }

答案 1 :(得分:0)

只需在代码底部添加以下代码:

var excelFilePathMap = Server.MapPath(FileName);
return new FilePathResult(excelFilePathMap, "application/octet-stream");

即。在你的代码的最后一行之后:Marshal.ReleaseComObject(ExcelApp);

它会要求用户下载文件。