昨天的帖子
http://community.csdn.net/Expert/topic/5700/5700979.xml?temp=.5231134初步从ok.xsl
部門名稱 員工編號 员工姓名 請假日期 假别名称 請假時數 時數單位 
(K1) Q-0004 姚力 20070601 年休假 1 天 
(K1) Q-0004 姚力 20070608 陪產假 1 天 
(K1) Q-0004 姚力 20070612 年休假 2 天 
(K1) Q-0005 顧忠 20070601 年休假 0.5 天 
(K2) Q-0031 趙丽 20070601 半薪病假 8 小時 
.........................................
要实现
部門名稱 員工編號 员工姓名  年休假  陪產假  半薪病假
(K1) Q-0004 姚力 20070601   24小时   8小时    
(K1) Q-0005 顧建忠 20070601  4小时 
(K2) Q-0031 趙丽 20070601                    8 小時 
.................................
时间单位为天的话,就要乘8,转化为小时。
以工号为唯一性,合并多条数据为一条。..........
Help me !

解决方案 »

  1.   

    girdview中绑定的,要不来个GirdView数据导入数据库,相同的数据合并成一行。
    如何实现?
      

  2.   

    先从excel读到datatable中.然后有两种方法,一种是先导入数据库,然后在数据库中计算,这样比较简单,做个groupby 就可另一种直接在datatblae中计算.DataView 按部门员工排序.循环.累加.
    或者,用dt.Compute("sum(日期)","编号='某个员工编号')
      

  3.   

    难得慕白兄的赏脸,感到万般的荣幸! 
    初步从ok.xsl,读到Girdview中。
    部門名稱 員工編號 员工姓名 請假日期 假别名称 請假時數 時數單位 
    (K1) Q-0004 姚力 20070601 年休假 1 天 
    (K1) Q-0004 姚力 20070608 陪產假 1 天 
    (K1) Q-0004 姚力 20070612 年休假 2 天 
    (K1) Q-0005 顧忠 20070601 年休假 0.5 天 
    (K2) Q-0031 趙丽 20070601 半薪病假 8 小時 
    一种是先导入数据库。  怎么实现Girdview导入数据库?
      

  4.   

    初步从ok.xsl,读到Girdview中。
    ===>
    怎么是到gridview控件中,gv是ui控件,应该先读到数据容器中才对.
    读到dataset的datatable中.
      

  5.   

    然后用sql或dataadapter写入数据库
      

  6.   

    海一种比较傻,就是在客户端用javascript去写采用楼上的几位可能会好一点
      

  7.   

    因为好多列数据。
    在gridview中我只能它显示需要的列。
      

  8.   

    因为excel中好多列数据。
    我在girdview中只然它显示
    部門名稱 員工編號 员工姓名 請假日期 假别名称 請假時數 時數單位 
    这几列。能不能用实现实现Girdview导入数据库?
    在dataset中的datatable里的数据我不会处理,也就是说不会编写代码。
      

  9.   

    能不能用实现实现Girdview导入数据库?
    ==>
    用datatable导入,自己写sql,想导哪个字段就写哪个.
      

  10.   

    将数据ok.xsl导入数据库后执行这两句sql
    update T2 set 请假时数=请假时数*8
    where 时数单位='天'
    update T2 set 时数单位='小时'select 部门名称,员工编号,员工姓名,假别名称,sum(请假时数) AS 总请假时间 from T2
    group by 部门名称,员工编号,员工姓名,假别名称
    得到:
    部门名称,员工编号,员工姓名,假别名称,总请假时间
    K1         Q-0004     姚力       年休假     24.0
    K1         Q-0004     姚力       陪产假     8.0
    K1         Q-0005     顾忠       年休假     4.0
    K2         Q-0031     赵丽       半新病假   8.0
    然后在程序中根据“假别名称”判断这个结果集
      

  11.   

    直接用 ADO.NET 去读取 EXCEL 到 DataTable 中然后对 DataTable 中的数据处理具体,如何遍历 DataTable 冷静思考下,简单的逻辑算法而已。读取 Excel 见:
    http://www.cnblogs.com/Jinglecat/archive/2006/08/15/477472.html
    特别注意:纯数据处理,不要去考虑什么 DataGrid/GridView/... 控件的,那是 UI 组件!!!!
      

  12.   

    declare @s varchar(8000)
    set @s ='select 部門名稱,員工編號,员工姓名'
    select @s = @s+','+假别名称+'=sum(case 假别名称 when '''+假别名称+''' then 請假時數*(case  時數單位 when ''天'' then 8 else 1 end) else 0 end)'
    from tb group by 假别名称
    exec(@s+'from tb group by 部門名稱,員工編號,员工姓名')
      

  13.   

    drop table tb
    create  table tb
    (
    部門名稱 varchar(100),
    員工編號 varchar(100),
    员工姓名 varchar(100),
    請假日期  varchar(100),
    假别名称 varchar(100),
    請假時數 float,
    時數單位  varchar(100)
    )
    insert into tb
    select
    '(K1)',   'Q-0004',    '姚力 ', '20070601','年休假','1','天' union all select 
    '(K1)',   'Q-0004',    '姚力 ', '20070608','陪產假','1','天'  union all select 
    '(K1)',   'Q-0004',    '姚力 ', '20070612','年休假','2','天'  union all select 
    '(K1)',   'Q-0005',    '顧忠 ', '20070601','年休假',0.5,'天' union all select 
    '(K2)',   'Q-0031',    '趙丽 ', '20070601','半薪病假',8,'小时' 
         declare @s varchar(8000)
    set @s ='select 部門名稱,員工編號,员工姓名'
    select @s = @s+','+假别名称+'=sum(case 假别名称 when '''+假别名称+''' then 請假時數*(case  時數單位 when ''天'' then 8 else 1 end) else 0 end)'
    from tb group by 假别名称
    exec(@s+'from tb group by 部門名稱,員工編號,员工姓名')
      

  14.   

    Result
    ----------------------------------------
    (K1) Q-0004 姚力  0.0 24.0 8.0
    (K1) Q-0005 顧忠  0.0 4.0 0.0
    (K2) Q-0031 趙丽  8.0 0.0 0.0
      

  15.   

    说得对,
    在DATATABLe里编辑。
      

  16.   

    不好意思,本人有事刚回来。实在抱歉。
    haonanernet(与时俱进)谢谢你的答复。
    只要我把excel导入数据库,一定试一下你的方法。
      

  17.   

    string connStr = ConfigurationManager.AppSettings["connectionString"];
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
               // string SqlStr = "update test01 set card='" + card + "',xueli='" + xueli + "',price='" + price + "',name='" + username + "' where id=" + id;
                string SqlStr = "Insert excel_imput(dep_name,empId,emp_name,holiday_name,holiday_times,time_unit) values('" + GridView1.Rows[i].Cells[0].Text + "','" + GridView1.Rows[i].Cells[1].Text + "','" + GridView1.Rows[i].Cells[2].Text + "','" + GridView1.Rows[i].Cells[4].Text + "','" + GridView1.Rows[i].Cells[5].Text + "','" + GridView1.Rows[i].Cells[6].Text + "')";
                try
                {
                    
                    SqlConnection conn = new SqlConnection(connStr);
                    if (conn.State.ToString() == "Closed") conn.Open();
                    SqlCommand comm = new SqlCommand(SqlStr, conn);
                    comm.ExecuteNonQuery();
                    comm.Dispose();
                    if (conn.State.ToString() == "Open") conn.Close();            }
                catch (Exception ex)
                {
                    Response.Write("数据库错误,错误原因:" + ex.Message);
                    Response.End();
                }
            }从girdview成功导入数据库。现在可以开始试一下haonanernet(与时俱进)的做法。
      

  18.   

    //在DATATABLe里编辑。
    要是我会在datatable里面操作的话,俺也不会发这个贴了。
    好在还能从girdview成功导入数据库。
    虽然笨了点,没办法,只能多走弯路,笨路。
      

  19.   

    try ->string sqlSelect = "SELECT 部門名稱, 員工編號, 员工姓名, 請假日期, 假别名称, 請假時數, 時數單位 FROM [Sheet1$]";
            string connStr = 
                String.Format("provider=Microsoft.Jet.OLEDB.4.0;data source={0};Extended Properties=Excel 8.0",
                    Server.MapPath("XlsCross.xls"));
             
            // 加载原表
            OleDbDataAdapter da = new OleDbDataAdapter(sqlSelect, connStr);
            DataTable sourceTable = new DataTable();
            da.Fill(sourceTable);        // 输出原表
            GridView1.DataSource = sourceTable;
            GridView1.DataBind();        // 创建目标表结构
            DataTable targetTbl = new DataTable();
            targetTbl.Columns.Add("部門名稱", typeof(string));
            targetTbl.Columns.Add("員工編號", typeof(string));
            targetTbl.Columns.Add("员工姓名", typeof(string));        // 获取员工信息
            DataTable stuffTable = sourceTable.DefaultView.ToTable(true, new string[] { "部門名稱", "員工編號", "员工姓名" }); 
            
            // 从源表导入员工信息
            foreach (DataRow stuffRow in stuffTable.Rows) {
                DataRow targetRow = targetTbl.NewRow();
                targetRow["部門名稱"] = stuffRow["部門名稱"];
                targetRow["員工編號"] = stuffRow["員工編號"];
                targetRow["员工姓名"] = stuffRow["员工姓名"];            targetTbl.Rows.Add(targetRow);
            }        // 两表加入 DataSet 并根据员工编号建立父子关系,目标表为父表        
            DataSet ds = new DataSet();
            ds.Tables.Add(targetTbl);
            ds.Tables.Add(sourceTable);
            ds.Relations.Add(targetTbl.Columns["員工編號"], sourceTable.Columns["員工編號"]);        // 从源表(子表)计算目标数据
            DataTable vocationCategoryTable = sourceTable.DefaultView.ToTable(true, "假别名称");
            foreach (DataRow row in vocationCategoryTable.Rows) {
                targetTbl.Columns.Add(row["假别名称"].ToString(), typeof(double), String.Format("SUM(Child.{0})", "假别名称"));
            }        // 输出
            GridView2.DataSource = targetTbl;
            GridView2.DataBind();
      

  20.   

    sorry, targetTbl.Columns.Add(row["假别名称"].ToString(), typeof(double), String.Format("SUM(Child.{0})", "假别名称"));>>>>targetTbl.Columns.Add(row["假别名称"].ToString(), typeof(double), String.Format("SUM(Child.{0})", "請假時數"));以上代码对 LZ 的样本数据,已测试通过。
      

  21.   

    I'm sorry that there are some big bug at My code snippets above.I'm struggling to fix it.
      

  22.   

    haonanernet(与时俱进)的做法已经试验成功。
    非常感激!
     Jinglecat(晓风残月 >> 问题需简洁,错误要详细) ( ) 信誉:94  2007-08-10 14:19:27  得分: 0  
     
     
       I'm sorry that there are some big bug at My code snippets above.I'm struggling to fix it.
      
     
    大哥,你见外了,我特感激您!
    当我刚发帖,您就说要帮我,在你百忙中时还伸出温暖有力的手来帮我。
    实在太感谢你了!
    接下来我将试一下你方法,还会拜访你的blog。
    你让我今天学了很多。
    谢谢!
      

  23.   

    一直想基于 DataColumn 的计算列功能实现,还是发现对于复杂条件的统计,无法很好实现现在放弃了,自己循环遍历计算,虽然算法是对了,但是由于是直接读取 Excel 数据,且全是文本数据,有些数据竟然查不出来,感兴趣的话,check 一下吧,帮忙找找原因 ^_^protected void Button1_Click(object sender, EventArgs e)
        {
            string sqlSelect = "SELECT 部門名稱, 員工編號, 员工姓名, 請假日期, 假别名称, 請假時數, 時數單位 FROM [Sheet1$]";
            string connStr = 
                String.Format("provider=Microsoft.Jet.OLEDB.4.0;data source={0};Extended Properties=Excel 8.0",
                    Server.MapPath("XlsCross.xls"));
             
            // 加载原表
            OleDbDataAdapter da = new OleDbDataAdapter(sqlSelect, connStr);
            DataTable sourceTable = new DataTable();
            da.Fill(sourceTable);        // 输出原表
            GridView1.DataSource = sourceTable;
            GridView1.DataBind();        // 创建目标表结构
            DataTable targetTbl = new DataTable();
            targetTbl.Columns.Add("部門名稱", typeof(string));
            targetTbl.Columns.Add("員工編號", typeof(string));
            targetTbl.Columns.Add("员工姓名", typeof(string));              // 
            DataTable vocationCategoryTable = sourceTable.DefaultView.ToTable(true, "假别名称");
            foreach (DataRow row in vocationCategoryTable.Rows) {
                targetTbl.Columns.Add(row["假别名称"].ToString(), typeof(double));
            }        // 获取员工信息
            DataTable stuffTable = sourceTable.DefaultView.ToTable(true, new string[] { "部門名稱", "員工編號", "员工姓名" });        // 从源表导入员工信息
            foreach (DataRow stuffRow in stuffTable.Rows) {
                DataRow targetRow = targetTbl.NewRow();
                targetRow["部門名稱"] = stuffRow["部門名稱"].ToString().Trim();
                targetRow["員工編號"] = stuffRow["員工編號"].ToString().Trim();
                targetRow["员工姓名"] = stuffRow["员工姓名"].ToString().Trim();            int ndx = 3;
                while (++ndx < targetTbl.Columns.Count) {
                    ExecuteSUM(sourceTable, targetTbl, targetRow, ndx);
                }            
                
                targetTbl.Rows.Add(targetRow);
            }              // 输出
            GridView2.DataSource = targetTbl;
            GridView2.DataBind();
        }    private void ExecuteSUM(DataTable sourceTable, DataTable targetTable, DataRow targetRow, int targetColumnIndex)
        {
            DataRow[] sourceRows = sourceTable.Select(String.Format("員工編號='{0}' AND 假别名称='{1}'",
                        targetRow["員工編號"].ToString().Trim(), targetTable.Columns[targetColumnIndex].ColumnName.Trim()));
            
            double sum = 0.0;
            foreach (DataRow sourceRow in sourceRows) {
                sum += (Convert.ToDouble(sourceRow["請假時數"]) * (sourceRow["時數單位"].ToString().Trim() == "天" ? 8 : 1));
            }        targetRow[targetTable.Columns[targetColumnIndex].ColumnName] = sum;
        }
      

  24.   

    郁闷啊,竟然犯了一个弱智问题,晕菜了 ...
    targetRow["员工姓名"] = stuffRow["员工姓名"].ToString().Trim();int ndx = 3; >>>targetRow["员工姓名"] = stuffRow["员工姓名"].ToString().Trim();int ndx = 2;
    现在结果是 OK 了,想来还是 SQL 做集合运算强!
      

  25.   

    注:以上代码使用了 .net 2.0 才支持的 DataView.ToTable 方法,net 1.x 需要自己开发此功能,这里提供了相关的简易版本如何对 DataTable 执行 SELECT DISTINCT 
    http://www.cnblogs.com/Jinglecat/archive/2007/07/16/820339.html
      

  26.   

    这是我改了haonanernet(与时俱进) 在数据库中的sql    
        declare @s varchar(8000)
        set @s ='select dep_name,empId,emp_name'
         select @s = @s+','+holiday_name+'=sum(case holiday_name when '''+holiday_name+''' then holiday_times*(case  time_unit when ''天'' then 8 else 1 end) else 0 end)'
      from excel_imput group by holiday_name
      exec(@s+'from excel_imput group by dep_name,empId,emp_name')
    数据库中能运行出结果。
    现在我想把它放在页面中来实行。
            string SqlStr = "select dep_name,empId,emp_name,'+holiday_name+'=sum(case holiday_name when '''+holiday_name+''' then holiday_times*(case  time_unit when '天' then 8 else 1 end) else 0 end) from excel_imput group by  dep_name,empId,emp_name ";结果却出现如下:
    dep_name empId emp_name +holiday_name+ 
    (K1) Q-0004  姚力 0 
    (K1) Q-0005  顧忠 0 
      

  27.   

    这个构造动态的SQL语句必须封装成存储过程的.  
     你用页面来调用存储过程就可以了.他返回的依然是一个DataTable
      

  28.   

    CREATE PROC spGetInfo
    as
    begin
    declare @s varchar(8000)
        set @s ='select dep_name,empId,emp_name'
         select @s = @s+','+holiday_name+'=sum(case holiday_name when '''+holiday_name+''' then holiday_times*(case  time_unit when ''天'' then 8 else 1 end) else 0 end)'
      from excel_imput group by holiday_name
      exec(@s+'from excel_imput group by dep_name,empId,emp_name')
    end
      

  29.   

    haonanernet(与时俱进)是的,后来我用存储过程试了一下,果真成功。
    接着我在页面里面调用,运行通过。
    把代码贴出来,让更多初学者或象我这样的菜鸟学习。
     SqlConnection conndb = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["connectionString"]);
            SqlCommand SqlCom = new SqlCommand("Excel_ImputProcedure", conndb);
            SqlCom.CommandType = CommandType.StoredProcedure;
            conndb.Open();
            SqlDataReader result = SqlCom.ExecuteReader(CommandBehavior.CloseConnection);
            GridView2.DataSource = result;
            GridView2.DataBind();
      

  30.   

    开始结贴。
    在这里感谢各大网友的支持!
    特别感谢haonanernet(与时俱进),Jinglecat(晓风残月 >> 问题需简洁,错误要详细)
    及cpp2017(慕白兄)的热心帮助和指导!
    特感激你们!