asp.net中我用一个gridview来放置工资表的数据,如下:姓名    编号     岗位工资      金额      加班      扣岗
张三     01       100        100      50      30 
李四     02       200        100      60      40
王五     03       100        200      50      20我想把以上的数据导成工资条,如下:姓名    编号     岗位工资      金额      加班      扣岗
张三     01       100        100      50      30 
姓名    编号     岗位工资      金额      加班      扣岗
李四     02       200        100      60      40
姓名    编号     岗位工资      金额      加班      扣岗
王五     03       100        200      50      20
导成EXCEL,就像上面这样的,人和人之间有空隙,便于裁减。请高手大哥帮忙,谢谢!!!

解决方案 »

  1.   

    #region 导出Excel
            /// <summary>
            /// 导出Excel
            /// </summary>
            /// <param name="objWebControl">控件名称</param>
            /// <param name="strFileName">导出文件名</param>
            public static void OutExcel(WebControl objWebControl, String strFileName)
            {
                if (String.IsNullOrEmpty(strFileName))
                {
                    strFileName = DateTime.Now.ToString("yyyyMMdd-HHmmss");
                }
                Page objPage = objWebControl.Page;
                objPage.Response.Clear();
                objPage.Response.Buffer = true;
                objPage.Response.Charset = "GB2312";
                objPage.Response.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName.Trim() + ".xls");            // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
                objPage.Response.ContentEncoding = System.Text.Encoding.UTF7;
                objPage.Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
                System.IO.StringWriter objStringWriter = new System.IO.StringWriter();
                System.Web.UI.HtmlTextWriter objHtmlTextWriter = new System.Web.UI.HtmlTextWriter(objStringWriter);
                objWebControl.RenderControl(objHtmlTextWriter);
                objPage.Response.Output.Write(objStringWriter.ToString());
                objPage.Response.Flush();
                objPage.Response.End();
            }
            #endregion
    //把DataGrid或者GridView传进来就可以使用了,非常简单
      

  2.   

    上面是使用控件的RenderControl方法导出,还有一种方法,函数如下:public static void OutputExcel(Page objPage, String strFileName)
            {
                HttpResponse objRes;
                objRes = objPage.Response;
                objRes.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
                objRes.ContentType = "application/vnd.ms-excel";
                objRes.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName);            //Excel单元格
                string ExcelCell = "";       
               List<String> objColumnNames = new List<string>();
               //设置列的名称的列表,一定要按顺序            //初始化一张DataTable和它的列
                DataTable dtbl = //获取数据
                DataRow[] drow = dtbl.Select();            //向HTTP输出流中写入取得的数据信息
                foreach (String objItem in objColumnNames)
                {
                    objRes.Write(objItem + "\t");
                }
                objRes.Write("\n");
                //逐行处理数据  
                foreach (DataRow row in drow)
                {
                    //在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n                 foreach (DataColumn col in dtbl.Columns)
                    {
                        ExcelCell += row[col].ToString() + "\t";
                    }
                    ExcelCell += "\n";
                    //当前行数据写入HTTP输出流,并且置空ExcelCell以便处理下一行数据 
                    objRes.Write(ExcelCell);
                    ExcelCell = "";
                }
                //写缓冲区中的数据到HTTP头文件中
                objRes.End();
            }
      

  3.   


    先把數據讀取到dataset 就不用管頁面格式了
    在導出按鈕點擊事件調用以下函數
    把dataset数据保存到excel,
    public void CreateExcel(DataSet ds, string FileName)
        {
            HttpResponse resp;
            resp = Page.Response;
            resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
            string colHeaders = "", ls_item = "";
            //定义表对象与行对象,同时用DataSet对其值进行初始化
            DataTable dt = ds.Tables[0];
            DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
            int i = 0;
            int cl = dt.Columns.Count;
            //取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
            for (i = 0; i < cl; i++)
            {
                if (i == (cl - 1))//最后一列,加n
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\n";
                }
                else
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\t";
                }
            }
            resp.Write(colHeaders);
            //向HTTP输出流中写入取得的数据信息
            //逐行处理数据 
            foreach (DataRow row in myRow)
            {
                //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据  
                for (i = 0; i < cl; i++)
                {
                    if (i == (cl - 1))//最后一列,加n
                    {
                        ls_item += row[i].ToString() + "\n";
                    }
                    else
                    {
                        ls_item += row[i].ToString() + "\t";
                    }
                }
                resp.Write(ls_item);
                ls_item = "";
            }
            resp.End();
        }
      

  4.   

    用C#生成Excel文件的方法和Excel.dll组件生成的方法
    一个示例:class AppTest
    {
       private Excel.ApplicationClass _x;
       public static void Main0()
       {
        AppTest a = new AppTest();
        a._x = new Excel.ApplicationClass();
        a._x.UserControl = false;
        for (int i = 0 ;i < 4; i++)
        {
        
         a.SaveToXls("D:\\test\\" + i + ".xls");  // 本例是在D盘下建立的test文件夹
        }
        a._x.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject((object) a._x);
        System.GC.Collect();
       }   private void SaveToXls(string filename)
       {
        Excel.WorkbookClass wb = (Excel.WorkbookClass) this._x.Workbooks.Add(System.Reflection.Missing.Value);
        for(int i = 1;i <= 4; i++)
        {
         this._x.Cells[i,1]=i.ToString();
         this._x.Cells[i,2]="'bbb2";
         this._x.Cells[i,3]="'ccc3";
         this._x.Cells[i,4]="'aaa4";
        }
       
        wb.Saved = true;
        this._x.ActiveWorkbook.SaveCopyAs(filename);
       }
    }【注:在VS.Net中运行是要添加Excel.dll组件的,Excel组件VS.Net本身是没有的,下面是生成Excel.dll的方法。】1.要保证机器本身要安装OFFICE. 2.把[C:\Program Files\Microsoft Office\Office:默认安装路径]下的EXCEL9.OLB文件拷贝到[C:\Visual Studio.Net\SDK\v1.1\Bin:VS.Net安装路径]路径下。3.打开Visual Studio .Net2003命令提示,运行TlbImp Excel9.olb Excel.dll ,就会在[C:\Visual Studio.Net\SDK\v1.1\Bin]下生成Excel.dll组件。4.在项目中添加Excel.dll引用就OK了。
      

  5.   

    我也练习下:)一、测试数据
    create table table2 
    (
    姓名 nvarchar(15),
        编号 nvarchar(15),
        岗位工资 decimal(10,2),
        金额 decimal(10,2),
        加班 decimal(10,2),
        扣岗 decimal(10,2),
    )insert into table2
    select '张三','01',100,100,50,30 
    union all
    select '李四','02',200,100,60,40 
    union all
    select '王五','03',100,200,50,20 select * from table2二、编码
    页面添加一GridView,两Button,分别命名btnLoadData,btnExport,代码如下
     private const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=;";    protected void btnLoadData_Click(object sender, EventArgs e)
        {
            GridView1.DataSource = GetSalary();
            GridView1.DataBind();
        }    /// <summary>
        /// 导出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnExport_Click(object sender, EventArgs e)
        {        this.Response.Clear();
            this.Response.Buffer = true;
            this.Response.Charset = "GB2312";
            this.Response.AppendHeader("Content-Disposition", "attachment;filename=salary.xls");        this.Response.ContentEncoding = System.Text.Encoding.UTF7;
            this.Response.ContentType = "application/ms-excel";        DataTable dt = GetSalary();
            string excelScript = CreateExcelScript(dt);        this.Response.Output.Write(excelScript);
            this.Response.Flush();
            this.Response.End();    }    /// <summary>
        /// 获取工资数据
        /// </summary>
        /// <returns></returns>
        private DataTable GetSalary()
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = conString;
            con.Open();
            string sqlSelect = "Select * From table2";
            SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }
     
        /// <summary>
        /// 格式化导出数据
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        private string CreateExcelScript(DataTable dt)
        {
            // 表格
            StringBuilder sbTable = new StringBuilder();
            // 标题
            StringBuilder sbTitle = new StringBuilder();    
            // 行数据
            StringBuilder sbRowData = new StringBuilder();       
            
            // 总列数
            int colCount = dt.Columns.Count;
            // 总行数
            int rowCount = dt.Rows.Count;        // 标题
            for (int i = 0; i < colCount; i++)
            {           
                sbTitle.AppendFormat("<td>{0}</td>",dt.Columns[i].ColumnName);
            }        sbTable.Append("<table border=1>");
            // 遍历数据
            for(int m=0;m<rowCount;m++)
            {
                // 添加标题
                sbTable.AppendFormat("<tr>{0}</tr>",sbTitle.ToString());
                // 添加数据
                DataRow dr = dt.Rows[m];
                sbRowData = new StringBuilder();
                for (int n = 0; n < colCount; n++)
                {
                    sbRowData.AppendFormat("<td>{0}</td>", dr[n].ToString());
                }
                sbTable.AppendFormat("<tr>{0}</tr>", sbRowData.ToString());
                // 添加空行
                if (m != rowCount - 1)
                {
                    sbTable.AppendFormat("<tr><td colspan='{0}'></td></tr>", colCount);
                }
            }
            sbTable.Append("</table>");      return  sbTable.ToString();
        }
      

  6.   

    SELECT 姓名,编号,岗位工资,金额,加班,扣岗
    FROM (
        SELECT '姓名' AS 姓名,'编号' AS 编号,
              '岗位工资' AS 岗位工资,'金额' AS 金额,
              '加班' AS 加班,'扣岗' AS 扣岗,o1=姓名,o2=0
        FROM @T
        UNION ALL
        SELECT 姓名,编号,RTRIM(岗位工资),
               RTRIM(金额),RTRIM(加班),
               RTRIM(扣岗),姓名,1
        FROM @T
        UNION ALL
        SELECT '','','','','','',
               姓名,2
        FROM @T WHERE 编号 NOT IN(SELECT TOP 1 编号 FROM @T)
    ) AS A
    ORDER BY o1,o2先用SQL语句把表变成这样姓名   编号      岗位工资     金额      加班      扣岗姓名    编号    岗位工资      金额      加班      扣岗 
    张三    01      100        100      50      30 姓名    编号    岗位工资      金额      加班      扣岗 
    李四    02      200        100      60      40 姓名    编号    岗位工资      金额      加班      扣岗 
    王五    03      100        200      50      20 
    然后执行这条SQL,把数据填充到dataset,然后调用以下函数,导出excel
    public void CreateExcel(DataSet ds, string FileName)
        {
            HttpResponse resp;
            resp = Page.Response;
            resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
            string colHeaders = "", ls_item = "";
            //定义表对象与行对象,同时用DataSet对其值进行初始化
            DataTable dt = ds.Tables[0];
            DataRow[] myRow = dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的
            int i = 0;
            int cl = dt.Columns.Count;
            //取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
            for (i = 0; i < cl; i++)
            {
                if (i == (cl - 1))//最后一列,加n
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\n";
                }
                else
                {
                    colHeaders += dt.Columns[i].Caption.ToString() + "\t";
                }
            }
            resp.Write(colHeaders);
            //向HTTP输出流中写入取得的数据信息
            //逐行处理数据 
            foreach (DataRow row in myRow)
            {
                //当前行数据写入HTTP输出流,并且置空ls_item以便下行数据  
                for (i = 0; i < cl; i++)
                {
                    if (i == (cl - 1))//最后一列,加n
                    {
                        ls_item += row[i].ToString() + "\n";
                    }
                    else
                    {
                        ls_item += row[i].ToString() + "\t";
                    }
                }
                resp.Write(ls_item);
                ls_item = "";
            }
            resp.End();
        }