以文本方式查看主题

-  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=175231)

--  作者:zcgmxf
--  发布时间:2022/2/24 14:56:00
--  [求助] 导出Excel时合并单元格
老师,如何实现导出时所有编号相同的自动合并?谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:采样单.xls



--  作者:有点蓝
--  发布时间:2022/2/24 15:00:00
--  
使用什么方式导出的?


--  作者:zcgmxf
--  发布时间:2022/2/24 16:40:00
--  
老师,可能是WPS干扰,合并模式不能保存。不知道黄色代码怎么循环。谢谢!

Dim dt As Table = Tables("核酸采样明细")
Dim nms() As String = {"试 管编号","姓名","证件编号","联系电话","检测结果","采样日期","检测机构"} \'要导出的列名
Dim caps() As String = {"试 管编号","姓名","证件号码","联系电话","核酸检测结果(阴性/阳性)","核酸检测时间","核酸检测机构"} \'要导出的列名
Dim szs() As Integer = {150,120,200,150,200,200,280} \'对应的列宽
Dim Book As New XLS.Book \'定义一个Excel工作簿
Dim Sheet As XLS.Sheet = Book.Sheets(0) \'引用工作簿的第一个工作表
Dim Style As XLS.Style = Book.NewStyle() \'定义新样式
Style.AlignHorz = XLS.AlignHorzEnum.Center
Style.AlignVert = XLS.AlignVertEnum.Center
Dim drs As List(of DataRow) = DataTables("核酸采样明细").Select("试 管编号 = \'" & dt.Current("试 管编号") & "\'")
Dim n As Integer = drs.Count 
Sheet.MergeCell(n,0,drs.Count,1)
Dim st As XLS.Style = Book.NewStyle \'日期列的显示格式
st.For mat = "yyyy-MM-dd hh:mm"
Fo r 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
    Sheet.Cols(c).Style = Style
Next
Fo r r As Integer = 0 To dt.Rows.Count - 1 \'填入数据
    Sheet.Rows(r).Height = 38
    F or c As Integer = 0 To nms.length -1
        Sheet(r +1, c).Value = dt.rows(r)(nms(c))
        Dim s As String = Sheet(r+1, 3).Value
        Sheet(r+1, 3).Value = s.Replace("(-)","")
    Next
Next
Dim dlg As New SaveFileDialog \'定义一个新的SaveFileDialog 
dlg.Filter= "Excel文件|*.xls" \'设置筛选器
If dlg.ShowDialog = DialogResult.Ok Then \'如果用户单击了确定按钮
     Tables("核酸采样明细").SaveExcel(dlg.FileName, "核酸检测采样表")  \'保存文件
    Dim Proc As New Process
    Proc.File = dlg.FileName
    Proc.Start()
End If

--  作者:有点蓝
--  发布时间:2022/2/24 16:47:00
--  
去掉黄色代码

dim idx as integer = 0
Fo r r As Integer = 0 To dt.Rows.Count - 1 \'填入数据
    Sheet.Rows(r).Height = 38
    F or c As Integer = 0 To nms.length -1
if r > 0 then
if dt.rows(r)(“试 管编号”) <> dt.rows(r-1)(“试 管编号”) then
Sheet.MergeCell(idx,0,r-idx,1)
idx = r
end if
end if
        Sheet(r +1, c).Value = dt.rows(r)(nms(c))
        Dim s As String = Sheet(r+1, 3).Value
        Sheet(r+1, 3).Value = s.Replace("(-)","")
    Next
Next

--  作者:zcgmxf
--  发布时间:2022/2/25 14:33:00
--  
老师,要加上一行黄色代码,不然最后一组相同编号的不合并,不知有没有更好的办法。谢谢!

Dim idx As Integer = 0
For r As Integer = 0 To dt.Rows.Count - 1 \'填入数据
    Sheet.Rows(r+1).Height = 38
    For c As Integer = 0 To nms.length -1
        Sheet(r +1, c).Value = dt.rows(r)(nms(c))
        Dim s As String = Sheet(r+1, 3).Value
        Sheet(r+1, 3).Value = s.Replace("(-)","")
        If r > 0 Then
            If dt.rows(r)("试 管编号") <> dt.rows(r-1)("试 管编号") Then
                Sheet.MergeCell(idx+1,0,r-idx,1)
                idx = r
            End If
                Sheet.MergeCell(idx+1,0,r-idx+1,1)
        End If
    Next
Next
[此贴子已经被作者于2022/2/25 14:33:17编辑过]

--  作者:有点蓝
--  发布时间:2022/2/25 14:51:00
--  
只能这样