Chr*_*ris 14 c# office-interop excel-interop
我有用户提供的需要转换为PDF的excel文件.使用excel互操作,我可以做到这一点.ExportAsFixedFormat().当工作簿有数百万行时,我的问题出现了.这将变成一个有50k +页面的文件.如果工作簿在所有这些行中都有内容,那就没问题.每次出现其中一个文件时,可能有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);
}
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可以做什么的限制?有没有更好的方法来做我正在尝试的事情?
您是否尝试过Sheet1.Range("A1").CurrentRegion.ExportAsFixedFormat(),其中 Sheet1 是有效的工作表名称,“A1”是您可以测试的单元格,以确保它位于您要导出的范围内?
问题仍然存在,为什么 Excel 认为那些“空”单元格中有数据?格式化?需要清除预先存在的打印区域?我知道我以前也遇到过类似的情况,这是此刻想到的唯一可能性。
| 归档时间: |
|
| 查看次数: |
10611 次 |
| 最近记录: |