使用 Interop 从 Excel 获取最后一个非空列和行索引

2023-12-26

我正在尝试使用互操作库从 Excel 文件中删除所有多余的空白行和列。

我关注了这个问题使用 Interop 从 Excel 文件中删除空行和空列的最快方法 https://stackoverflow.com/questions/40574084/fastest-method-to-remove-empty-rows-and-columns-from-excel-files-using-interop我发现这很有帮助。

但我的 Excel 文件包含一小部分数据,但有很多空行和列(从最后一个非空行(或列)到工作表的末尾)

我尝试循环行和列,但循环需要几个小时。

我正在尝试获取最后一个非空行和列索引,以便我可以删除一行中的整个空范围

XlWks.Range("...").EntireRow.Delete(xlShiftUp)

注意:我试图获取包含数据的最后一行以删除所有额外的空白(在此行或列之后)

有什么建议么?


注意:代码必须兼容SSIS脚本任务环境


Update 1

如果您的目标是使用 c# 导入 Excel 数据,假设您已确定工作表中使用率最高的索引(在您发布的图片中,Col = 10,Row = 16),您可以将最大使用索引转换为字母,这样它将是J16并使用 和 仅选择使用的范围OLEDBCommand

SELECT * FROM [Sheet1$A1:J16]

否则,我认为找到更快的方法并不容易。

您可以参考以下文章将索引转换为字母并使用OLEDB连接到excel:

  • 如何将列号(例如127)转换为Excel列(例如AA) https://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa
  • 允许 VB.NET 应用程序将 Excel 文件转换为数据表 https://stackoverflow.com/questions/47398344/allowing-vb-net-app-to-convert-excel-files-to-datatable/48141732#48141732

初步答复

正如您所说,您是从以下问题开始的:

  • 使用 Interop 从 Excel 文件中删除空行和空列的最快方法 https://stackoverflow.com/questions/40574084/fastest-method-to-remove-empty-rows-and-columns-from-excel-files-using-interop

而你正试图“获取包含数据的最后一行以删除所有额外的空白(在此行或列之后)”

因此,假设您正在使用接受答案(由@JohnG https://stackoverflow.com/users/6842716/johng),因此您可以添加一些代码行来获取最后使用的行和列

空行存储在整数列表中rowsToDelete

您可以使用以下代码获取索引小于最后一个空行的最后一个非空行

List<int> NonEmptyRows = Enumerable.Range(1, rowsToDelete.Max()).ToList().Except(rowsToDelete).ToList();

And if NonEmptyRows.Max() < rowsToDelete.Max()最后一个非空行是NonEmptyRows.Max()否则就是worksheet.Rows.Count并且在最后使用的行之后没有空行。

可以做同样的事情来获取最后一个非空列

代码编辑于DeleteCols and DeleteRows功能:

    private static void DeleteRows(List<int> rowsToDelete, Microsoft.Office.Interop.Excel.Worksheet worksheet)
    {
        // the rows are sorted high to low - so index's wont shift

        List<int> NonEmptyRows = Enumerable.Range(1, rowsToDelete.Max()).ToList().Except(rowsToDelete).ToList();

        if (NonEmptyRows.Max() < rowsToDelete.Max())
        {

            // there are empty rows after the last non empty row

            Microsoft.Office.Interop.Excel.Range cell1 = worksheet.Cells[NonEmptyRows.Max() + 1,1];
            Microsoft.Office.Interop.Excel.Range cell2 = worksheet.Cells[rowsToDelete.Max(), 1];

            //Delete all empty rows after the last used row
            worksheet.Range[cell1, cell2].EntireRow.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp);


        }    //else last non empty row = worksheet.Rows.Count



        foreach (int rowIndex in rowsToDelete.Where(x => x < NonEmptyRows.Max()))
        {
            worksheet.Rows[rowIndex].Delete();
        }
    }

    private static void DeleteCols(List<int> colsToDelete, Microsoft.Office.Interop.Excel.Worksheet worksheet)
    {
        // the cols are sorted high to low - so index's wont shift

        //Get non Empty Cols
        List<int> NonEmptyCols = Enumerable.Range(1, colsToDelete.Max()).ToList().Except(colsToDelete).ToList();

        if (NonEmptyCols.Max() < colsToDelete.Max())
        {

            // there are empty rows after the last non empty row

            Microsoft.Office.Interop.Excel.Range cell1 = worksheet.Cells[1,NonEmptyCols.Max() + 1];
            Microsoft.Office.Interop.Excel.Range cell2 = worksheet.Cells[1,NonEmptyCols.Max()];

            //Delete all empty rows after the last used row
            worksheet.Range[cell1, cell2].EntireColumn.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftToLeft);


        }            //else last non empty column = worksheet.Columns.Count

        foreach (int colIndex in colsToDelete.Where(x => x < NonEmptyCols.Max()))
        {
            worksheet.Columns[colIndex].Delete();
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Interop 从 Excel 获取最后一个非空列和行索引 的相关文章

随机推荐

  • 从 Flask 视图返回 JSON 响应

    我有一个函数可以使用 Pandas 分析 CSV 文件并生成包含摘要信息的字典 我想将结果作为 Flask 视图的响应返回 如何返回 JSON 响应 app route summary def summary d make summary
  • 以编程方式从 XSD 创建 XML 文件

    我有一个 XSD 文件 我想在运行时基于 XSD 创建一个 XML 文件 我的问题基本上与this one https stackoverflow com questions 307616 xml instance generation f
  • ASP.NET 自动完成下拉列表

    是否有用于 asp net 自动完成 DropDownList 的控件或 Jquery 插件 如果是 请在此处链接示例 我不想使用asp net ajax控制工具包 我不知道这是否是您要找的内容 但这里有一个类似 Facebook 的不错的
  • 在图像 {graphics} 中添加颜色图例

    在这个例子中 我有一个带有颜色的图像 我想知道我们是否可以添加颜色图例 例如 点与z in 8 10 颜色有红色等 x runif 500 0 5 y runif 500 0 5 z floor runif 500 1 10 xyz dat
  • 未找到 AWS CodeDeploy 命令

    尝试部署 Node js 应用程序时出现错误npm command not found in my post install sh安装后脚本 最奇怪的是我运行的 BeforeInstall 脚本npm install g pm2它工作得很好
  • 在 NTFS 中搜索文件

    我们有一个相当大的磁盘阵列 上面大约有 2 3 百万个 XML 文件 磁盘采用 NTFS 格式 我们想使用通配符搜索文件系统 因此 像 SomePartOfTheFilename 这样的内容将是典型的搜索查询 我们正在使用 Net 并且发现
  • React-选择清除值,同时保留过滤器

    我正在开发一个权限系统 让用户控制谁可以访问 评论 编辑资源 就像您在 Google 云端硬盘上找到的资源一样 我正在使用 React Select multi 让资源所有者选择他想要授予资源访问权限的用户 当我单击反应选择显示的选项时 我
  • Android 中的隐式意图与显式意图(startActivity(intent) 崩溃)

    我是这个世界的新人 我在使用 startActivity intent 时遇到问题 这是清单
  • 按下时更改按钮主题

    我试图在按下按钮时更改按钮的数据主题 我在按钮的 onClick 处理程序中调用此 JavaScript 函数 function changeNextButtonColor var nextButton document getElemen
  • 在另一个类中使用 JSONArray?

    我有一个微调器 可以在下拉列表中加载客户的姓名 微调器从 JSON 数组获取字符串 我还有一些文本视图 当旋转器选择更改时 应加载所选客户的姓名 地址 电话号码 但是 JSONArray 在另一个类中使用 我如何在另一个类中使用 JSONA
  • 在 Visual Studio 2015 中显示单元测试的描述属性

    有谁知道如何在 Visual Studio 2015 测试运行期间显示描述属性 例如给出这个测试 TestMethod TestCategory With Fakes Description Posting a blog entry wit
  • TIME-WAIT刺杀和SO_REUSEADDR有什么区别

    我正在阅读有关使用 SO LINGER 套接字选项通过将逗留时间设置为零来有意 暗杀 时间等待状态的内容 该书的作者接着说我们永远不应该这样做 并且一般来说我们永远不应该干扰时间等待状态 然后他立即建议使用 SO REUSEADDR 选项来
  • 改造通用服务接口

    我正在为 Retrofit 创建一个通用 API 层 这是我的服务类别 public interface ApiService POST api authenticate Call
  • Firefox 上奇怪的蓝色边框

    请看一下这段代码 http www jsfiddle net tt13 5CxPr 21 http www jsfiddle net tt13 5CxPr 21 On Firefox it shows strange blue border
  • 在特定年份 Pandas 之后删除行

    我的数据框中有一列 其中包含以下格式的年份 2018 19 2017 18 年份是对象数据类型 我想将此列的类型更改为日期时间 然后删除 1979 80 之前的所有行 但是 我尝试这样做 但出现了格式错误 这样做的正确或更好的方法是什么 B
  • JavaScript 中判断某物是否为普通对象的方法

    我最近偶然发现了这个函数 它可以确定某个东西是否是普通对象 JavaScript function isPlainObject value if typeof value object value null return false let
  • Visual Studio:使用一个宏进行清理和重建

    我正在尝试通过创建一些宏来优化 VS 的工作 目前我有以下宏 Public Sub ReleaseBuild DTE ExecuteCommand Build SolutionConfigurations Release DTE Execu
  • 如何在 Dart 中将“ByteData”实例写入文件?

    我正在使用 Flutter 将 资产 加载到File以便本机应用程序可以访问它 这就是我加载资产的方式 final dbBytes await rootBundle load assets file 这将返回一个实例ByteData 我怎样
  • 如何在 TKinter 中显示控制台输出?

    我希望控制台中的显示显示在 GUI Tkinter 中 它应该在输出到 Python 控制台时准确显示 而不是在项目完成后显示 你能用 Tkinter 做到这一点吗 或者还有其他选择吗 这些是我当前的输出 这些应该实时显示在 GUI 上 S
  • 使用 Interop 从 Excel 获取最后一个非空列和行索引

    我正在尝试使用互操作库从 Excel 文件中删除所有多余的空白行和列 我关注了这个问题使用 Interop 从 Excel 文件中删除空行和空列的最快方法 https stackoverflow com questions 40574084