我有用户提供的需要转换为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为什么会认为这些“空”单元格中有数据?格式化?需要清除的预先存在的打印区域?我知道我曾经遇到过这样的情况,那些在这个时候才会出现的唯一可能性.