使用.Net在Excel工作表中错开列

vtwuwzda  于 2023-06-07  发布在  .NET
关注(0)|答案(1)|浏览(364)

我正在开发一个小的VB.Net应用程序,它将根据来自数据库的几个查询生成Excel工作簿。我有一个查询,它返回一个包含日期(Outage_Date)、ID(ID)和问题类型(Issue_Type)的数据表。我试图根据ID和问题类型将这些问题放在交错的列中,但我很难想出这样做的逻辑。
datatable看起来像这样:

Outage_Date  ID    Issue_Type  
1/1/2010     123   Start
2/5/2010     456   Start
3/17/2011    123   Minor
1/2/2012     123   Major
9/25/2012    456   Major
10/5/2012    456   Minor

输出应该如下所示:

Date         123     456
1/1/2010     Start   
2/5/2010             Start
3/17/2011    Minor
1/2/2012     Major
9/25/2012            Major
10/5/2012            Minor

我如何以编程方式实现这一点?

t2a7ltrp

t2a7ltrp1#

此方法使用LINQ to DataSet来查询DataTable,假设为Option Infer On,并且是代码和伪代码的混合!我不知道你用什么来构建Excel电子表格,所以我根据ClosedXML语法编写了这部分。这也是未经测试的,所以让我知道它是如何工作的-希望它足以为您指出正确的方向,虽然可能有更优雅的解决方案!

' Build a list of the IDs
Dim ids = datatable.AsEnumberable() _
    .Select(Function(dr) dr.Field(Of Integer)("ID")) _
    .Distinct() _
    .OrderBy(Function(x) x) _
    .ToList()
' Headings
Dim row = 1, col = 1
worksheet.Cell(row, col).Value = "Date"
For Each id In ids
    col += 1
    worksheet.Cell(row, col).Value = CStr(id)
Next
' Data Values
For Each dr In datatable.Rows
    row += 1
    col = 1
    worksheet.Cell(row, col).Value = dr.Field(Of Date)("Outage_Date")
    col += 1
    ' Work out how many columns to shift the issue type over
    Dim offset = ids.IndexOf(dr.Field(Of Integer)("ID"))
    col += offset
    worksheet.Cell(row, col).Value = dr.Field(Of String)("Issue_Type")
Next

相关问题