Itext Sharp Performance问题用于导出大型记录

时间:2016-08-04 09:19:40

标签: c# asp.net itext

我使用itextsharp将大量数据导出近50,000 - 60,000条记录到pdf,但它给我的内存溢出异常和性能太慢了。任何人都可以帮我解决这个问题吗?我的代码是如下所示

Document doc = new Document(PageSize.A4, 10, 10, 40, 35);
        MemoryStream ms = new MemoryStream();
        string path = System.Web.Configuration.WebConfigurationManager.AppSettings["AllotmentExportFilePath"];

        String FilePath = path + "TestPdf.pdf";
        if (File.Exists(FilePath))
        {
            File.Delete(FilePath);
        }
        PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(FilePath, FileMode.Create));
        writer.InitialLeading = 0;
        //writer.CloseStream = false;
        DataTable dt1 = ds.Tables[0];
        DataTable dt2 = ds.Tables[1];
        DataTable dt3 = ds.Tables[2];

        DataTable newDt2 = new DataTable();
        DataTable newDt3 = new DataTable();

        UserSession OUser = (UserSession)HttpContext.Current.Session["User"];
        string wtUnit = OUser.UserWeightAbbriviation;
        string volUnit = OUser.UserVolumeAbbriviation;
        string userRevenueUnit = (OUser.UserCurrencyID == null ? OUser.BUCurrencyAbbriviation : OUser.UserCurrencyAbbriviation);

        //  var colWidthPercentages = new[] { 6f, 10f, 10f, 10f, 20f, 20f, 8f, 8f, 8f };
        // table.SetWidths(colWidthPercentages);
        var normalFont = FontFactory.GetFont(FontFactory.TIMES, 6);
        var boldFont = FontFactory.GetFont(FontFactory.TIMES_BOLD, 6);

        doc.Open();

        PdfPTable table = new PdfPTable(dt1.Columns.Count - 1) { WidthPercentage = 100 };
        table.SplitLate = false;
        for (int j = 0; j < dt1.Columns.Count; j++)
        {
            if (dt1.Columns[j].ColumnName == "Req_Id")
                continue;
            if (dt1.Columns[j].ColumnName == "Wt")
                table.AddCell(new Phrase((dt1.Columns[j].ColumnName).Replace("_", " ") + " (" + wtUnit + ")", boldFont));
            else if (dt1.Columns[j].ColumnName == "Vol")
                table.AddCell(new Phrase((dt1.Columns[j].ColumnName).Replace("_", " ") + " (" + volUnit + ")", boldFont));
            else if (dt1.Columns[j].ColumnName == "Rate" || dt1.Columns[j].ColumnName == "Bid_Price")
                table.AddCell(new Phrase((dt1.Columns[j].ColumnName).Replace("_", " ") + " (" + userRevenueUnit + ") /(" + OUser.UserWeightAbbriviation + ")", boldFont));
            else if (dt1.Columns[j].ColumnName == "ULD_No")
                table.AddCell(new Phrase(dt1.Columns[j].ColumnName.Replace("_No", " #"), boldFont));
            else if (dt1.Columns[j].ColumnName == "Release_Per")
                table.AddCell(new Phrase(dt1.Columns[j].ColumnName.Replace("_Per", " (%)"), boldFont));
            else
                table.AddCell(new Phrase(dt1.Columns[j].ColumnName.Replace("_", " "), boldFont));
        }
        if (dt1.Rows.Count >= 1 && !String.IsNullOrEmpty(Convert.ToString(dt1.Rows[0][0])))
        {

            for (int i = 0; i < dt1.Rows.Count; i++)
            {

                PdfPCell[] cell = new PdfPCell[dt1.Columns.Count - 1];
                int colRequest = 0;
                for (int j = 0; j < dt1.Columns.Count; j++)
                {
                    if (j == 0)
                        continue;
                    cell[colRequest] = new PdfPCell(new Phrase(dt1.Rows[i][j].ToString(), normalFont));
                    colRequest = colRequest + 1;
                }

                PdfPRow row = new PdfPRow(cell);
                table.Rows.Add(row);

                PdfPTable table1 = new PdfPTable(dt2.Columns.Count - 2) { WidthPercentage = 100 };
                //var colWidthPercentages = new[] { 6f, 10f, 10f, 10f, 5f, 20f, 8f, 8f, 8f };
                //table1.SetWidths(colWidthPercentages);
                var rows = (from bb in dt2.AsEnumerable()
                            where (bb.Field<string>("Request_ID") == Convert.ToString(dt1.Rows[i]["Req_Id"]))
                            select bb);


                for (int k = 0; k < dt2.Columns.Count; k++)
                {
                    if (dt2.Columns[k].ColumnName == "Request_ID" || dt2.Columns[k].ColumnName == "Path_ID")
                        continue;
                    if (dt2.Columns[k].ColumnName == "Rec_Wt_Model" || dt2.Columns[k].ColumnName == "Rec_Wt_User")
                        table1.AddCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " ") + " (" + wtUnit + ")", boldFont));
                    else if (dt2.Columns[k].ColumnName == "Rec_Vol_Model" || dt2.Columns[k].ColumnName == "Rec_Vol_User")
                        table1.AddCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " ") + " (" + volUnit + ")", boldFont));
                    else if (dt2.Columns[k].ColumnName == "Route_Cost")
                        table1.AddCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " ") + " (" + userRevenueUnit + ") /(" + OUser.UserWeightAbbriviation + ")", boldFont));
                    else
                        table1.AddCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " "), boldFont));
                }
                if (rows.Count() > 0)
                {
                    newDt2 = rows.CopyToDataTable();

                    for (int i1 = 0; i1 < newDt2.Rows.Count; i1++)
                    {
                        PdfPCell[] Innercell = new PdfPCell[newDt2.Columns.Count - 2];
                        int colRoute = 0;
                        for (int j1 = 0; j1 < newDt2.Columns.Count; j1++)
                        {
                            if (j1 == 0 || j1 == 1)
                                continue;
                            Innercell[colRoute] = new PdfPCell(new Phrase(newDt2.Rows[i1][j1].ToString(), normalFont));
                            colRoute = colRoute + 1;
                        }
                        PdfPRow Innerrow = new PdfPRow(Innercell);

                        table1.Rows.Add(Innerrow);

                        PdfPTable table2 = new PdfPTable(dt3.Columns.Count - 2) { WidthPercentage = 100 };
                        var rows1 = (from bb in dt3.AsEnumerable()
                                     where (bb.Field<string>("Request_ID") == Convert.ToString(newDt2.Rows[i1]["Request_ID"])
                                     && bb.Field<string>("Path_ID") == Convert.ToString(newDt2.Rows[i1]["Path_ID"]))
                                     select bb);

                        for (int k = 0; k < dt3.Columns.Count; k++)
                        {
                            if (dt3.Columns[k].ColumnName == "Request_ID" || dt3.Columns[k].ColumnName == "Path_ID")
                                continue;
                            if (dt3.Columns[k].ColumnName == "Flt_No")
                                table2.AddCell(new Phrase(dt3.Columns[k].ColumnName.Replace("_No", " #"), boldFont));
                            else
                                table2.AddCell(new Phrase(dt3.Columns[k].ColumnName.Replace("_", " "), boldFont));
                        }
                        if (rows1.Count() > 0)
                        {
                            newDt3 = rows1.CopyToDataTable();
                            for (int i2 = 0; i2 < newDt3.Rows.Count; i2++)
                            {
                                PdfPCell[] Innercell1 = new PdfPCell[newDt3.Columns.Count - 2];
                                int colLeg = 0;
                                for (int j2 = 0; j2 < newDt3.Columns.Count; j2++)
                                {
                                    if (j2 == 0 || j2 == 1)
                                        continue;
                                    Innercell1[colLeg] = new PdfPCell(new Phrase(newDt3.Rows[i2][j2].ToString(), normalFont));
                                    colLeg = colLeg + 1;
                                }
                                PdfPRow Innerrow1 = new PdfPRow(Innercell1);
                                table2.Rows.Add(Innerrow1);
                            }

                        }
                        else
                        {
                            string rowData = "No child records to display.";
                            PdfPCell[] NoRowcell = new PdfPCell[dt3.Columns.Count - 2];// (new Phrase(rowData));
                            //   NoRowcell[0] = new PdfPCell(table) { Colspan = newDt2.Columns.Count - 2 };
                            NoRowcell[0] = new PdfPCell(new Phrase(rowData, normalFont)) { Colspan = dt3.Columns.Count - 2 };
                            PdfPRow Norow = new PdfPRow(NoRowcell);
                            table2.Rows.Add(Norow);
                        }


                        PdfPCell[] Rowcell1 = new PdfPCell[dt2.Columns.Count - 2];
                        Rowcell1[0] = new PdfPCell(table2) { Colspan = dt3.Columns.Count - 2 };

                        //int diff1 = (dt2.Columns.Count - 2) - (dt3.Columns.Count - 2);

                        //if (diff1 > 0)
                        //{
                        //    Rowcell1[dt3.Columns.Count - 2] = new PdfPCell() { Colspan = 6 };
                        //    //for (var l = newDt3.Columns.Count-2; l < dt2.Columns.Count-2; l++)
                        //    //{
                        //    //    Rowcell1[l] = new PdfPCell();
                        //    //}
                        //}

                        PdfPRow row11 = new PdfPRow(Rowcell1);
                        table1.Rows.Add(row11);
                    }

                }
                else
                {
                    string rowData = "No child records to display.";
                    PdfPCell[] Rowcell1 = new PdfPCell[dt2.Columns.Count - 2];// (new Phrase(rowData));
                    Rowcell1[0] = new PdfPCell(new Phrase(rowData, normalFont)) { Colspan = dt2.Columns.Count - 2 };
                    PdfPRow row11 = new PdfPRow(Rowcell1);
                    table1.Rows.Add(row11);
                }

                PdfPCell[] Rowcell = new PdfPCell[dt1.Columns.Count - 1];
                Rowcell[0] = new PdfPCell(table1) { Colspan = dt2.Columns.Count - 2 };
                int diff = (dt1.Columns.Count - 1) - (dt2.Columns.Count - 2);

                if (diff > 0)
                {
                    Rowcell[dt2.Columns.Count - 2] = new PdfPCell() { Colspan = diff };
                    //for (var l = newDt2.Columns.Count-2; l < dt1.Columns.Count-1; l++)
                    //{
                    //    Rowcell[l] = new PdfPCell();
                    //}
                }

                PdfPRow row1 = new PdfPRow(Rowcell);
                table.Rows.Add(row1);
            }
        }
        else
        {
            string rowData = "No records to display.";
            PdfPCell[] Rowcell1 = new PdfPCell[dt1.Columns.Count - 2];// (new Phrase(rowData));
            Rowcell1[0] = new PdfPCell(new Phrase(rowData, normalFont)) { Colspan = dt1.Columns.Count - 2 };
            PdfPRow row11 = new PdfPRow(Rowcell1);
            table.Rows.Add(row11);
        }

        doc.Add(table);
        doc.Close();

0 个答案:

没有答案