以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]统计表导出并生成图表问题2  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=176979)

--  作者:cqlpjks
--  发布时间:2022/5/5 16:31:00
--  [求助]统计表导出并生成图表问题2
执行结果:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:2019级二诊市区目标对比表.xls

Dim tjnj As String = 2019
Dim tjlb As String = "二诊"
Dim dwls() As String = {"分数线","全区合计"}
Dim dlg As New SaveFileDialog \'定义一个新的SaveFileDialog
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
    \'生成图表
    Dim Chart As New ChartBuilder \'定义一个图表变量
    Dim Series As WinForm.ChartSeries \'定义一个图系变量
    Dim t As Table = Tables(tjnj &"级"& tjlb & "市区目标对比") \'定义一个变量t引用数据表
    Chart.ChartType = ChartTypeEnum.Bar \'图表类型改为Bar(条形)
    Chart.SeriesList.Clear() \'清除图表原来的图系
    Dim xms() As String = {"分数线","全区合计","梁平中学","红旗中学","梁平一中","西大实中","屏锦中学","袁驿中学","福禄中学"}
    Dim nms2() As String = {"物理类","历史类","合计"}
    Dim dhs() As String = {"重点","本科","专科"}
    Dim nms3() As String = {"区级","市级"}
    For r As Integer = 0 To nms3.Length - 1 \'横坐标开始列位置,从区级开始
        Series = Chart.SeriesList.Add() \'增加一个图系
        Series.Text = nms3(r) \'设置图系的标题
        series.length = xms.Length * nms2.Length * dhs.Length
        For k As Integer = 0 To xms.Length - 1
            For i As Integer = 0 To nms2.Length - 1
                For j As Integer = 0 To dhs.Length - 1
                    Series.X(k*nms2.Length+j) = k*nms2.Length+j
                    Series.Y(k*nms2.Length+j) = val(t.Compute("sum(" & nms2(i) & dhs(j) & nms3(r) & ")", "单位 = \'" & xms(k) & "\'"))
                    Chart.AxisX.SetValueLabel(k*dhs.Length+j, xms(k) & nms2(i) & dhs(j))
                Next
            Next
        Next
        series.DataLabelCompass = LabelCompassEnum.North
        Series.DataLabelText = "{#YVAL}"
    Next
    Chart.AxisX.AnnoWithLabels = True \'启用字符标示
    Chart.AxisX.AnnoRotation = - 45 \'X轴标示逆时针旋转45度
    Chart.LegendVisible = True \'显示图列
    Chart.LegendCompass= CompassEnum.South \'图列显示在南方(底端)
    Chart.AxisX.Text = "类别:" & tjlb
    chart.LegendText = "图例:市区级"
    Chart.BarClusterWidth = 80
    Chart.AxisY.Text = "重点人数"
    Chart.PrintWidth = 360
    Chart.PrintHeight = 180
    \'保存文件
    t.SaveExcel(dlg.FileName, tjnj &"级"& tjlb & "市区目标对比") \'保存文件
    Dim b As New XLS.Book(dlg.FileName)
    Dim s As XLS.Sheet = b.Sheets(tjnj &"级"& tjlb & "市区目标对比")
    s(t.rows.Count + 3,1).Value = New XLS.Picture(Chart.Image)
    Dim Style As Xls.Style = b.NewStyle \'新建一个样式
    \'单元格内容自动换行
    Style.WordWrap = XLS.LineStyleEnum.Thin \'单元格内容自动换行
    \'加网格线
    Style.AlignHorz = XLS.AlignHorzEnum.Center \'居中
    Style.AlignVert = XLS.AlignVertEnum.Center \'居中
    Style.BorderTop = XLS.LineStyleEnum.Thin \'上边框
    Style.BorderBottom = XLS.LineStyleEnum.Thin \'下边框
    Style.BorderLeft = XLS.LineStyleEnum.Thin \'左边框
    Style.BorderRight = XLS.LineStyleEnum.Thin \'右边框
    \'上下左右边框颜色
    Style.BorderColorTop = Color.Black \'黑色
    Style.BorderColorBottom = Color.Black
    Style.BorderColorLeft = Color.Black
    Style.BorderColorRight = Color.Black
    For i As Integer = 0 To s.Rows.count -2
        For n As Integer = 0 To s.Cols.count -1
            s(i,n).Style = Style
        Next
    Next
    \'符合条件的行字体变红加粗
    Style  = b.NewStyle
    Style.ForeColor = Color.Red \'样式的字体颜色设为红色
    Style.Font = new font("宋体",9,FontStyle.Bold) \'宋体,9号,加粗
    Style.AlignHorz = XLS.AlignHorzEnum.Center \'居中
    Style.AlignVert = XLS.AlignVertEnum.Center \'居中
    Style.BorderTop = XLS.LineStyleEnum.Thin \'上边框
    Style.BorderBottom = XLS.LineStyleEnum.Thin \'下边框
    Style.BorderLeft = XLS.LineStyleEnum.Thin \'左边框
    Style.BorderRight = XLS.LineStyleEnum.Thin \'右边框
    \'上下左右边框颜色
    Style.BorderColorTop = Color.Black \'黑色
    Style.BorderColorBottom = Color.Black
    Style.BorderColorLeft = Color.Black
    Style.BorderColorRight = Color.Black
    For i As Integer = 0 To s.Rows.count -1
        Dim Hjs() As String = {"分数线","全区合计"}
        For Each Hj As String In Hjs
            If s(i,2).Text.EndsWith(Hj) Then \'如果指定列(sheet(i,2)第3列单位中含Hj字符存在
                For n As Integer = 0 To s.Cols.count -1
                    s(i,n).Style = Style
                Next
            End If
        Next
    Next
    b.Save(dlg.FileName)
    \'DataTables.Delete( tjnj &"级"& tjlb & "市区目标对比")
End If

导出后生成的图表怎么重叠("物理类","历史类","合计")了,只显示了“合计”栏的图表,如何修改代码?请指教。谢谢!
[此贴子已经被作者于2022/5/5 16:32:32编辑过]

--  作者:有点蓝
--  发布时间:2022/5/5 16:39:00
--  
请上传实例测试,请提供窗口图表控件的测试例子
--  作者:cqlpjks
--  发布时间:2022/5/5 16:56:00
--  
测试事例:
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:市区目标对比表.rar

窗口1,“导出并生成图表”按钮
[此贴子已经被作者于2022/5/5 16:58:25编辑过]

--  作者:有点蓝
--  发布时间:2022/5/5 17:14:00
--  
实际需要什么效果?
--  作者:cqlpjks
--  发布时间:2022/5/5 17:22:00
--  
市区目标对比表:
图片点击可在新窗口打开查看此主题相关图片如下:市区目标对比表.png
图片点击可在新窗口打开查看
只显示了红色部分的“合计”栏的图表,"物理类","历史类"都要显示。
[此贴子已经被作者于2022/5/5 17:22:08编辑过]

--  作者:有点蓝
--  发布时间:2022/5/5 17:24:00
--  
重叠了,不是没有显示,我要搞清楚实际效果是怎么样的,手绘截图说明一下
--  作者:cqlpjks
--  发布时间:2022/5/6 10:11:00
--  
市区目标对比导出图表结果:
图片点击可在新窗口打开查看此主题相关图片如下:市区目标对比图表结果.png
图片点击可在新窗口打开查看
Excel表:
图片点击可在新窗口打开查看此主题相关图片如下:excel表.png
图片点击可在新窗口打开查看
统计表中的专科(红色部分)不需要图表显示。

--  作者:有点蓝
--  发布时间:2022/5/6 10:15:00
--  
Dim dhs() As String = {"重点","本科"}
--  作者:cqlpjks
--  发布时间:2022/5/6 10:21:00
--  
要求的图表显示是7楼上图。
    For r As Integer = 0 To nms3.Length - 1 \'横坐标开始列位置,从区级开始
        Series = Chart.SeriesList.Add() \'增加一个图系
        Series.Text = nms3(r) \'设置图系的标题
        series.length = xms.Length * nms2.Length * dhs.Length
        For k As Integer = 0 To xms.Length - 1
            For i As Integer = 0 To nms2.Length - 1
                For j As Integer = 0 To dhs.Length - 1
                    Series.X(k*nms2.Length+j) = k*nms2.Length+j
                    Series.Y(k*nms2.Length+j) = val(t.Compute("sum(" & nms2(i) & dhs(j) & nms3(r) & ")", "单位 = \'" & xms(k) & "\'"))
                    Chart.AxisX.SetValueLabel(k*dhs.Length+j, xms(k) & nms2(i) & dhs(j))
                Next
            Next
        Next
        series.DataLabelCompass = LabelCompassEnum.North
        Series.DataLabelText = "{#YVAL}"
    Next
如何修改代码?

--  作者:有点蓝
--  发布时间:2022/5/6 10:29:00
--  
试试

                   Series.X(k*nms2.Length*dhs.length+j) = k*nms2.Length*dhs.length+j
                    Series.Y(k*nms2.Length*dhs.length+j) = val(t.Compute("sum(" & nms2(i) & dhs(j) & nms3(r) & ")", "单位 = \'" & xms(k) & "\'"))
                    Chart.AxisX.SetValueLabel(k*nms2.Length*dhs.length+j, xms(k) & nms2(i) & dhs(j))