Foxtable(狐表)用户栏目专家坐堂 → 生成多成表头


  共有3258人关注过本帖树形打印复制链接

主题:生成多成表头

帅哥哟,离线,有人找我吗?
刘林
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:14919 威望:0 精华:0 注册:2016/4/28 9:58:00
生成多成表头  发帖心情 Post By:2020/3/14 21:55:00 [只看该作者]

 g.VerticalTotal=True
        Dim dt1 As DataTable = g.Build(True)        
        Dim Book As New XLS.Book '定义一个Excel工作簿        
        Dim Sheet As XLS.Sheet = Book.Sheets(0) '引用工作簿的第一个工作表
        For c As Integer = 0 To dt1.DataCols.Count-1
            Sheet(0, c).Value = dt1.DataCols(c).name
        Next        
        For r As Integer = 0 To dt1.DataRows.Count - 1 '填入数据
            For c As Integer = 0 To dt1.DataCols.Count-1
                Sheet(r +1, c).Value = dt1.datarows(r)(dt1.DataCols(c).name)
            Next
        Next
        Book.Save("c:\人数统计.xls")
        
我想在手机端上导出表,想先生成表,再用a标签打开文件这样来做,现在有个问题请教1:dt1是多层表头,如何生成多成表头EXCel


 回到顶部
帅哥哟,离线,有人找我吗?
sloyy
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2180 积分:13816 威望:0 精华:2 注册:2012/2/25 10:59:00
  发帖心情 Post By:2020/3/14 23:41:00 [只看该作者]

没看懂,在哪里生成表?
自动生成多层表头看帮助

 回到顶部
帅哥哟,离线,有人找我吗?
刘林
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:14919 威望:0 精华:0 注册:2016/4/28 9:58:00
  发帖心情 Post By:2020/3/15 8:35:00 [只看该作者]

后台数据生成临时表导出excle但有多层表头

用dt1.CreateSheetHeader(Sheet) '生成表头

提示不是datable的成员

[此贴子已经被作者于2020/3/15 8:37:10编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107521 积分:546890 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/15 20:36:00 [只看该作者]

这个是table才有的方法。这种情况只能是自己判断列是否是多层表头,然后手工添加多行标题行,并对不是多层表头的进行合并

类似
Dim i As  Integer = 0
For c As Integer = 0 To dt1.DataCols.Count-1
    Dim ar() As String = dt1.DataCols(c).name.split("_")
    If ar.length > i Then i=ar.length
    For j As Integer = 0 To ar.length - 1
        Sheet(j, c).Value = ar(j)
    Next
Next
For r As Integer = 0 To dt1.DataRows.Count - 1 '填入数据
    For c As Integer = 0 To dt1.DataCols.Count-1
        Sheet(r+i +1, c).Value = dt1.datarows(r)(dt1.DataCols(c).name)
    Next
Next
Book.Save("c:\人数统计.xls")

[此贴子已经被作者于2020/3/15 20:37:37编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
刘林
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:14919 威望:0 精华:0 注册:2016/4/28 9:58:00
  发帖心情 Post By:2020/3/15 21:00:00 [只看该作者]

老师:如果是固定的列,可以用合并单元格方式来硬干,但我的dt1生成的列是动态的,生成的EXCEL列也是动态的,这怎么合并


 If e.PostValues("统计分组")="学校"
        gp.Groups.AddDef("学校")
    End If
    If e.PostValues("统计分组")="年级"
        gp.Groups.AddDef("学校")
        gp.Groups.AddDef("年级")
    End If
    If e.PostValues("统计分组")="班级"
        gp.Groups.AddDef("学校")
        gp.Groups.AddDef("年级")
        gp.Groups.AddDef("班级")
    End If
    gp.Groups.AddDef("审核锁定","是否审核")
    If e.PostValues("bjrs")="on"
        gp.Totals.AddDef("姓名",AggregateEnum.Count,"学生人数")
    End If
    If e.PostValues("xsxb")="on"
        gp.Totals.AddExp("性别_男","case when 性别='男' then 1 else 0 end")
        gp.Totals.AddExp("性别_女","case when 性别='女' then 1 else 0 end")
    End If
    If e.PostValues("lsqk")="on"
        gp.Totals.AddExp("留守情况_非留守","case when 留守情况='非留守' then 1 else 0 end")
        gp.Totals.AddExp("留守情况_单亲留守","case when 留守情况='单亲留守' then 1 else 0 end")
        gp.Totals.AddExp("留守情况_双亲留守","case when 留守情况='双亲留守' then 1 else 0 end")
    End If
    If e.PostValues("jdfs")="on"
        gp.Totals.AddExp("就读方式_住校","case when 就读方式='住校' then 1 else 0 end")
        gp.Totals.AddExp("就读方式_走校","case when 就读方式='走校' then 1 else 0 end")
    End If
    If e.PostValues("jcqk")="on"
        gp.Totals.AddExp("就餐情况_早餐","case when 就餐情况='早餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_午餐","case when 就餐情况='午餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_晚餐","case when 就餐情况='晚餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_早午餐","case when 就餐情况='早午餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_早晚餐","case when 就餐情况='早晚餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_午晚餐","case when 就餐情况='午晚餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_早午晚餐","case when 就餐情况='早午晚餐' then 1 else 0 end")
    End If
    If e.PostValues("jkzk")="on"
        gp.Totals.AddExp("残疾人数","case when 健康状况<>'健康或良好' then 1 else 0 end")
    End If
    If e.PostValues("jdlk")="on"
        gp.Totals.AddExp("建档立卡","case when 贫困建档='是' then 1 else 0 end")
    End If
    If e.PostValues("mzqk")="on"
        gp.Totals.AddExp("少数民族","case when 民族<>'汉族' then 1 else 0 end")
    End If
    If e.PostValues("zzmm")="on"
        gp.Totals.AddExp("政治面貌_群众","case when 政治面貌='群众' then 1 else 0 end")
        gp.Totals.AddExp("政治面貌_团员","case when 政治面貌='共且青团员'then 1 else 0 end")
    End If
    If e.PostValues("fkxz")="on"
        gp.Totals.AddExp("户口性质_农村","case when 户口性质='农村' then 1 else 0 end")
        gp.Totals.AddExp("户口性质_城镇","case when 户口性质='城镇'then 1 else 0 end")
    End If
    gp.VerticalTotal=True
    Dim dt1 As DataTable = gp.Build(True)
    For Each r As DataRow In dt1.DataRows
        For Each c As DataCol In dt1.DataCols
            If c.IsNumeric AndAlso r(c.Name)=0
                r(c.name)=Nothing
            End If
        Next
    Next
    Dim Book As New XLS.Book '定义一个Excel工作簿
    Dim Sheet As XLS.Sheet = Book.Sheets(0) '引用工作簿的第一个工作表
    For c As Integer = 0 To dt1.DataCols.Count-1
        Sheet(0, c).Value = dt1.DataCols(c).name
    Next
    For r As Integer = 0 To dt1.DataRows.Count - 1 '填入数据
        For c As Integer = 0 To dt1.DataCols.Count-1
            If dt1.DataCols(c).IsNumeric AndAlso dt1.datarows(r)(dt1.DataCols(c).name)=0
                Sheet(r +1, c).Value=Nothing
            Else
                Sheet(r +1, c).Value = dt1.datarows(r)(dt1.DataCols(c).name)
            End If
        Next
    Next
    Dim fl As String ="C:\web\tb\tb" & e.Cookies("userid") & "人数统表.xls"
    Book.Save(fl)
    With wb.AddActionSheet("","menu") '设计菜单
        .Add("mnuload", "下载表格").Attribute=" & e.Cookies("userid") & "人数统表.xls'"""
        .Add("mnuCancel","取消","",True)
    End With            


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107521 积分:546890 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/15 23:09:00 [只看该作者]

例如

Dim i As  Integer = 0
Dim lst As new List(of Integer)
For c As Integer = 0 To dt1.DataCols.Count-1
    Dim ar() As String = dt1.DataCols(c).name.split("_")
    If ar.Length = 1 Then
        lst.Add(c)
        Sheet(0, c).Value = ar(0)
    Else
        If ar.length > i Then i=ar.length
        For j As Integer = 0 To ar.length - 1
            Sheet(j, c).Value = ar(j)
        Next
    End If
Next

For Each k As Integer In lst
    Sheet.MergeCell(0,k,i,1)
Next
For r As Integer = 0 To dt1.DataRows.Count - 1 '填入数据
    For c As Integer = 0 To dt1.DataCols.Count-1
        Sheet(r+i +1, c).Value = dt1.datarows(r)(dt1.DataCols(c).name)
    Next
Next

 回到顶部
帅哥哟,离线,有人找我吗?
刘林
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:14919 威望:0 精华:0 注册:2016/4/28 9:58:00
  发帖心情 Post By:2020/3/16 7:40:00 [只看该作者]

谢谢老师,我打印下代码码一个一个研究,基本懂起这个意思,这个还是针对一列多行合并可以,我的实例中存在多行多列合并,且是不确定的,想自己研究一下,功力不够还是做不起,请老师指导,谢谢
图片点击可在新窗口打开查看此主题相关图片如下:qq图片20200316073632.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2020/3/16 7:40:31编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
刘林
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:14919 威望:0 精华:0 注册:2016/4/28 9:58:00
  发帖心情 Post By:2020/3/16 7:46:00 [只看该作者]

比如上面第1行3列,到1行16列应合并,第2行15列到3行15列也应合并,我试了下找到相同的内容就合并,但越整越乱,还是只有麻烦老师指导再研究学习

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107521 积分:546890 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/3/16 8:55:00 [只看该作者]

自己写代码生成的表格,也就是说列名是已知的,并不是不确定的,如下所示,这种只能是自己数数哪些单元格是需要合并的,如第1行3列,到1行16列,写死代码好了
    If e.PostValues("jcqk")="on"
        gp.Totals.AddExp("就餐情况_早餐","case when 就餐情况='早餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_午餐","case when 就餐情况='午餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_晚餐","case when 就餐情况='晚餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_早午餐","case when 就餐情况='早午餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_早晚餐","case when 就餐情况='早晚餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_午晚餐","case when 就餐情况='午晚餐' then 1 else 0 end")
        gp.Totals.AddExp("就餐情况_早午晚餐","case when 就餐情况='早午晚餐' then 1 else 0 end")
    End If

如果不写死,看看标题有多少行,每一行都遍历所有列,如果单元格内容相同的就把索引记录下来,然后在合并即可

 回到顶部
帅哥哟,离线,有人找我吗?
刘林
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1942 积分:14919 威望:0 精华:0 注册:2016/4/28 9:58:00
  发帖心情 Post By:2020/3/16 11:57:00 [只看该作者]

因为考虑到手机显示列多了不方便,所以我是做的选择性显示列,所以有的表写不死,遍历我只有试下看整得好不

 回到顶部
总数 21 1 2 3 下一页