以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  统计表导成excel控制小数点后两位,提示错误  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=173565)

--  作者:guosheng
--  发布时间:2021/12/6 10:12:00
--  统计表导成excel控制小数点后两位,提示错误

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看
错误提示什么意思啊?
Dim nms(10000) As String
Dim caps(10000) As String
Dim szs(10000) As Integer
For i As Integer = 0 To Tables("统计表2").Cols.Count - 1
    nms(i) = Tables("统计表2").Cols(i).name
    caps(i) =Tables("统计表2").Cols(i).caption
    szs(i) = 100
Next


Dim dt As Table=Tables("统计表2")
Dim Book As New XLS.Book \'定义一个Excel工作簿
Dim Sheet As XLS.Sheet = Book.Sheets(0) \'引用工作簿的第一个工作表
Dim st As XLS.Style = Book.NewStyle \'日期列的显示格式
st.Format = "yyyy-MM-dd"

Dim nt As XLS.Style = Book.NewStyle \'日期列的显示格式
nt.Format = "0.00"

For c As Integer = 0 To nms.length -1
    Sheet(0, c).Value = caps(c) \'指定列标题
    Sheet.Cols(c).Width = szs(c) \'指定列宽
    If dt.Cols(nms(c)).IsDate Then \'如果是日期列
        Sheet.Cols(c).Style = st \'设置显示格式
    End If
    
    If dt.Cols(nms(c)).IsNumeric  
        Sheet.Cols(c).Style = nt \'设置显示格式
    End If   
Next


For r As Integer = 0 To dt.Rows.Count - 1 \'填入数据
    For c As Integer = 0 To nms.length -1
        If dt.rows(r).IsNull(nms(c)) = False
            If dt.Cols(nms(c)).IsNumeric
                Sheet(r +1, c).Value = round2(dt.rows(r)(nms(c)),2)
            End If
        End If
    Next
Next


--  作者:有点蓝
--  发布时间:2021/12/6 10:22:00
--  
关闭退出项目,删除项目所在的文件夹里的bin目录,然后重启项目试试。

调试技巧:http://www.foxtable.com/webhelp/scr/1485.htm,看哪一句代码出错

--  作者:guosheng
--  发布时间:2021/12/6 10:52:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:22png.png
图片点击可在新窗口打开查看
在执行表头循环时就报错了。
For c As Integer = 0 To nms.length -1
    Sheet(0, c).Value = caps(c) \'指定列标题
    Sheet.Cols(c).Width = szs(c) \'指定列宽
    \'If dt.Cols(nms(c)).IsDate Then \'如果是日期列
        \'Sheet.Cols(c).Style = st \'设置显示格式
    \'End If
    
    \'If dt.Cols(nms(c)).IsNumeric
        \'Sheet.Cols(c).Style = nt \'设置显示格式
    \'End If
Next

--  作者:guosheng
--  发布时间:2021/12/6 15:23:00
--  
生成excel表头时提示 超出最大列数 256,什么意思啊?
--  作者:有点蓝
--  发布时间:2021/12/6 15:25:00
--  
定义的数组长度是10000也,Dim nms(10000) As String

For c As Integer = 0 To nms.length -1  -- 也就是nms.length -1= 9999

--  作者:有点蓝
--  发布时间:2021/12/6 15:26:00
--  
改为
Dim nms(Tables("统计表2").Cols.Count - 1) As String

--  作者:guosheng
--  发布时间:2021/12/6 16:25:00
--  
用代码填充导出的excel的表头都是单层的:2021年4月_指标1   2021年4月_指标2    2021年4月_指标3
如何改成多层表头啊?显示为:       2021年4月
                                           指标1   指标2    指标3
[此贴子已经被作者于2021/12/6 16:25:30编辑过]

--  作者:有点蓝
--  发布时间:2021/12/6 17:00:00
--  
这个比较麻烦,根据下划线拆分,然后分别填入上下2行的单元格,判断刚刚填入的第一行的单元格如果和左边的单元格内容一样就合并:http://www.foxtable.com/webhelp/topics/1153.htm
--  作者:guosheng
--  发布时间:2021/12/6 17:13:00
--  
是在表头生成的时候做判断,才能使表头由一层变成两层啊?excel的代码操作不太会啊,多谢了
Dim dt As Table=Tables("统计表2")

Dim nms(dt.Cols.Count -1) As String    \'列名称
Dim caps(dt.Cols.Count-1) As String    \'列标题
Dim szs(dt.Cols.Count-1) As Integer
For i As Integer = 0 To Tables("统计表2").Cols.Count - 1
    nms(i) = Tables("统计表2").Cols(i).name    
    caps(i) =Tables("统计表2").Cols(i).caption
    szs(i) = 100
Next

For c As Integer = 0 To nms.length -1
    Sheet(0, c).Value = caps(c) \'指定列标题
    Sheet.Cols(c).Width = szs(c) \'指定列宽
    If **********  这里加个什么判断进行表头处理啊?

    End If
Next

--  作者:有点蓝
--  发布时间:2021/12/6 17:38:00
--  
For c As Integer = 0 To nms.length -1
dim ar() as string = caps(c) .split("_")
    Sheet(0, c).Value = ar(0)  \'指定列标题
if  ar.length = 2 then 
 Sheet(1, c).Value = ar(1) 
end if
    Sheet.Cols(c).Width = szs(c) \'指定列宽
    If **********  这里加个什么判断进行表头处理啊?

    End If
Next