检索UsedRange而不使用空白单元格

我试图将excel文件的每个工作表转换为使用excel.Interop图像。 我到目前为止是

var a = new Microsoft.Office.Interop.Excel.Application(); try { Workbook w = a.Workbooks.Open(@"C:\Path\to\excelFile.xlsx"); foreach (Worksheet ws in w.Sheets) { string range = ws.PageSetup.PrintArea; ws.Protect(Contents: false); Range r = ws.UsedRange; r.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap); Bitmap image = new Bitmap(System.Windows.Forms.Clipboard.GetImage()); string BitmapName = ws.Name; image.Save($@"C:\Path\to\bitmapsToSave\{BitmapName}.bmp"); } a.DisplayAlerts = false; w.Close(SaveChanges: false); } finally { a.Quit(); } 

我碰巧从剪贴板中获取图片,该图片使用了range.CopyPicture方法。 事情是,我得到的范围包含一些空白单元格,我读了一个地方,一旦单元格访问将扩大范围,即使它是空白的。

这意味着我的位图输出包含一个我不想要的空白偏移量。 我试图select确切的范围,我已经尝试了以下

 Range r = ws.UsedRange.SpecialCells(XlCellType.xlCellTypeAllFormatConditions); 

这将返回我的表没有标题。 我不知道为什么,但这与他们被冻结有关

我也尝试清除我的表格格式之前复制范围到剪贴板

 ws.Columns.ClearFormats(); ws.Rows.ClearFormats(); 

这工作正常,但我的performance在失去了所有的格式。 (这也意味着这适用于非格式表,这是很好的)

我试图复制ws实例到一个新的,从它得到清除的范围,并将其复制到实际工作表,但我无法正确访问它们

 //creates a copy of the worksheet to extract its range Worksheet _ws = ws; //These two lines do the magic. _ws.Columns.ClearFormats(); _ws.Rows.ClearFormats(); Range _r = _ws.UsedRange; //Copies range of aux ws into current ws _r.Copy(r); 

这将返回前一种情况的相同输出,一个正确的裁剪范围,但图像没有Excel格式。

我还没有尝试过的最后一件事,那是因为我不知道为什么要访问打印区域,并以某种方式将其作为范围进行投射。

我想知道怎么做,或者我做错了什么。

编辑:

基本上与互操作

 opens an excel file with a table on each sheet for each sheet get UsedRange of sheet as a Range object pass that range into clipboard using Copypicture save Clipboard to a bmp image close file 

interopselect的范围比实际包含数据的范围大,因为如果我点击一个单元格并删除它的内容,它仍然会被视为包含数据。

这会导致包含我的表格的位图,但也有很多白色的单元格,因为他们有一次数据,但现在不再。

代码在https://github.com/diegoquintanav/Excel2BMP

我认为它与UsedRange返回的范围有关。 此方法似乎正常工作,但我的理解是,该方法可能会返回范围,其中在所使用的范围的左侧或右侧的顶部,底部和/或空列有空行。 您的评论描述了这种情况。

_“我读过一个单元格访问过的地方,即使它是空白的,也会扩大范围。

我个人从来没有经历过这种情况,当这种情况发生在别人身上的时候……几乎在所有我见过的情况下,当一个明显空的单元格有某种不正常的格式或不可见的字符时,问题就解决了。 如果使用的范围正在返回实际数据的上方,下方或左侧的空行或列,则在其中一个单元格中存在某些内容。 另外,应该很明显,哪个单元格有这个不可见的数据或格式。 例:

如果在所使用的范围的顶部存在“明显的”空行,或者在所使用的范围的左侧存在“明显的”空列,那么TOP / LEFT单元具有不可见数据或某种非“正常”单元格格式该行和/或列中的一个或多个单元格。

如果在已使用范围的BOTTOM处有“明显的”空行或在已使用的范围的右侧有“Apparent”空列,那么BOTTOM / RIGHT单元具有不可见数据或某种非“正常”单元格格式该行和/或列中的一个或多个单元格。

打开Excel工作表并select上面的问题单元之一来删除任何数据并清除任何格式,将至less删除一个空的行,列或两者。

检查那些“明显的”空单元格。 删除内容,并清除任何格式,并查看使用的范围是否按预期工作。

编辑:删除额外的行和列

由于过多的东西会导致usedRange属性返回这些空的行和列,这包括合并的单元格,最简单的方法是通过“完全删除”单元格。 幸运的是,图片显示了您需要删除的行数或列数。

Cont4的链接的名为Cont4的表格为例, UsedRange在右侧返回十(10)个额外的空列,在底部返回39个空行。 我发现一个合并单元格col AA某处。 我们可以尝试在逐个单元格的基础上找出造成这种情况的原因,但是简单地select从列“R”开始到列“AA”或任何列PAST列“AA”的所有列可能更容易。 换句话说,select数据右侧的10列或更多列。 select这些列后,右键单击select并select“删除”。 这显然应该删除这些单元格中的任何格式化和合并,并解决问题。 同样的事情适用于底部的空行,在数据下方至lessselect39行或更多行,然后右键单击select并select“删除”。

最上面的一行有点不同。 如果工作表顶部有一个或多个空行,则从UsedRange返回一个额外的空行。 我无法摆脱这额外的顶行,除非我删除所有空的顶行。

最后,我在最后一个注释中指出的代码将删除这些空行和列以及顶部额外的行,因为它完全忽略了格式化和合并,并将删除任何完全空的行,而不考虑格式。 只要你有代码为你工作,那么这是重要的。 祝你好运。

我终于设法得到正确的位图,使用答案

如何查找ExcelInterop中的第一个和最后一个单元格以及C#中的graphics范围

我replace了

  Range r = ws.UsedRange; 

  Range r = ws.get_Range("B2", System.Type.Missing).CurrentRegion; 

我必须假定每张纸上的每个表格都在同一个单元格中开始,在这种情况下是B2。 这给我所有的位图,因为它应该。