我正在编写从 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);
}
这就是我得到的,但它不仅不会因某种原因忽略格式,而且还会检查工作表中的每一列
方法一(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
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来测试不同的情况/上面的所有代码都是我的工作。
̿̿ ̿̿ ̿̿ ̿’̿’\̵͇̿̿\З= ( ▀ ͜͞ʖ▀) =Ε/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿