使用Excel Interop删除空行

Chr*_*ris 14 c# office-interop excel-interop

我有用户提供的需要转换为PDF的excel文件.使用excel互操作,我可以做到这一点.ExportAsFixedFormat().当工作簿有数百万行时,我的问题出现了.这将变成一个有50k +页面的文件.如果工作簿在所有这些行中都有内容,那就没问题.每次出现其中一个文件时,可能有50行有内容,其余的都是空白.我怎样才能删除空行,以便将其导出为合适大小的PDF?

  1. 我已经尝试从最后一行开始,一个接一个,CountA用来检查行是否有内容,如果有,则删除它.这不仅需要永远,这似乎在大约100k行后失败,并出现以下错误:

    无法计算表达式,因为代码已优化或本机帧位于调用堆栈之上.

  2. 我尝试过使用SpecialCells(XlCellType.xlCellTypeLastCell, XlSpecialCellsValue.xlTextValues)但如果任何单元格有格式(如bg颜色),则包含一行.

  3. 我尝试过使用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);
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)

我的代码有问题吗,这是一个互操作问题,还是仅仅是Excel可以做什么的限制?有没有更好的方法来做我正在尝试的事情?

Nic*_*zer 0

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

问题仍然存在,为什么 Excel 认为那些“空”单元格中有数据?格式化?需要清除预先存在的打印区域?我知道我以前也遇到过类似的情况,这是此刻想到的唯一可能性。