大数据损坏的Excel文件

时间:2014-02-12 08:32:05

标签: c# asp.net excel epplus

您好我正在使用 EPPlus 来创建带有一些数据转储的xslx文件。它可以在本地计算机上以及在Web服务器上完美地处理少量数据。

但我有一个案例,我在数据集中有40,000行。它再次在本地机器上完美运行。

但在服务器上它正在创建文件,当我尝试打开该文件时,它显示文件已损坏的错误。我尝试用记事本编辑文件,发现它里面有HTML内容

我正在使用此代码:

public static void CreateExcel(string file_Name, DataSet ds)
{
    //  rowsPerSheet  = 50000; 
    string msg = "";
    string Type = "";
    using (ExcelPackage pck = new ExcelPackage()) {
        //Create the worksheet
        ExcelWorksheet ws = default(ExcelWorksheet);
        int clCnt = 1;



        foreach (DataTable tbl in ds.Tables) {
            ws = pck.Workbook.Worksheets.Add(tbl.TableName);

            //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
            ws.Cells("A1").LoadFromDataTable(tbl, true);

            if (tbl.Rows.Count != 0) {
                clCnt = 1;
                foreach (DataColumn col in tbl.Columns) {
                    ws.Column(clCnt).AutoFit();
                    // format all dates in german format (adjust accordingly)
                    if (col.DataType.Equals(typeof(System.DateTime))) {
                        dynamic colNumber = col.Ordinal + 1;
                        ExcelRange range = ws.Cells(2, colNumber, tbl.Rows.Count + 1, colNumber);
                        range.Style.Numberformat.Format = "MM/dd/yyyy";
                    }
                    if (col.DataType.Equals(typeof(System.Decimal)) || col.DataType.Equals(typeof(System.Double))) {
                        dynamic colNumber = col.Ordinal + 1;
                        ExcelRange range = ws.Cells(2, colNumber, tbl.Rows.Count + 1, colNumber);
                        range.Style.Numberformat.Format = "0.00";
                    }
                    clCnt += 1;
                }
            }
        }

        file_Name = file_Name.Replace(" ", "_") + ".xlsx";


        HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        HttpContext.Current.Response.AddHeader("content-disposition", "attachment;  filename=" + file_Name + "");

        HttpContext.Current.Response.BinaryWrite(pck.GetAsByteArray());
        HttpContext.Current.Response.End();
    }


}

父功能:

private void GenerateReport()
{
    string msg = "";
    string output = "where";
    int count = 0;
    string jsscript = "";
    string _FID = "";
    if ((ddlPortfolio.SelectedValue <= 0 & grvforecast.Rows.Count <= 0)) {
        jsscript = "<script>alert('Please select potfolio')</script>";
        this.Page.ClientScript.RegisterStartupScript(Page.GetType, "jsclose", jsscript);
    } else if ((grvforecast.Rows.Count <= 0)) {
        jsscript = "<script>alert('Please add some entry in grid')</script>";
        this.Page.ClientScript.RegisterStartupScript(Page.GetType, "jsclose", jsscript);
    } else {
        if (btnValue.Value == "Cash/GAAP Report") {
            _SqlStr = "[USP_CashGaapReport] '";
            foreach (GridViewRow row in grvforecast.Rows) {
                if ((count < grvforecast.Rows.Count - 1)) {
                    _SqlStr += "" + grvforecast.Rows(count).Cells(1).Text + ",";
                } else {
                    _SqlStr += "" + grvforecast.Rows(count).Cells(1).Text + "";
                }
                count = count + 1;
            }
            _SqlStr += "'";

        } else {
            if ((btnValue.Value == "Forecast Attribute Report")) {
                _SqlStr = "SELECT f.AttributeSetID as AttributeSetID , Attribute_Set.TabName as AttributeSetName FROM Forecast_Account as f INNER JOIN    Attribute_Set ON f.AttributeSetID = Attribute_Set.AttributeSetID where ";
            } else if ((btnValue.Value == "Forecast Data Report")) {
                _SqlStr = "SELECT p.LegalEntityName AS Portfolio, f.Name, c.AccountName, a.RepeatNumber, d.CashGAAP, d.TheDate, SUM(d.Amount) AS Amount, d.LastUpdated, d.UpdatedBy ";
                _SqlStr += "FROM dbo.Portfolio AS p INNER JOIN dbo.Forecast AS f ON p.PortfolioID = f.PortfolioID INNER JOIN dbo.Forecast_Account AS a ON f.ForecastID = a.ForecastID ";
                _SqlStr += "INNER JOIN dbo.Forecast_Data AS d ON a.ForecastAccountID = d.ForecastAccountID INNER JOIN dbo.CoA AS c ON c.AccountNumber = a.AccountNumber where ";
            } else {
                //    _SqlStr = "SELECT Portfolio, Name, AccountName, CashGAAP, OriginalDate, sum(Amount) as Amount, AccountNumber, AttributeSetName, TheDate, Year"
                //    _SqlStr &= " FROM (SELECT  Portfolio.LegalEntityName AS Portfolio, f.Name, CoA.AccountName, Forecast_Data.CashGAAP, CONVERT(date, Forecast_Data.TheDate) AS OriginalDate,"
                //    _SqlStr &= " SUM(Forecast_Data.Amount) AS Amount, CoA.AccountNumber, Attribute_Set.AttributeSetName, '' + CONVERT(varchar, YEAR(Forecast_Data.TheDate))"
                //    _SqlStr &= " + '-' + CONVERT(varchar, MONTH(Forecast_Data.TheDate)) + '-01' AS TheDate, YEAR(Forecast_Data.TheDate) AS Year, Forecast_Attribute.Value"
                //    _SqlStr &= " FROM   Portfolio INNER JOIN  Forecast AS f ON Portfolio.PortfolioID = f.PortfolioID INNER JOIN Forecast_Account ON f.ForecastID = Forecast_Account.ForecastID INNER JOIN Forecast_Data ON"
                //    _SqlStr &= " Forecast_Account.ForecastAccountID = Forecast_Data.ForecastAccountID INNER JOIN CoA ON CoA.AccountNumber = Forecast_Account.AccountNumber"
                //    _SqlStr &= " INNER JOIN Attribute_Set ON CoA.AttributeSetID = Attribute_Set.AttributeSetID INNER JOIN Forecast_Attribute ON Forecast_Account.ForecastAccountID = Forecast_Attribute.ForecastAccountID WHERE"
                _SqlStr = "SELECT Portfolio, Name, AccountName, CashGAAP, OriginalDate, sum(Amount) as Amount, d.AccountNumber as AccountNumber, AttributeSetName, TheDate, Year";
                _SqlStr += " FROM (SELECT  Portfolio.LegalEntityName AS Portfolio, f.Name, CoA.AccountName, Forecast_Data.CashGAAP, CONVERT(date, Forecast_Data.TheDate) AS OriginalDate,";
                _SqlStr += " SUM(Forecast_Data.Amount) AS Amount, CoA.AccountNumber, Attribute_Set.AttributeSetName, '' + CONVERT(varchar, YEAR(Forecast_Data.TheDate))";
                _SqlStr += " + '-' + CONVERT(varchar, MONTH(Forecast_Data.TheDate)) + '-01' AS TheDate, YEAR(Forecast_Data.TheDate) AS Year, Forecast_Attribute.Value";
                _SqlStr += " FROM   Portfolio INNER JOIN  Forecast AS f ON Portfolio.PortfolioID = f.PortfolioID INNER JOIN Forecast_Account ON f.ForecastID = Forecast_Account.ForecastID INNER JOIN Forecast_Data ON";
                _SqlStr += " Forecast_Account.ForecastAccountID = Forecast_Data.ForecastAccountID INNER JOIN CoA ON CoA.AccountNumber = Forecast_Account.AccountNumber";
                _SqlStr += " INNER JOIN Attribute_Set ON CoA.AttributeSetID = Attribute_Set.AttributeSetID INNER JOIN Forecast_Attribute ON Forecast_Account.ForecastAccountID = Forecast_Attribute.ForecastAccountID WHERE";
            }
            foreach (GridViewRow row in grvforecast.Rows) {
                if ((count < grvforecast.Rows.Count - 1)) {
                    _SqlStr += " f.ForecastID=" + grvforecast.Rows(count).Cells(1).Text + " or";
                    _FID += " a.ForecastID=" + grvforecast.Rows(count).Cells(1).Text + " or";
                } else {
                    _SqlStr += " f.ForecastID=" + grvforecast.Rows(count).Cells(1).Text + " ";
                    _FID += " a.ForecastID=" + grvforecast.Rows(count).Cells(1).Text + " ";
                }
                count = count + 1;
            }
            if ((btnValue.Value == "Forecast Data Report")) {
                _SqlStr += "GROUP BY p.LegalEntityName, f.Name, c.AccountName, a.RepeatNumber, d.CashGAAP, d.TheDate, d.LastUpdated, d.UpdatedBy";
            } else if ((btnValue.Value == "Cash/GAAP Report")) {
                _SqlStr += " GROUP BY Portfolio.LegalEntityName, f.Name, CoA.AccountName, Forecast_Data.CashGAAP, Forecast_Data.TheDate, CoA.AccountNumber, Attribute_Set.AttributeSetName, Forecast_Attribute.Value) AS d LEFT OUTER JOIN Vendor ON d.Value = Vendor.VendorName";
                _SqlStr += " GROUP BY d.OriginalDate, d.TheDate, d.AccountNumber, d.Portfolio, d.Name, d.AccountName, d.CashGAAP, d.AttributeSetName, d.Year, Vendor.VendorName";
                //    _SqlStr &= " GROUP BY Portfolio.LegalEntityName, f.Name, CoA.AccountName, Forecast_Data.CashGAAP, Forecast_Data.TheDate, CoA.AccountNumber, Attribute_Set.AttributeSetName, Forecast_Attribute.Value) AS d"
                //    _SqlStr &= " Group BY OriginalDate,TheDate,AccountNumber,Portfolio,Name,AccountName,CashGAAP,AttributeSetName,Year"
            }
        }
        try {
            if ((btnValue.Value != "Forecast Attribute Report")) {
                _ds = new DataSet();
                _dtTable = myDB.ExecuteDatatable(CommandType.Text, _SqlStr, null);
                _dtTable.TableName = btnValue.Value.Replace("_", " ");
                _ds.Tables.Add(_dtTable);
            } else {
                _ds = new DataSet();
                _SqlStr += "Group by f.AttributeSetID,Attribute_Set.TabName  ";
                _dtTable = myDB.ExecuteDatatable(CommandType.Text, _SqlStr, null);
                foreach (DataRow _dr in _dtTable.Rows) {
                    _SqlStr = "[USP_Forecast_Attributes] " + _dr["AttributeSetID"].ToString() + ",'" + _FID + "'";
                    _dtTable = myDB.ExecuteDatatable(CommandType.Text, _SqlStr, null);
                    _dtTable.TableName = _dr["AttributeSetName"].ToString();
                    _ds.Tables.Add(_dtTable);
                }
            }
            if ((_ds != null)) {
                if (DateAndTime.Now.IsDaylightSavingTime()) {
                    strTime = System.DateTime.UtcNow.AddHours(-5).ToString("_MM_dd_yyyy_hh_mm_tt");
                } else {
                    strTime = System.DateTime.UtcNow.AddHours(-4).ToString("_MM_dd_yyyy_hh_mm_tt");
                }
                if (btnValue.Value != "Forecast Attribute Report") {
                    epXL.CreateExcel(btnValue.Value, _ds);
                //epXL.ExportToExcel(_dtTable, btnValue.Value)
                } else {
                    epXL.CreateExcel(btnValue.Value, _ds);
                    // & strTime, _ds)
                }
            }
        } catch (Exception ex) {
            jsscript = "<script>alert('Report not generated')</script>";
            this.Page.ClientScript.RegisterStartupScript(Page.GetType, "jsclose", jsscript);
        }
    }
}

修改 现在我收到了确切的错误:

System.IO.IsolatedStorage.IsolatedStorageException: Unable to create mutex. (Exception from HRESULT: 0x80131464)
   at System.IO.IsolatedStorage.IsolatedStorageFile.Open(String infoFile, String syncName)
   at System.IO.IsolatedStorage.IsolatedStorageFile.Lock(Boolean& locked)
   at System.IO.IsolatedStorage.IsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, IsolatedStorageFile isf)
   at MS.Internal.IO.Packaging.PackagingUtilities.SafeIsolatedStorageFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, ReliableIsolatedStorageFileFolder folder)
   at MS.Internal.IO.Packaging.PackagingUtilities.CreateUserScopedIsolatedStorageFileStreamWithRandomName(Int32 retryCount, String& fileName)
   at MS.Internal.IO.Packaging.SparseMemoryStream.SwitchModeIfNecessary()
   at MS.Internal.IO.Packaging.SparseMemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Packaging.CompressEmulationStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Packaging.CompressStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Zip.ProgressiveCrcCalculatingStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at MS.Internal.IO.Zip.ZipIOModeEnforcingStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.IO.StreamWriter.Write(String value)
   at System.IO.TextWriter.Write(String format, Object arg0)
   at OfficeOpenXml.ExcelWorksheet.UpdateRowCellData(StreamWriter sw)
   at OfficeOpenXml.ExcelWorksheet.SaveXml()
   at OfficeOpenXml.ExcelWorksheet.Save()
   at OfficeOpenXml.ExcelWorkbook.Save()
   at OfficeOpenXml.ExcelPackage.GetAsByteArray(Boolean save)
   at OfficeOpenXml.ExcelPackage.GetAsByteArray()

我无法解决它。请建议。 感谢

2 个答案:

答案 0 :(得分:1)

我认为您的网页存在设计问题。至少,快速解决方法是在将文档写入Response之前添加此内容。

HttpContext.Current.Response.Clear();

当您在输出中有响应时,表示它尝试呈现页面,在其中,您尝试执行其他操作,在这种情况下编写文件。 (以How can I return a pdf from a web request in ASP.NET?为例)。

我们必须看到更多代码才能完全检查这一点,但我想你不会使用HttpHandler来推荐这个。

public class DownloadFileHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        Response.BinaryWrite(...);
    }
}

答案 1 :(得分:0)

现在我遇到了你的问题。 我认为这是由于服务器上的写权限问题。  通常,ASP.net用户在Application文件夹之外没有写权限。 这里有两个链接可能会帮到你。

  1. Unable to create mutex. (Exception from HRESULT: 0x80131464)
  2. IsolatedStorageException: Unable to create the store directory
  3. 希望这对你有所帮助。