获取 Excel 文件前 7 列中的最后一行,忽略所有格式

问题描述 投票:0回答:1

我正在编写从 Word 文件读取内容并将其提取到 Excel 文件的代码。它需要从最后一行开始填充文件。

问题是只有前 7 列是相关的,通常第 8 列中有数据。你能帮我弄清楚要编写什么代码来检查前 7 列中的最后一行吗?

它还必须忽略所有格式,仅检查文本。我会坚持使用 openxml,我想避免使用 Excel 互操作。

提前致谢!
罗伯特

foreach (var row in sheetData.Elements<Row>().Reverse())
{
    for (int i = 0; i < 7; i++) // Only check the first 7 columns
    {
        var cell = row.Elements<Cell>().ElementAtOrDefault(i);

        if (HasText(cell, workbookPart))
        {
            lastRowIndex = row.RowIndex.Value;
            Console.WriteLine(lastRowIndex);
            break;
        }
    }

    if (lastRowIndex != 0)
        break;
} 

private bool HasText(Cell cell, WorkbookPart workbookPart)
{
    if (cell == null) 
        return false;

    if (cell.DataType != null && cell.DataType == CellValues.SharedString)
    {
        int sharedStringIndex = int.Parse(cell.CellValue.InnerText);
        SharedStringItem item = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(sharedStringIndex);
        return !string.IsNullOrEmpty(item.InnerText);
    }

    return !string.IsNullOrEmpty(cell.CellValue?.InnerText);
}

这就是我得到的,但它不仅不会因某种原因忽略格式,而且还会检查工作表中的每一列

c# excel visual-studio-code openxml
1个回答
0
投票

方法一(M1)

Sub method1_preferred():
        ReDim res(1 To 8)
        For i = 1 To 8
            c_ = ActiveCell.Column + (i - 1)
            lr = ActiveSheet.Cells.SpecialCells(xlLastCell).Row
            For r_ = lr To 1 Step -1
                If Len(ActiveSheet.Cells(r_, c_).Value) > 0 Then
                    res(i) = r_
                    Exit For
                End If
            Next
            If res(i) = 0 Then res(i) = 0 'in case col empty - remove as req.'
        Next 
        MsgBox "row counts: " & Join(res, ", ")
    End Sub

output


M2

Sub method2_sloppy()
    Application.ScreenUpdating = False
    nm = ActiveSheet.Name
    Sheets.Add
    ActiveCell.Formula2R1C1 = _
        "=TEXTJOIN("","",1,BYCOL(" & nm & "!C:C[7],LAMBDA(a_,MAX(FILTER(SEQUENCE(ROWS(a_)),--(a_<>""""))))))"
    res = ActiveCell.Value
    ActiveSheet.Delete
    Application.ScreenUpdating = True
    MsgBox ("rel vals: " & CStr(res))
    
End Sub

运行此命令时,您的活动单元格必须是感兴趣的 8 个连续列的第一列。

需要 Office 365 兼容版本的 Excel。

据我所知,不直接使用此函数进行评估的原因是因为它不能很好地与非遗留/动态函数配合使用。


奖金

对于您为其创建名称的任何 lambda 函数也是如此

=LAMBDA(rng_,BYCOL(rng_,LAMBDA(a_,MAX(FILTER(SEQUENCE(ROWS(a_)),--(a_<>""))))))

如果你给它命名为“get_row_count”如何?那么你可以简单地在Excel中计算任何8个连续的列(例如a:g),即

get_row_count(a:g)
在Excel中工作得很好,但在VB中,
Evaluate("=get_row_count(C:C[6])")
返回
Error 2015 
.


注释:利用gpt来测试不同的情况/上面的所有代码都是我的工作。

̿̿ ̿̿ ̿̿ ̿’̿’\̵͇̿̿\З= ( ▀ ͜͞ʖ▀) =Ε/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿


© www.soinside.com 2019 - 2024. All rights reserved.