xxtx

83 阅读2分钟

第一部分

Private Sub Output(dt1 As DataTable, dt2 As DataTable, dt3 As DataTable, filepath As String, outputType As EnumOutputType)
    Dim excelApp As Application = Nothing
    Dim workbook As Workbook = Nothing
    Dim templateSheet As Worksheet = Nothing
    Dim newSheet As Worksheet = Nothing
    Dim range As Range = Nothing

    Try
        ' 初始化 Excel 应用程序
        excelApp = New Application With {
            .Visible = False,
            .DisplayAlerts = False
        }

        ' 创建新的工作簿
        workbook = excelApp.Workbooks.Add(filepath)

        ' 获取模板工作表(假设模板工作表在工作簿的第3个位置)
        templateSheet = DirectCast(workbook.Sheets(3), Worksheet)

        Dim nichiji = Now

        ' 获取所有唯一的工番值
        Dim values1 = dt1.AsEnumerable().Select(Function(row) row.Field(Of String)("KOUBAN_NO"))
        Dim values2 = dt2.AsEnumerable().Select(Function(row) row.Field(Of String)("KOUBAN_NO"))
        Dim values3 = dt3.AsEnumerable().Select(Function(row) row.Field(Of String)("KOUBAN_NO"))
        Dim allValues = values1.Concat(values2).Concat(values3)
        Dim uniqueValues = allValues.Distinct().ToList()

        ' 按工番 KOUBAN_NO 分组
        Dim groups1 = dt1.Rows.OfType(Of DataRow).GroupBy(Function(p) p.Field(Of String)("KOUBAN_NO"))
        Dim groups2 = dt2.Rows.OfType(Of DataRow).GroupBy(Function(p) p.Field(Of String)("KOUBAN_NO"))
        Dim groups3 = dt3.Rows.OfType(Of DataRow).GroupBy(Function(p) p.Field(Of String)("KOUBAN_NO"))

        ' 对每个唯一的工番值进行处理
        For Each uniqueValue In uniqueValues
            ' 获取各组的数据
            Dim group1 = groups1.Where(Function(g) g.Key = uniqueValue).FirstOrDefault()
            Dim group2 = groups2.Where(Function(g) g.Key = uniqueValue).FirstOrDefault()
            Dim group3 = groups3.Where(Function(g) g.Key = uniqueValue).FirstOrDefault()

            ' 复制模板工作表并将其添加到工作簿的末尾
            templateSheet.Copy(After:=workbook.Sheets(workbook.Sheets.Count))
            newSheet = DirectCast(workbook.Sheets(workbook.Sheets.Count), Worksheet)
            newSheet.Name = $"{uniqueValue}"

            ' 使用 WriteData 方法将数据写入新工作表
            WriteData(excelApp, newSheet, range, nichiji, group1, group2, group3)
        Next

        ' 删除最前面6个工作表
        Dim wsCount As Integer = workbook.Sheets.Count
        If wsCount > 6 Then
            ' 只有当工作表总数大于6时才进行删除操作
            For i As Integer = 1 To 6
                DirectCast(workbook.Sheets(1), Worksheet).Delete()
            Next
        End If

        ' 根据 outputType 设置 Excel 的可见性
        Select Case outputType
            Case EnumOutputType.Excel
                excelApp.Visible = True
                excelApp.WindowState = XlWindowState.xlMaximized
                DirectCast(workbook.Sheets(1), Worksheet).Activate()
        End Select
    Catch ex As Exception
        ' 处理异常
        Throw
    Finally
        ' 释放 COM 对象
        Utils.ReleaseComObject(range)
        Utils.ReleaseComObject(templateSheet)
        Utils.ReleaseComObject(newSheet)
        Utils.ReleaseComObject(workbook)
        Utils.ReleaseComObject(excelApp)
    End Try
End Sub

主要修改

  • 初始化 Excel 应用程序: 初始化 Excel 应用程序,设置其为不可见,并且禁用警告对话框。
  • 创建新的工作簿: 创建新的工作簿,并获取模板工作表(假设它位于工作簿的第3个位置)。
  • 获取所有唯一的工番值: 从数据表中获取所有的工番值,并去重得到唯一的工番值列表。
  • 按工番 KOUBAN_NO 分组: 对数据表进行分组,以工番 KOUBAN_NO 为键进行分组。
  • 对每个唯一的工番值进行处理: 为每个唯一的工番值创建一个新工作表,并将数据写入该工作表。
  • 删除最前面6个工作表: 如果工作表数量大于6,删除最前面6个工作表。
  • 根据 outputType 设置 Excel 的可见性: 根据 outputType 设置 Excel 应用程序的可见性,并最大化窗口。
  • 释放 COM 对象: 释放所有创建的 COM 对象以避免内存泄漏。