简体   繁体   English

大数据损坏的Excel文件

[英]Corrupted excel file for large data

Hi i am using EPPlus to create xslx file with some data dump. 嗨,我正在使用EPPlus创建带有一些数据转储的xslx文件。 It is working perfectly on local machine as well as on web server for small amount of data. 它可以在本地计算机上以及在Web服务器上完美地处理少量数据。

But i have a case where i have 40,000 rows in dataset. 但我有一个案例,我在数据集中有40,000行。 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 . 我尝试用记事本编辑文件,发现它里面有HTML内容

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 谢谢

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. 通常,ASP.net用户在Application文件夹之外没有写权限。 Here are two link might help you. 这里有两个链接可能对你有帮助。

  1. Unable to create mutex. 无法创建互斥锁。 (Exception from HRESULT: 0x80131464) (HRESULT异常:0x80131464)
  2. IsolatedStorageException: Unable to create the store directory IsolatedStorageException:无法创建商店目录

Hope this help you. 希望这对你有所帮助。

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 . 至少,快速解决方法是在将文档写入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). (请参阅如何从ASP.NET中的Web请求返回pdf作为示例)。

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. 我们必须看到更多的代码才能完全检查,但我想你不会使用HttpHandler ,我建议你这样做。

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM