2010-11-11 12 views
1

Je suis toujours aux prises avec mon scénario. J'ai cherché partout une solution et je ne trouve pas de solution. J'utilise C# et ASP.NET et j'ai besoin d'exporter des données vers une feuille de calcul Excel.Exporter/importer vers Excel avec la zone de liste déroulante

J'ai une liste d'applications qui contient des objets Application. Chaque objet Application a un ID d'état. Lorsque j'exporte ces applications vers Excel, j'ai besoin d'une colonne avec une liste déroulante/une zone de liste déroulante. Dans cette liste déroulante/zone de liste déroulante devrait être une liste de tous les statuts de la base de données. Et puis j'ai besoin que le statut soit sélectionné pour celui de l'ID d'état de l'application.

Une autre question concerne également le scénario ci-dessus. Lorsque l'utilisateur télécharge le document Excel, l'utilisateur peut modifier l'état de chaque application en sélectionnant une valeur différente dans la liste déroulante. Je vais devoir télécharger cette feuille de calcul et faire une boucle dans les lignes pour obtenir les valeurs des colonnes et la valeur de l'élément sélectionné dans la liste déroulante/zone de liste déroulante. Comment ferais-tu ceci? Est-ce possible? Je ne peux pas utiliser les composants COM, donc j'ai essayé d'utiliser EPPlus ou NPOI (ce n'est pas forcément ces 2) mais il ne semble pas qu'ils supportent mon scénario. Comment serais-je capable de réaliser mon scénario? Encore une fois, il ne doit pas utiliser EPPlus et NPOI. Exemples de travail seraient appréciés :)

Merci

Brendan

Répondre

2

Avez-vous essayé d'utiliser un modèle dans NPOI? Lorsque je veux exporter des feuilles de calcul complexes avec NPOI, je crée un document XLS à utiliser comme modèle et je remplis les données via C#.

+0

Non, je n'en ai pas. Avez-vous par hasard eu un code d'exemple pour moi s'il vous plaît? J'ai une date limite pour demain, donc mon temps est vraiment limité pour aller expérimenter maintenant. Si vous pouvez juste me donner un exemple de code, je peux probablement le prendre à partir de là. –

+0

Voici un lien vers un exemple où j'ai utilisé NPOI pour charger un template. Ce n'est pas une correspondance directe, mais le concept général du chargement d'un modèle doit être clair. http://www.zachhunter.com/2010/05/npoi-excel-template/ – Zachary

+0

Merci. J'ai un échantillon de comment le faire. Mais ce que je cherche, c'est comment sélectionner un élément dans la liste déroulante en fonction de l'état de mes applications. J'ai une liste de tous les états dans une liste déroulante, j'ai besoin de sélectionner l'élément de mon état d'application. Comment ferais-je cela par programme? –

2

Pas besoin de macro du tout. C# lui-même le fera pour vous. Ici, j'ai une démo pour l'importation d'un Excel (pas d'importance 2003/2007) à gridview et l'exportation de données gridview (EDITED/changed) vers un nouveau fichier EXCEL. Essayez-le. Works 100%

Ce que vous devez faire est: créer un dossier nommé "Fichiers" dans votre application Web et conserver votre fichier Excel dans le dossier "Fichiers". Si votre source de données (d'où votre grille est remplie) est autre qu'excel, alors pas besoin du dossier ci-dessus. Vous pouvez écrire votre propre code dans le btnImport_Click(). Voici votre page .aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ImportFromExcelToDatasetAndGridviewAndExport.aspx.cs" Inherits="ImportFromExcelToGridViewWebApp.ImportFromExcelToDatasetAndGridviewAndExport" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <div> 
     <b>Please Select Excel File : </b> 
     <asp:FileUpload ID="fileuploadExcel" runat="server" />&nbsp;&nbsp; 
     <asp:Button ID="btnImport" runat="server" Text="Import From Excel" OnClick="btnImport_Click" /> 
     <br /> 
     <asp:Label ID="lblMessage" runat="server" Visible="False" Font-Bold="True" ForeColor="#009933"></asp:Label><br /> 

     <asp:GridView ID="grvExcelData" runat="server" AutoGenerateColumns="false" 
      onrowdatabound="GridView2_RowDataBound"> 
      <HeaderStyle BackColor="#df5015" Font-Bold="true" ForeColor="White" /> 
      <Columns> 
       <asp:TemplateField ItemStyle-Width = "150px" HeaderText = "UserName"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtUserName" runat="server" 
            CssClass="css2" Text='<%# Eval("UserName")%>'></asp:TextBox> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtUserName" runat="server" 
            CssClass="css2" Text='<%# Eval("UserName")%>'> 
         </asp:TextBox> 
        </EditItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField ItemStyle-Width = "150px" HeaderText = "Education"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtEducation" runat="server" 
            CssClass="css2" Text='<%# Eval("Education")%>'></asp:TextBox> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtEducation" runat="server" 
            CssClass="css2" Text='<%# Eval("Education")%>'> 
         </asp:TextBox> 
        </EditItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField ItemStyle-Width = "150px" HeaderText = "Location"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtLocation" runat="server" 
            CssClass="css2" Text='<%# Eval("Location")%>'></asp:TextBox> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtLocation" runat="server" 
            CssClass="css2" Text='<%# Eval("Location")%>'> 
         </asp:TextBox> 
        </EditItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Select"> 
        <ItemTemplate> 
         <asp:DropDownList ID="DrdDatabase" Width="100px" runat="server"> 
         </asp:DropDownList> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:DropDownList ID="DrdDatabase" Width="100px" runat="server"> 
         </asp:DropDownList> 
        </EditItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
     <asp:Button ID="btnExport" runat="server" Text="Export To Excel" OnClick="btnExport_Click" /> 
    </div> 
</asp:Content> 

Et voici votre code derrière.

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.Data; 
    using System.IO; 
    using System.Data.OleDb; 
    using System.Collections; 

namespace ImportFromExcelToGridViewWebApp 
{ 
    public partial class ImportFromExcelToDatasetAndGridviewAndExport : System.Web.UI.Page 
    { 
     private ArrayList ExcelData 
     { 
      get 
      { 
       object excel = Session["dropdownvalue"]; 
       if (excel == null) Session["dropdownvalue"] = new ArrayList(); 
       return (ArrayList)Session["dropdownvalue"]; 
      } 
      set 
      { 
       Session["dropdownvalue"] = value; 
      } 
     } 

     protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       DropDownList ddl = (DropDownList)e.Row.FindControl("DrdDatabase"); 
       foreach (string colName in ExcelData) 
        ddl.Items.Add(new ListItem(colName)); 
      } 
     } 

     protected void btnImport_Click(object sender, EventArgs e) 
     { 
      ArrayList alist = new ArrayList(); 
      string connString = ""; 
      string strFileType = Path.GetExtension(fileuploadExcel.FileName).ToLower(); 
      string fileBasePath = Server.MapPath("~/Files/"); 
      string fileName = Path.GetFileName(this.fileuploadExcel.FileName); 
      string fullFilePath = fileBasePath + fileName; 

      //Connection String to Excel Workbook 
      if (strFileType.Trim() == ".xls") 
      { 
       connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fullFilePath + 
           ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\""; 
      } 
      else if (strFileType.Trim() == ".xlsx") 
      { 
       connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fullFilePath + 
          ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\""; 
      } 
      if (fileuploadExcel.HasFile) 
      { 
       string query = "SELECT [UserName],[Education],[Location] FROM [Sheet1$]"; 
       OleDbConnection conn = new OleDbConnection(connString); 
       if (conn.State == ConnectionState.Closed) 
        conn.Open(); 
       OleDbCommand cmd = new OleDbCommand(query, conn); 
       OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 
       //Assigning dataset table data to GridView Control 
       Session["griddata"] = ds.Tables[0]; 

       System.Data.DataTable dtt = (System.Data.DataTable)Session["griddata"]; //griddata is the gridview data from another page   
       var res = (from f in dtt.AsEnumerable() 
          select f.Field<string>("Location") 
        ); 


       foreach (string s in res.AsEnumerable()) 
       { 
        alist.Add(s); 
       } 

       Session["dropdownvalue"] = alist; 

       grvExcelData.DataSource = Session["griddata"]; 
       grvExcelData.DataBind(); 

       da.Dispose(); 
       conn.Close(); 
       conn.Dispose(); 
      } 
     } 

     protected void btnExport_Click(object sender, EventArgs e) 
     { 
      System.Data.DataTable dtExcel = new DataTable(); 

      dtExcel.Columns.Add("UserName", typeof(string)); 
      dtExcel.Columns.Add("Education", typeof(string)); 
      dtExcel.Columns.Add("Location", typeof(string)); 
      dtExcel.Columns.Add("Select", typeof(string)); 
      foreach (GridViewRow row in grvExcelData.Rows) 
      { 
       string UserName = ((TextBox)row.FindControl("txtUserName")).Text; 
       string Education = ((TextBox)row.FindControl("txtEducation")).Text; 
       string Location = ((TextBox)row.FindControl("txtLocation")).Text; 
       string Location2 = ((DropDownList)row.FindControl("DrdDatabase")).Text; 
       DataRow dr = dtExcel.NewRow(); 
       dr["UserName"] = UserName; 
       dr["Education"] = Education; 
       dr["Location"] = Location; 
       dr["Select"] = Location2; 
       dtExcel.Rows.Add(dr); 
      } 

      CreateWorkbook(dtExcel, Server.MapPath("~/DownlodedFiles/Excel.xls")); 
     } 

     public static void CreateWorkbook(System.Data.DataTable dtExcelData, String path) 
     { 
      int rowindex = 0; 
      int columnindex = 1; 

      Microsoft.Office.Interop.Excel.Application app; 
      Microsoft.Office.Interop.Excel.Worksheet wksheet; 
      Microsoft.Office.Interop.Excel.Workbook wkbook; 
      app = new Microsoft.Office.Interop.Excel.Application(); 
      app.Visible = false; 
      wkbook = app.Workbooks.Add(true); 
      wksheet = (Microsoft.Office.Interop.Excel.Worksheet)wkbook.ActiveSheet; 
      try 
      { 
       for (int i = 0; i < dtExcelData.Columns.Count; i++) 
       { 
        wksheet.Cells[1, i + 1] = dtExcelData.Columns[i].ColumnName; 
       } 

       foreach (DataRow row in dtExcelData.Rows) 
       { 
        rowindex++; 
        columnindex = 0; 
        foreach (DataColumn col in dtExcelData.Columns) 
        { 
         columnindex++; 
         wksheet.Cells[rowindex + 1, columnindex] = row[col.ColumnName]; 
        } 
       } 

       app.Visible = true; 
      } 
      catch (Exception ex1) 
      { 

      } 
      app.UserControl = true; 
     } 
    } 
}