簡體   English   中英

大數據損壞的Excel文件

[英]Corrupted excel file for large data

嗨,我正在使用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()

我無法解決它。 請建議。 謝謝

現在我遇到了你的問題。 我認為這是由於服務器上的寫權限問題。 通常,ASP.net用戶在Application文件夾之外沒有寫權限。 這里有兩個鏈接可能對你有幫助。

  1. 無法創建互斥鎖。 (HRESULT異常:0x80131464)
  2. IsolatedStorageException:無法創建商店目錄

希望這對你有所幫助。

我認為您的網頁存在設計問題。 至少,快速解決方法是在將文檔寫入Response之前添加它。

HttpContext.Current.Response.Clear();

當您在輸出中有響應時,表示它嘗試呈現頁面,在其中,您嘗試執行其他操作,在這種情況下編寫文件。 (請參閱如何從ASP.NET中的Web請求返回pdf作為示例)。

我們必須看到更多的代碼才能完全檢查,但我想你不會使用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