2014-02-12 5 views
4

안녕하세요. EPPlus을 사용하여 일부 데이터 덤프가있는 xslx 파일을 만들었습니다. 소량의 데이터를 웹 서버뿐만 아니라 로컬 시스템에서도 완벽하게 작동합니다.대용량 데이터의 파일이 손상되었습니다.

하지만 데이터 세트에 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() 

내가 할 수없는 오전을 그것을 해결하십시오. 제발 제안 해주세요. 감사합니다.

+0

'HTML 콘텐츠가 포함되어 있습니다'라고 말하면 어떻게됩니까? –

+0

전체 aspx 페이지의 내용입니다. 이 기능이있는 페이지입니다. –

답변

0

이제 문제가 생겼습니다. 이 문제는 서버에 쓰기 권한 문제로 인한 것 같습니다. 일반적으로 ASP.net 사용자는 Application 폴더 외부에 쓰기 권한이 없습니다. 두 가지 링크가 도움이 될 수 있습니다. Unable to create mutex. (Exception from HRESULT: 0x80131464)

  • IsolatedStorageException: Unable to create the store directory
  • 희망이 당신을 도울

    1. .

    +0

    그것은 godaddy 서버입니다. 어떻게 RAM을 확인할 수 있습니까? –

    +0

    이제 문제가 생겼습니다. 이 문제는 서버에 쓰기 권한 문제로 인한 것 같습니다. 일반적으로 ASP.net 사용자는 Application 폴더 외부에 쓰기 권한이 없습니다. 두 가지 링크가 도움이 될 것입니다. 1. [링크] (https://epplus.codeplex.com/workitem/14877) 2. [링크] (http://stackoverflow.com/questions/1035576/isolatedstorageexception-unable-to-create-the- store-directory) – Sumedh

    +0

    RAM과 관련이 없습니다. 내부 SparseMemoryStream 클래스는 1MB 이상인 경우 Isolated Storage에 아무것도로드하려고 시도합니다.MS Packaging API는 패키지 내부에서 스트림을 열기 위해이 클래스를 사용합니다. - 파일이 너무 클 경우 CSharpZipLib/SAX 구문 분석과 같은 다른 라이브러리를 사용하는 것이 좋습니다. – BrainSlugs83

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

    하지만 로컬 컴퓨터에서 작동하고 있습니다. 서버에서는 다른 작은 파일들에 대해 작업하고 있습니다. –

    +0

    더 많은 컨텍스트를 표시 할 수 있습니까? 메서드는 어떻게 호출됩니까? –

    +0

    간단합니다. 데이터베이스에서 데이터를 데이터 세트로 가져 와서 해당 데이터를이 함수로 전달하는 중입니다. –

    관련 문제