2016-01-27 2 views
11

मैं तीन एकल एक्स्ट्रा लार्ज फ़ाइल में चादर काम निर्यात कर रहा हूँ का उपयोग कर, लेकिन मैं दूसरे DataTable (Education Details शीट) में कुछ उपयोगकर्ता डेटा याद आ रही है और तीसरे DataTable (Employeement Details शीट)।कुछ डेटा एक्सेल में निर्यात में याद आ रही है DataTable और Linq

Education Details शीट कुछ उपयोगकर्ता नहीं हैं, लेकिन Employeement Details शीट जो उपयोगकर्ता दिखा रहे हैं। उपयोगकर्ता ईमेल आईडी में सभी तीन डेटाबेस टेबल्स हैं।

DataSe ds = new DataSet(); 
    DataTable dt = new DataTable("Registration Details"); 
    DataTable dt1 = new DataTable("Education Details"); 
    DataTable dt2 = new DataTable("Employeement Details"); 


    dt = bl.Get_Registrationdetailsbydate(bo); 
    gv_Regdetails.DataSource = dt; 
    gv_Regdetails.DataBind(); 
    dt1 = bl.Get_Registrationdetailsbydate1(bo); 
    dt2 = bl.Get_Registrationdetailsbydate2(bo); 
    DataTable filteredEducation = dt1.AsEnumerable() 
      .Where(x => dt.AsEnumerable() 
      .Any(z => z.Field<string>("Email").Trim() == x.Field<string>("Email").Trim())) 
      .CopyToDataTable(); 
    DataTable filteredEmployee = dt2.AsEnumerable() 
      .Where(x => dt.AsEnumerable() 
      .Any(z => z.Field<string>("Email").Trim() == x.Field<string>("Email").Trim())) 
      .CopyToDataTable(); 

    dt.TableName = "Registration Details"; 
    filteredEducation.TableName = "Education Details"; 
    filteredEmployee.TableName = "Employeement Details"; 
    ds.Tables.Add(dt); 
    ds.Tables.Add(filteredEducation); 
    ds.Tables.Add(filteredEmployee); 
    ExcelHelper.ToExcel(ds, "DangoteUsers.xls", Page.Response); 

मैं पहली बार DataTable उपयोगकर्ताओं Email पर परिणाम आधार था, तो पहले DataTableEmail पहचान-पत्र पर दूसरे DataTable विस्तार उपयोगकर्ताओं आधार भरें। Employment Details के समान। पहले DataTable और दूसरा DataTable में समस्या। मैं DataTable भी वापस नहीं कर रहा हूं।

मैं उल्लेख this example

+2

केस संवेदनशील स्ट्रिंग तुलना और ई-मेल पते का प्रारूप तालिकाओं के बीच समान नहीं है? – dlatikay

+0

आपकी ToExcel() लाइब्रेरी 8 साल पहले से है। यदि आप मेरी (फ्री) सी # लाइब्रेरी का उपयोग करते हैं तो आप देखना चाहते हैं कि क्या होता है। इसमें कोड की केवल एक पंक्ति होती है (बस इसे अपना डेटासेट और फ़ाइल नाम पास करें) और यह ओपनएक्सएमएल पुस्तकालयों का उपयोग करके एक वास्तविक एक्सेल .xlsx फ़ाइल तैयार करेगा। http://mikesknowledgebase.com/pages/CSharp/ExportToExcel।एचटीएम –

उत्तर

1

मुझे लगता है कि LINQ क्वेरी में आपके स्ट्रिंग तुलना एक समस्या है। आपके ईमेल पते में अलग-अलग मामले हो सकते हैं जो इस समस्या का कारण बन सकता है। कोड

DataTable filteredEducation = dt1.AsEnumerable() 
      .Where(x => dt.AsEnumerable() 
      .Any(z => z.Field<string>("Email").Trim().Equals(x.Field<string>("Email").Trim(),StringComparison.CurrentCultureIgnoreCase))) 
      .CopyToDataTable(); 
    DataTable filteredEmployee = dt2.AsEnumerable() 
      .Where(x => dt.AsEnumerable() 
      .Any(z => z.Field<string>("Email").Trim().Equals(x.Field<string>("Email").Trim(),StringComparison.CurrentCultureIgnoreCase))) 
      .CopyToDataTable(); 
+0

मुझे त्रुटि मिल रही है: सदस्य 'ऑब्जेक्ट। एक्वाल्स (ऑब्जेक्ट, ऑब्जेक्ट)' को किसी इंस्टेंस संदर्भ से एक्सेस नहीं किया जा सकता है; इसके बजाए इसे एक प्रकार के नाम से अर्हता प्राप्त करें। @ वीरू – zahed

+1

मैंने स्ट्रिंगकंपियर का इस्तेमाल स्ट्रिंगकैपरिसन के बजाय किया है। इसे संपादित किया कृपया कोशिश करें – Viru

3

समस्या लेख में एक्सेल में डेटासेट से रूपांतरण के समाधान से कहीं आ रहा है। इस स्वयं के रूपांतरण का उपयोग करना एक अच्छा विचार नहीं है। Jet/ACE engine या Microsoft Office Interop का उपयोग करें। कम से कम वे गारंटी देते हैं, उनके पास ऐसी तरह की बग नहीं है, जो भविष्य में और अधिक हो सकती है। बेहतर कुछ ऐसा उपयोग करें जो समुदाय द्वारा पहले ही स्वीकार्य है। यहां मैंने एक दृष्टिकोण लिखा है कि इसे Interop के साथ कैसे किया जाए।

सबसे पहले आपको क्या करना है Microsoft.Office.Interop.Excel पर संदर्भ जोड़ने के लिए। यहां इसका तरीका करने के लिए है, जाहिर है msdn article

Add the Excel assembly as a reference to the project: Right-click on the project, select Add Reference.

Click the COM tab of the Add Reference dialog box, and find Microsoft Excel 11 Object Library.

Double-click on Microsoft Excel 11 Object Library, and press OK.

से लिया है, तो आप इसका इस्तेमाल एक्सेल 11 का बड़ा संस्करण है।

यहां कोड है, इसके वर्कफ़्लो के साथ टिप्पणियां/क्षेत्र हैं। आप संदर्भ के रूप में इस्तेमाल करना चाहिए using Excel = Microsoft.Office.Interop.Excel;

public void ExcelBtn_Click(object sender, EventArgs e) 
    { 
     DataSet dst = PrepareData(); 
     byte[] bytes = ExportDataSetToExcel(dst); 

     Response.ClearContent(); 
     Response.ContentType = "application/msoffice"; 
     Response.AddHeader("Content-Disposition", @"attachment; filename=""ExportedExcel.xlsx"" "); 
     Response.BinaryWrite(bytes); 
     Response.End(); 

    } 

    public static DataSet PrepareData() 
    { 
     DataTable badBoysDst = new DataTable("BadBoys"); 
     badBoysDst.Columns.Add("Nr"); 

     badBoysDst.Columns.Add("Name"); 
     badBoysDst.Rows.Add(1, "Me"); 
     badBoysDst.Rows.Add(2, "You"); 
     badBoysDst.Rows.Add(3, "Pepe"); 
     badBoysDst.Rows.Add(4, "Roni"); 

     //Create a Department Table 
     DataTable goodBoysDst = new DataTable("GoodBoys"); 
     goodBoysDst.Columns.Add("Nr"); 
     goodBoysDst.Columns.Add("Name"); 
     goodBoysDst.Rows.Add("1", "Not me"); 
     goodBoysDst.Rows.Add("2", "Not you"); 
     goodBoysDst.Rows.Add("3", "Quattro"); 
     goodBoysDst.Rows.Add("4", "Stagioni"); 

     DataTable goodBoysDst2 = new DataTable("GoodBoys2"); 
     goodBoysDst2.Columns.Add("Nr"); 
     goodBoysDst2.Columns.Add("Name"); 
     goodBoysDst2.Rows.Add("1", "Not me"); 
     goodBoysDst2.Rows.Add("2", "Not you"); 
     goodBoysDst2.Rows.Add("3", "Quattro"); 
     goodBoysDst2.Rows.Add("4", "Stagioni"); 

     DataTable goodBoysDst3 = new DataTable("GoodBoys3"); 
     goodBoysDst3.Columns.Add("Nr"); 
     goodBoysDst3.Columns.Add("Name"); 
     goodBoysDst3.Rows.Add("1", "Not me"); 
     goodBoysDst3.Rows.Add("2", "Not you"); 
     goodBoysDst3.Rows.Add("3", "Quattro"); 
     goodBoysDst3.Rows.Add("4", "Stagioni"); 


     //Create a DataSet with the existing DataTables 
     DataSet dst = new DataSet("SchoolBoys"); 
     dst.Tables.Add(badBoysDst); 
     dst.Tables.Add(goodBoysDst); 
     dst.Tables.Add(goodBoysDst2); 
     dst.Tables.Add(goodBoysDst3); 

     return dst; 
    } 

    public static byte[] ExportDataSetToExcel(DataSet dst) 
    { 

     #region Create The Excel 

     Excel.Application excelApp = null; 
     Excel.Workbook excelWorkBook = null; 

     try 
     { 

      excelApp = new Excel.Application(); 

      if (excelApp == null) 
       throw new Exception("You can throw custom exception here too"); 

      excelWorkBook = excelApp.Workbooks.Add(); 
      int sheetNr = 1; 

      foreach (DataTable table in dst.Tables) 
      { 
       Excel.Worksheet excelWorkSheet = null; 

       //Add a new worksheet or reuse first 3 sheets of workbook with the Datatable name 
       if (sheetNr <= excelWorkBook.Sheets.Count) 
       { 
        excelWorkSheet = excelWorkBook.Sheets.get_Item(sheetNr); 
       } 
       else 
       { 
        excelWorkSheet = excelWorkBook.Sheets.Add(After: excelWorkBook.Sheets[excelWorkBook.Sheets.Count]); 
       } 

       excelWorkSheet.Name = table.TableName; 

       for (int i = 1; i < table.Columns.Count + 1; i++) 
       { 
        excelWorkSheet.Cells[1, i] = table.Columns[i - 1].ColumnName; 
       } 

       for (int j = 0; j < table.Rows.Count; j++) 
       { 
        for (int k = 0; k < table.Columns.Count; k++) 
        { 
         excelWorkSheet.Cells[j + 2, k + 1] = table.Rows[j].ItemArray[k].ToString(); 
        } 
       } 

       sheetNr += 1; 
      } 
      //make first sheet active 
      excelApp.ActiveWorkbook.Sheets[1].Select(); 
      excelWorkBook.SaveAs(@"c:\temp\DataSetToExcel.xlsx"); 


     } 
     finally 
     { 
      excelWorkBook.Close(); 
      excelApp.Quit(); 

      //you should call GC here because there is memory problem with Interop 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 

     #endregion 


     #region Take byte[] of the excel 

     byte[] result = null; 
     using (FileStream fs = new FileStream(@"c:\temp\DataSetToExcel.xlsx", FileMode.Open, FileAccess.Read)) 
     { 
      BinaryReader reader = new BinaryReader(fs); 
      result = reader.ReadBytes((int)fs.Length); 
     } 

     #endregion 

     #region Delete the excel from the server 

     File.Delete(@"c:\temp\DataSetToExcel.xlsx"); 

     #endregion 

     return result; 
    } 

} 

तो काफी पूर्ण उदाहरण कैसे Interop साथ यह करने के लिए है कुछ समुदाय already.This द्वारा स्थापित किया गया उपयोग करने के लिए प्रयास करें। व्यक्तिगत रूप से मैं एसीई/जेट इंजन का उपयोग करना पसंद करता हूं, क्योंकि इंटरऑप में कोई मेमोरी लीक समस्या नहीं है (क्योंकि हम कोड में जीसी को कॉल कर रहे हैं)। एसीई/जेट इंजन के साथ नई चादरों का निर्माण थोड़ा कठिन है।

+0

मुझे लगता है, उपरोक्त प्रश्न समस्या linq के साथ, linq सही फ़िल्टरिंग नहीं है। @mybirthname – zahed

0

मैंने मैन्युअल निर्यात द्वारा एक ही निर्यात समस्या की है। सबसे पहले, मैं एक प्रतिक्रिया http प्रतिक्रिया ठीक से तैयार करने के लिए, की तुलना में डेटा अपने टेबल के (rowsapn और colspan विशेषताओं के साथ) सभी हेडर जोड़ने और फिर पॉप्युलेट की जरूरत है:

//this fun is called after click on export button for example 
public void Export(string fileName, GridView gv) 
{ 
    try 
    { 
     HttpContext.Current.Response.Clear(); 
     HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", String.Format("{0}.xls", fileName))); 
     HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "utf-8"); 
     HttpContext.Current.Response.Buffer = true; 
     HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; 
     HttpContext.Current.Response.Write(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">"); 

     HttpContext.Current.Response.Charset = "utf-8";//"windows-1251";// 
     HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8"); 

     using (StringWriter sw = new StringWriter()) 
     { 
      using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
      { 
       // Create a table to contain the grid 
       Table table = new Table(); 
       table.Width = Unit.Percentage(100); 
       // include the gridline settings 
       table.GridLines = gv.GridLines; 
       //header 
       TableRow r = new TableRow(); 
       TableCell cell = new TableCell() 
       { 
        ColumnSpan = 18, 
        Text = fileName, 
        BackColor = Color.LightGray, 
        HorizontalAlign = HorizontalAlign.Center 
       }; 
       cell.Font.Size = new FontUnit(14); 
       r.Cells.Add(cell); 
       table.Rows.Add(r); 

       GridViewRow row; 
       int rowSpan = 0; 

       //second row 
       row = CreateSecondHeaderRow(); 
       table.Rows.AddAt(1, row); 

       //first row 
       row = CreateFirstHeaderRow(row, rowSpan); 
       table.Rows.AddAt(1, row); 

       // add each of the data rows to the table 
       for (int j = 0; j < gv.Rows.Count; j++) 
       { 
        //Set the default color  
        gv.Rows[j].BackColor = System.Drawing.Color.White; 
        for (int i = 0; i < gv.Rows[j].Cells.Count; i++) 
        { 
         gv.Rows[j].Cells[i].BackColor = System.Drawing.Color.White; 
         gv.Rows[j].Cells[i].Width = gv.Columns[i].ItemStyle.Width; 
         gv.Rows[j].Cells[i].Font.Size = gv.Columns[i].ItemStyle.Font.Size; 
         gv.Rows[j].Cells[i].Font.Bold = gv.Columns[i].ItemStyle.Font.Bold; 
         gv.Rows[j].Cells[i].Font.Italic = gv.Columns[i].ItemStyle.Font.Italic; 
         //aligh 
         if (i == 0) 
         { 
          gv.Rows[j].Cells[i].Style["text-align"] = "center"; 
         } 
         else 
         { 
          gv.Rows[j].Cells[i].Style["text-align"] = "right"; 
         } 

         //for alternate 
         if (j % 2 != 1) gv.Rows[j].Cells[i].BackColor = Color.LightSteelBlue; 
        } 

        table.Rows.Add(gv.Rows[j]); 
       } 

       table.RenderControl(htw); 

       // render the htmlwriter into the response 
       HttpContext.Current.Response.Write(sw); 
       HttpContext.Current.Response.Flush(); 
       HttpContext.Current.Response.End(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     this._hasError = true; 
     ShowError(ex); 
    } 
} 

private TableHeaderCell CreateHeaderCell(string text = null, int rowSpan = 0, int columnSpan = 0, Color backColor = default(Color), Color foreColor = default(Color)) 
{ 
    if (object.Equals(backColor, default(Color))) backColor = Color.LightGray; 
    if (object.Equals(foreColor, default(Color))) foreColor = Color.Black; 
    return new TableHeaderCell 
    { 
     RowSpan = rowSpan, 
     ColumnSpan = columnSpan, 
     Text = text, 
     BackColor = backColor 
    }; 
} 

private GridViewRow CreateFirstHeaderRow(GridViewRow row, int rowSpan) 
{ 
    row = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert); 

    TableHeaderCell cell = CreateHeaderCell("Surplus %"); 
    row.Controls.Add(cell); 

    cell = CreateHeaderCell("The date", columnSpan: 2); 
    row.Controls.Add(cell); 

    if (this.WithQuantity) 
    { 
     cell = CreateHeaderCell("Total Quantity", 2 + rowSpan, backColor: Color.Yellow); 
     row.Controls.Add(cell); 
    } 

    cell = CreateHeaderCell("Total Amount", 2 + rowSpan); 
    row.Controls.Add(cell); 

    cell = CreateHeaderCell("Has elapsed periods from start", columnSpan: (this.WithQuantity ? (SurplusUtil.TheColumnsNumbers * 2) : SurplusUtil.TheColumnsNumbers)); 
    row.Controls.Add(cell); 

    if (this.WithQuantity) 
    { 
     cell = CreateHeaderCell("Quantity <br style='mso-data-placement:same-cell;' /> surplus", 2 + rowSpan, backColor: Color.Yellow); 
     row.Controls.Add(cell); 
    } 

    cell = CreateHeaderCell("Principal <br style='mso-data-placement:same-cell;' /> surplus", 2 + rowSpan); 
    row.Controls.Add(cell); 

    return row; 
} 

private GridViewRow CreateSecondHeaderRow() 
{ 
    GridViewRow row = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert); 

    TableHeaderCell cell = CreateHeaderCell("Period number", rowSpan: ((this.WithQuantity) ? 2 : 0)); 
    row.Controls.Add(cell); 

    cell = CreateHeaderCell("from", rowSpan: ((this.WithQuantity) ? 2 : 0)); 
    row.Controls.Add(cell); 

    cell = CreateHeaderCell("to", rowSpan: ((this.WithQuantity) ? 2 : 0)); 
    row.Controls.Add(cell); 

    for (int i = 0; i < SurplusUtil.TheColumnsNumbers; i++) 
    { 
     cell = CreateHeaderCell(i.ToString(), 
     columnSpan: ((this.WithQuantity) ? 2 : 0), 
     backColor: System.Drawing.Color.FromArgb(198, 239, 206), 
     foreColor: System.Drawing.Color.FromArgb(0, 97, 0)); 
     row.Controls.Add(cell); 
    } 
    return row; 
} 
संबंधित मुद्दे