使用 C# 选择、复制并重新插入一系列 Excel 行



使用 C#替换 Delphi 中现有的、现已失效的遗留例程,我一直在尝试在 C# 中重新开发一个在 Delphi 7 中运行良好的例程,该例程将打开我的 30 个 Excel 文件中的每一个,选择每个文件中的最后 22 行,复制它们,然后将它们重新插入到各自的文件中。

例如,我发现最后一行,2019 年 8 月有 22 个工作日,所以我从最后一行开始我的范围 22 行。

使用 Excel 文件,我想选择范围从A4157A4178的行。 然后,我想获取我复制的行并将它们插入第A4156行之后或第A4157行之前。然后,我单独列出 8 月的日期,并将它们写到从A4178A4200的较低 22 个中的每一个。然后 7 月结束,8 月的行已准备就绪。

我保留最后一行,因为同一工作簿中其他工作表上的其他计算引用数据的最后一行,并且它们将以这种方式自动从A4178索引到A4200

当月进行每个条目时,其数据将向下复制到最后一行,因此最后一行始终是最新的。 工作簿中的另一个工作表在其摘要中使用最新数据。

到目前为止,我可以打开 Excel 工作簿并获得正确的工作表。

以下内容确实突出显示了正确的行,但我收到运行时错误。我不确定这意味着什么。

我已经注释掉了"选择"行并以相同的结果运行"复制"行。 我现在进入了第二周,试图解决这个问题。 如果可能的话,我需要一个功能正常的例程的例子。 指向 C# - MS 接口文本的链接将是一个很大的帮助。

Excel.Range selectRange = excelWorkSheet.Range[excelWorkSheet.Cells[A4157], excelWorkSheet.Cells[A4178].select;
Excel.Range copyRange = excelWorkSheet.Range[excelWorkSheet.Cells[A4157], excelWorkSheet.Cells[A4178]].select;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: '无法隐式将类型'bool'转换为'Microsoft.Office.Interop.Excel.Range''

我不是 100% 清楚你想要的最终工作表。 但我认为你正在尝试做这样的事情。

// In your example startRow = 4157 and lastRow = 4178.
// Get the rows to copy (rows 4157 to 4178 in your example).
Excel.Range copyRange = excelWorkSheet.Rows[startRow + ":" + lastRow];
// Insert enough new rows to fit the rows we're copying.
copyRange.Insert(Excel.XlInsertShiftDirection.xlShiftDown);
// The copied data will be put in the same place (starting at row 4157 in
// your example).
Excel.Range dest = excelWorkSheet.Rows[startRow + ":" + lastRow];
copyRange.Copy(dest);

看看 Epplus。 https://github.com/JanKallman/EPPlus。它以 Nuget 包的形式提供。

Github Wiki 中有一个教程和一个示例应用程序,可以练习许多功能。

最新更新