Corrupted excel file for large data

4

Hi i am using EPPlus to create xslx file with some data dump. It is working perfectly on local machine as well as on web server for small amount of data.

But i have a case where i have 40,000 rows in dataset. It is again working perfectly on local machine.

but on server it is creating file and when i am trying to open that file it it showing error that file is corrupted. I tried editing file with notepad and noticed that it have HTML content in it.

i am using this code:

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


}

Parent Function:

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

EDIT: Now i got the exact error:

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()

I am not able to resolve it. Please suggest. Thanks

c#
asp.net
excel
epplus
asked on Stack Overflow Feb 12, 2014 by Deep Sharma • edited Feb 15, 2014 by Deep Sharma

2 Answers

1

Now I got your problem. I think this is due to write permission issue on the server. Generally ASP.net user doesnt have write permission outside the Application folder. Here are two link might help you.

  1. Unable to create mutex. (Exception from HRESULT: 0x80131464)
  2. IsolatedStorageException: Unable to create the store directory

Hope this help you.

answered on Stack Overflow Feb 13, 2014 by Sumedh • edited May 23, 2017 by Community
1

I think there is a design issue in your page. At least, the quick fix is to add this before your write the document to the Response.

HttpContext.Current.Response.Clear();

When you have the response in the output, it means it tries to render a page and in it, you try to do something else, in this case writing the file. (See How can I return a pdf from a web request in ASP.NET? as an example).

We have to see more of your code to check this completely, but I guess you don't use a HttpHandler for this which I would recommend.

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

    public void ProcessRequest(HttpContext context)
    {
        Response.BinaryWrite(...);
    }
}
answered on Stack Overflow Feb 13, 2014 by Patrick Hofman • edited May 23, 2017 by Community

User contributions licensed under CC BY-SA 3.0