第一部分
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 对象以避免内存泄漏。