Как оптимизировать этот код.это займет много времени, чтобы экспорт в PDF с помощью itextsharp библиотека DLL
Document doc = new Document(PageSize.A4, 10, 10, 40, 35); // MemoryStream ms = new MemoryStream(); string path = System.Web.Configuration.WebConfigurationManager.AppSettings["ExportFilePath"]; String FilePath = path + "Test" + _exportCSV + ".pdf"; if (File.Exists(FilePath)) { File.Delete(FilePath); } PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(FilePath, FileMode.Create)); writer.InitialLeading = 0; 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 normalFont = FontFactory.GetFont(FontFactory.TIMES, 4); var boldFont = FontFactory.GetFont(FontFactory.TIMES_BOLD, 4); doc.Open(); PdfPTable table = new PdfPTable(dt1.Columns.Count - 1) { WidthPercentage = 100 }; table.Complete = false; 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++) { for (int j = 0; j < dt1.Columns.Count; j++) { if (j == 0) continue; table.AddCell(new Phrase(dt1.Rows[i][j].ToString(), normalFont)); } var rows = (from bb in dt2.AsEnumerable() where (bb.Field<string>("Request_ID") == Convert.ToString(dt1.Rows[i]["Req_Id"])) select bb); int colDiff = (dt1.Columns.Count - dt2.Columns.Count) + 2; for (int k = 0; k < dt2.Columns.Count; k++) { PdfPCell cell1 = null; if (dt2.Columns[k].ColumnName == "Request_ID" || dt2.Columns[k].ColumnName == "Route_Header_ID" || dt2.Columns[k].ColumnName == "Path_ID") continue; if (dt2.Columns[k].ColumnName == "Rec_Wt_Model" || dt2.Columns[k].ColumnName == "Rec_Wt_User") cell1 = new PdfPCell(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") cell1 = new PdfPCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " ") + " (" + volUnit + ")", boldFont)); else if (dt2.Columns[k].ColumnName == "Route_Cost") cell1 = new PdfPCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " ") + " (" + userRevenueUnit + ") /(" + OUser.UserWeightAbbriviation + ")", boldFont)); else cell1 = new PdfPCell(new Phrase(dt2.Columns[k].ColumnName.Replace("_", " "), boldFont)); table.AddCell(cell1); if ((k == dt2.Columns.Count - 1) && colDiff > 0) { cell1 = new PdfPCell(new Phrase("")); cell1.Colspan = colDiff; table.AddCell(cell1); } } if (rows.Count() > 0) { newDt2 = rows.CopyToDataTable(); for (int i1 = 0; i1 < newDt2.Rows.Count; i1++) { for (int j1 = 0; j1 < newDt2.Columns.Count; j1++) { if (j1 == 0 || j1 == 1 || j1 == 2) continue; PdfPCell cell1 = new PdfPCell(new Phrase(newDt2.Rows[i1][j1].ToString(), normalFont)); table.AddCell(cell1); if ((j1 == newDt2.Columns.Count - 1) && colDiff > 0) { PdfPCell cell2 = null; var rows3 = (from bb in dt3.AsEnumerable() where (bb.Field<string>("Request_ID") == Convert.ToString(newDt2.Rows[i1]["Request_ID"]) && bb.Field<string>("Route_Header_ID") == Convert.ToString(newDt2.Rows[i1]["Route_Header_ID"])) select bb); var totalRows = 0; if (rows3.Count() > 0) { totalRows = rows3.Count() + 1; } cell2 = new PdfPCell(new Phrase("")); cell2.Colspan = colDiff; if (i1 == 0) { totalRows = totalRows + 1;//start end date hedaer } cell2.Rowspan = totalRows + 1; table.AddCell(cell2); } } var rows1 = (from bb in dt3.AsEnumerable() where (bb.Field<string>("Request_ID") == Convert.ToString(newDt2.Rows[i1]["Request_ID"]) && bb.Field<string>("Route_Header_ID") == Convert.ToString(newDt2.Rows[i1]["Route_Header_ID"])) select bb); int colDiff1 = (dt2.Columns.Count - dt3.Columns.Count); for (int k = 0; k < dt3.Columns.Count; k++) { PdfPCell cell1 = null; if (dt3.Columns[k].ColumnName == "Request_ID" || dt3.Columns[k].ColumnName == "Route_Header_ID" || dt3.Columns[k].ColumnName == "Path_ID") continue; if (dt3.Columns[k].ColumnName == "Flt_No") cell1 = new PdfPCell(new Phrase(dt3.Columns[k].ColumnName.Replace("_No", " #"), boldFont)); else cell1 = new PdfPCell(new Phrase(dt3.Columns[k].ColumnName.Replace("_", " "), boldFont)); table.AddCell(cell1); if ((k == dt3.Columns.Count - 1) && colDiff1 > 0) { cell1 = new PdfPCell(new Phrase("")); cell1.Colspan = colDiff1; cell1.Rowspan = (rows1.Count()) + 1; table.AddCell(cell1); } } if (rows1.Count() > 0) { newDt3 = rows1.CopyToDataTable(); for (int i2 = 0; i2 < newDt3.Rows.Count; i2++) { int colLeg = 0; for (int j2 = 0; j2 < newDt3.Columns.Count; j2++) { if (j2 == 0 || j2 == 1 || j2 == 2) continue; PdfPCell cell1 = new PdfPCell(new Phrase(newDt3.Rows[i2][j2].ToString(), normalFont)); table.AddCell(cell1); colLeg = colLeg + 1; } } } else { string rowData = "No child records to display."; PdfPCell NoRowcell = new PdfPCell(new Phrase(rowData, normalFont)); NoRowcell.Colspan = dt2.Columns.Count - 1; table.AddCell(NoRowcell); } doc.Add(table); table.DeleteBodyRows(); } } else { string rowData = "No child records to display."; PdfPCell Rowcell1 = new PdfPCell(new Phrase(rowData, normalFont)); Rowcell1.Colspan = dt1.Columns.Count - 1; table.AddCell(Rowcell1); } doc.Add(table); table.DeleteBodyRows(); } } iTextSharp.text.FontFactory.FontImp = new iTextSharp.text.FontFactoryImp(); GC.Collect(GC.MaxGeneration); table.Complete = true; doc.Add(table); doc.Close(); var file = new System.IO.FileInfo(FilePath); Response.Clear(); Response.Buffer = true; Response.AddHeader("Content-Disposition", "attachment; filename=" + _exportCSV + ".pdf"); Response.AddHeader("Content-Length", file.Length.ToString(CultureInfo.InvariantCulture)); Response.ContentType = "application/pdf"; Response.WriteFile(file.FullName); HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client. HttpContext.Current.Response.SuppressContent = true; // Gets or sets a value indicating whether to send HTTP content to the client. HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of ex Response.Close(); if (File.Exists(FilePath)) { File.Delete(FilePath); }
Что я уже пробовал:
У меня есть поиск c# optimization texhniques, но я не могу определить, как оптимизировать
InbarBarkai
Какая часть занимает большую часть времени?
Member 8358871
Множественный цикл for, потому что код выполняется для почти 85000 записей