c# – 使用Excel Interop删除空行

前端之家收集整理的这篇文章主要介绍了c# – 使用Excel Interop删除空行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有用户提供的需要转换为PDF的excel文件.使用excel interop,我可以使用.ExportAsFixedFormat()来做到这一点.当一本工作簿有数百万行时,我的问题出现了.这变成一个有5万页的文件.如果工作簿在所有这些行中都有内容,那将会很好.每当这些文件中的一个出现时,可能有50行有内容,其余的空白.如何删除空行,以便我可以将其导出到体面的大小的PDF?

>我尝试从结束行开始,并逐一使用CountA来检查该行是否具有内容,如果是,则删除它.这不仅是永久的,这似乎在大约100k行之后失败,并出现以下错误

无法评估表达式,因为代码已优化,或本机框架位于调用堆栈顶部.
>我试过使用SpecialCells(XlCellType.xlCellTypeLastCell,XlSpecialCellsValue.xlTextValues),但是如果任何单元格具有格式(如bg颜色),则包含一行.
>我已经尝试使用Worksheet.UsedRange,然后删除之后的所有内容,但UsedRange与第二点有相同的问题.

这是我试过的代码

for (int i = 0; i < worksheets.Count; i++)
{
    sheet = worksheets[i + 1];
    rows = sheet.Rows;
    currentRowIndex = rows.Count;
    bool contentFound = false;

    while (!contentFound && currentRowIndex > 0)
    {
        currentRow = rows[currentRowIndex];

        if (Application.WorksheetFunction.CountA(currentRow) == 0)
        {
            currentRow.Delete();
        }
        else
        {
            contentFound = true;
        }

        Marshal.FinalReleaseComObject(currentRow);
        currentRowIndex--;
    }

    Marshal.FinalReleaseComObject(rows);
    Marshal.FinalReleaseComObject(sheet);
}
for (int i = 0; i < worksheets.Count; i++)
{
    sheet = worksheets[i + 1];
    rows = sheet.Rows;

    lastCell = rows.SpecialCells(XlCellType.xlCellTypeLastCell,XlSpecialCellsValue.xlTextValues);
    int startRow = lastCell.Row;

    Range range = sheet.get_Range(lastCell.get_Address(RowAbsolute: startRow));
    range.Delete();

    Marshal.FinalReleaseComObject(range);
    Marshal.FinalReleaseComObject(lastCell);
    Marshal.FinalReleaseComObject(rows);
    Marshal.FinalReleaseComObject(sheet);
}

我的代码有问题,这是一个interop的问题,或者这只是Excel可以做什么的限制?有没有更好的方法来做我正在尝试的事情?

解决方法

您是否尝试过Sheet1.Range(“A1”).CurrentRegion.ExportAsFixedFormat()其中Sheet1是有效的工作表名称,“A1”是您可以测试以确保它位于要导出的范围内的单元格?

问题依然存在,Excel为什么会认为这些“空”单元格中有数据?格式化?需要清除的预先存在的打印区域?我知道我曾经遇到过这样的情况,那些在这个时候才会出现的唯一可能性.

猜你在找的C#相关文章