Foxtable(狐表)用户栏目专家坐堂 → [求助]交叉统计表表头的显示


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

主题:[求助]交叉统计表表头的显示

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]交叉统计表表头的显示  发帖心情 Post By:2018/2/27 18:46:00 [显示全部帖子]

有一个交叉统计表,列数很多,行数也很多。如下图,一年有12个月,如果要打三年的,可能就得36列,行数也可能有100行以上
表头有两行。

在打印预览的时候,表名在第一页预览的时候看不到,可能要到第N页才会显示表名
第二行的分店号,在第一页预览可见,但其它的页就看不到了。

模板该如何设置,才能保证预览的时候,在每一页上都可以看到表名和分店号这两行呢?


图片点击可在新窗口打开查看此主题相关图片如下:交叉表表头png.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2018/2/27 18:46:22编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/2/27 22:39:00 [显示全部帖子]

输出报表本身没有问题。
问题是列很多以后,指定页首行(多行),列翻页以后,表头就看不到了。附件中的报表有两个问题 
1、5-8页,是列翻页以后的报表,表名和表头看不到;而且5-8页的列翻页之后,客户列并没有显示出来。
2、1-4页,表名显示的位置并未在打印预览页面上居中。

我是想翻页打印的时候,多行表头的信息都能看到。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:交叉统计打印.zip


[此贴子已经被作者于2018/2/27 22:42:49编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/2/27 23:06:00 [显示全部帖子]

能用代码的方式设计吗?
因为交叉统计表的列是不固定的。
例如随着年份的增加,有时候可能是13列(其中一列是客户列),有时候可能是25列(2年),有时候可能是37列(3年的数据)

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/2/28 14:53:00 [显示全部帖子]

动态列的问题解决了,现在模板中设置了标题行和标题列重复,但在输出报表的时候,这个设置不起作用。

Dim fl As String = ProjectPath & "attachments/kk.xls"
Dim f As String = ProjectPath & "attachments/test.xls"
FileSys.CopyFile(fl, f, True)
Dim App As New MSExcel.Application
Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(f)
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
ws.Range("C1:D6").Copy
Dim t As Table = Tables("kk")
Dim idx As Integer = 5
For i As Integer = 1 To t.Cols.count-1 Step 2
    If i < t.Cols.count-3 Then
        ws.Range("C1:D6").Copy
        ws.cells(1,idx).Insert(MSExcel.XlDirection.xlToRight)  '将相应的单元格右移  -------这个为什么是1?从表面上看,它是在第一行的idx列插入列。看帮助里,似乎应当是

  • Dim App As New MSExcel.Application
    Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open("D:\Report.xls")
    Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
    Dim Rg As MSExcel.Range = Ws.Range("A10")  '以这个指定的单元格为基准
    Rg.EntireRow.Insert(MSExcel.XlInsertShiftDirection.xlShiftDown)'在基准单元格上面插入一行
    Rg.EntireColumn.Insert(MSExcel.XlInsertShiftDirection.xlShiftToRight)  '在基准单元格左边插入一列
    App.Visible = True


    End If

    ws.cells(3,idx-2).value = t.Cols(i).caption.split("_")(0)
    ws.cells(5,idx-2).value = "[" & t.Cols(i).name & "]"
    ws.cells(5,idx-1).value = "[" & t.Cols(i+1).name & "]"
    idx += 2
Next

app.visible = True

[此贴子已经被作者于2018/2/28 14:56:18编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/3/1 22:06:00 [显示全部帖子]

再请教一下。
可以用8楼的方法形成交叉表的动态列。然后把表头的标题行、左侧标题列插入到模板中。

问题是:
假如左侧标题列是2列,然后交叉表的动态列是15列,每页显示8列的话。
那么,总共会显示3页,前两页每页有8列,第三页只有5列了,那么页面的右边就会空3列的空间出来。用什么方法可以使余下的三列划边框线,但不填充数据?

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/3/1 23:49:00 [显示全部帖子]

填充完以后,还要把多余的16-18列的标题行文字清掉

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/3/2 22:40:00 [显示全部帖子]

还有问题请教。
1、动态列的时候,可能会超出一页打印的宽度范围。这时候就要复制标题列到第二页、第三页的左侧。
2、假如标题列有三列,列宽分别是100,150,200,动态列的宽度可以是固定的,比如动态列的度宽为80
那么,如何保证复制的标题列到第二页、第三页、第……页的时候,列宽保证跟第一页相同呢?

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/3/2 23:16:00 [显示全部帖子]

假设标题列是B1:D7。
VBA如何让它复制到某一个区域去,然后让这个区域各列的列宽与B1:D7的列宽分别相同?


搞定。
[此贴子已经被作者于2018/3/3 0:05:34编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2198 积分:18058 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/3/3 14:13:00 [显示全部帖子]

继续。
用了模板以后,可能会因为列宽的偏差累计,复制的标题列会出现到下一页的第2列中,甚至第3页中。

所以,应当在复制的标题列的前一列强制换页。
强制分页能否在模板中设置?

Dim Book As New XLS.Book("c:\reports\test.xls") '定义一个Excel工作簿
Dim
Sheet As XLS.Sheet = Book.Sheets(0) '引用工作簿的第一个工作表
Dim
Style As XLS.Style = Book.NewStyle() '定义新样式
Style.ForeColor = Color.Red
'设置样式的字体颜色
Sheet.Cols(
0).Width = 120 '设置第1列的宽度
Sheet.Cols(
0).Style = Style '设置第1列的样式
Sheet.Cols(
4).PageBreak = True '在第5列处强制分页
Book.Save(
"c:\reports\test.xls")
Dim
Proc As New Process
Proc.File =
"c:\reports\test.xls"
Proc.Start()



试了一下,用    ws.cells(1,N ).PageBreak = True也可以哟。
[此贴子已经被作者于2018/3/3 14:17:58编辑过]

 回到顶部