加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 大数据损坏的excel文件

发布时间:2020-12-15 22:01:27 所属栏目:百科 来源:网络整理
导读:嗨,我正在使用EPPlus创建带有一些数据转储的xslx文件.它可以在本地计算机上以及在Web服务器上完美地处理少量数据. 但我有一个案例,我在数据集中有40,000行.它再次在本地机器上完美运行. 但在服务器上它正在创建文件,当我试图打开该文件时,它显示文件已损坏的
嗨,我正在使用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);
                        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,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,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,d.AccountNumber as AccountNumber,Year";
                _SqlStr += " FROM (SELECT  Portfolio.LegalEntityName AS Portfolio,";
                _SqlStr += " SUM(Forecast_Data.Amount) AS Amount,YEAR(Forecast_Data.TheDate))";
                _SqlStr += " + '-' + CONVERT(varchar,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,d.UpdatedBy";
            } else if ((btnValue.Value == "Cash/GAAP Report")) {
                _SqlStr += " GROUP BY Portfolio.LegalEntityName,Forecast_Data.TheDate,Forecast_Attribute.Value) AS d LEFT OUTER JOIN Vendor ON d.Value = Vendor.VendorName";
                _SqlStr += " GROUP BY d.OriginalDate,d.AccountNumber,d.Portfolio,d.Name,d.AccountName,d.AttributeSetName,d.Year,Vendor.VendorName";
                //    _SqlStr &= " GROUP BY Portfolio.LegalEntityName,Forecast_Attribute.Value) AS d"
                //    _SqlStr &= " Group BY OriginalDate,Portfolio,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,null);
                foreach (DataRow _dr in _dtTable.Rows) {
                    _SqlStr = "[USP_Forecast_Attributes] " + _dr["AttributeSetID"].ToString() + ",'" + _FID + "'";
                    _dtTable = myDB.ExecuteDatatable(CommandType.Text,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,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,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 count)
   at MS.Internal.IO.Packaging.CompressStream.Write(Byte[] buffer,Int32 count)
   at MS.Internal.IO.Zip.ProgressiveCrcCalculatingStream.Write(Byte[] buffer,Int32 count)
   at MS.Internal.IO.Zip.ZipIOModeEnforcingStream.Write(Byte[] buffer,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()

我无法解决它.请建议.
谢谢

解决方法

我认为您的网页存在设计问题.至少,快速解决方法是在将文档写入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(...);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读