2016-01-27 75 views
11

Sono esportare tre lavoravano foglio singolo file XL, ma mi manca alcuni dati degli utenti nel secondo (foglio Education Details) DataTable e la terza (foglio Employeement Details) DataTable.Alcuni dati mancano nel Esporta in Excel utilizzando DataTable e Linq

Il foglio Education Details è alcuni utenti non sono lì, ma un foglio Employeement Details che gli utenti stanno mostrando. ID e-mail utente sono tutte e tre le tabelle del database.

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); 

ho fatto base di risultato sui primi DataTable utenti Email, quindi riempire la seconda base DataTable utenti dettaglio sui primi DataTableEmail id. Lo stesso di Employment Details. Il problema nel primo DataTable e nel secondo DataTable. Non sto restituendo il DataTable anche.

Mi riferisco this example

+2

confronto di stringhe case sensitive e il formato degli indirizzi di posta elettronica non è lo stesso tra le tabelle? – dlatikay

+0

La tua libreria ToExcel() è di 8 anni fa. Potresti voler vedere cosa succede se usi la mia libreria C# (gratuita). Prende solo una riga di codice (semplicemente passa il tuo DataSet e il nome del file) e creerà un vero file Excel .xlsx usando le librerie OpenXML. http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm –

risposta

1

Credo che la vostra confronto tra stringhe nella query LINQ è un problema. . il tuo indirizzo email potrebbe avere casi diversi che potrebbero aver causato questo problema. Prova sotto il codice

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

Errore di ricezione: Non è possibile accedere all'oggetto "oggetto.Equalita (oggetto, oggetto)" con un riferimento di istanza; qualificarlo invece con un nome tipo. @Viru – zahed

+1

Ho usato stringcomparer invece stringcmparison questo è l'errore. Lo ha modificato. Pls prova ora – Viru

3

Il problema è venuta da qualche parte dalla soluzione di conversione da DataSet in Excel in questo articolo. Usare questa conversione fatta da sé non è una buona idea. Utilizzare Jet/ACE engine o Microsoft Office Interop. Almeno garantiscono, non hanno questo tipo di bug, che in futuro possono diventare più. Meglio usare qualcosa che è già altamente accettato dalla comunità. Qui ho scritto un approccio su come farlo con Interop.

Prima di tutto è necessario aggiungere il riferimento a Microsoft.Office.Interop.Excel. Ecco come farlo, tratto da 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.

Ovviamente se avete la versione più grande di Excel 11 usarlo.

Ecco il codice, ci sono commenti/regioni con il flusso di lavoro di esso. Si dovrebbe usare using Excel = Microsoft.Office.Interop.Excel; come riferimento

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; 
    } 

} 

quindi cercate di usare qualcosa stabilita dalla comunità already.This è praticamente esempio completo come farlo con Interop. Personalmente preferisco usare i motori ACE/JET, perché non ci sono problemi di perdite di memoria come nell'Interop (per questo motivo stiamo chiamando il GC nel codice). La creazione di nuovi fogli con il motore ACE/JET è un po 'più difficile.

+0

Penso che il problema della domanda precedente con linq, linq non stia filtrando correttamente. @mybirthname – zahed

0

Avevo fatto lo stesso problema di esportazione con l'esportazione manuale. In primo luogo, ho bisogno di preparare una risposta in responce http correttamente, di aggiungere tutte le intestazioni (con rowsapn e colspan attributi) delle tabelle e quindi popolare i dati:

//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; 
}