用SpreadSheetgear获取单元格像素坐标(非Windows形式)
Obtain cell pixel coordinates with SpreadSheetgear (non Windows Forms)
我知道 WorkbookView
有一个 RangeToLocation
方法 (http://www.spreadsheetgear.com/support/help/spreadsheetgear.net.7.0/#SpreadsheetGear2012~SpreadsheetGear.Windows.Forms.WorkbookView~RangeToLocation(Double,Double,Double,Double).html),但如果应用程序不是 Windows 表单,那将不会削减它。
不幸的是,除了RangeToLocation
,我在其他接口上找不到正确的方法或属性。有一个肮脏的解决方法:SpreadsheetGear.Drawing.Image
提供了一种生成区域图像的方法。我可以使用该函数生成一个图像,从 A1
(作为顶部+左侧单元格)到顶部+左侧的单元格,与我感兴趣的单元格(即底部+右侧单元格)相比绘图区)。如果我测量那个特定图像的 height/width,我会得到我想要的坐标,但是对于数百个单元格来说,这将是很多不必要的工作。
我希望有一个我忽略的官方方法,而不是我描述的 hack。
您不会在 WorkbookView 之外找到像素单位测量值,因为像素是设备相关的,因此如果没有图形上下文则并不真正相关。
您可以做的是使用 IWorksheetWindowInfo.RowToPoints(...) and ColumnToPoints(...), potentially in combination with IRange.Width and Height,以点为单位测量范围坐标和尺寸,这是与设备无关的绝对单位(72 点 == 1 英寸)。
如果您有一些预期或假定的点到像素的转换,您可以从那里自己进行点到像素的转换。
示例:
// Create workbook and some local variables.
IWorkbook workbook = Factory.GetWorkbook();
IWorksheet worksheet = workbook.Worksheets["Sheet1"];
IWorksheetWindowInfo windowInfo = worksheet.WindowInfo;
// Get some measurements for B2:D20 (relative to the top-left corner of the
// worksheet and in Point units)
IRange range = worksheet.Cells["B2:D20"];
double left = windowInfo.ColumnToPoints(range.Column);
double top = windowInfo.RowToPoints(range.Row);
double right = left + range.Width;
double bottom = top + range.Height;
Console.WriteLine("{0} - Left={1}, Top={2}, Right={3}, Bottom={4}",
range.Address, left, top, right, bottom);
// OUTPUT: $B:$D - Left=51.0921431556344, Top=14.95, Right=204.368572622538, Bottom=299
我知道 WorkbookView
有一个 RangeToLocation
方法 (http://www.spreadsheetgear.com/support/help/spreadsheetgear.net.7.0/#SpreadsheetGear2012~SpreadsheetGear.Windows.Forms.WorkbookView~RangeToLocation(Double,Double,Double,Double).html),但如果应用程序不是 Windows 表单,那将不会削减它。
不幸的是,除了RangeToLocation
,我在其他接口上找不到正确的方法或属性。有一个肮脏的解决方法:SpreadsheetGear.Drawing.Image
提供了一种生成区域图像的方法。我可以使用该函数生成一个图像,从 A1
(作为顶部+左侧单元格)到顶部+左侧的单元格,与我感兴趣的单元格(即底部+右侧单元格)相比绘图区)。如果我测量那个特定图像的 height/width,我会得到我想要的坐标,但是对于数百个单元格来说,这将是很多不必要的工作。
我希望有一个我忽略的官方方法,而不是我描述的 hack。
您不会在 WorkbookView 之外找到像素单位测量值,因为像素是设备相关的,因此如果没有图形上下文则并不真正相关。
您可以做的是使用 IWorksheetWindowInfo.RowToPoints(...) and ColumnToPoints(...), potentially in combination with IRange.Width and Height,以点为单位测量范围坐标和尺寸,这是与设备无关的绝对单位(72 点 == 1 英寸)。
如果您有一些预期或假定的点到像素的转换,您可以从那里自己进行点到像素的转换。
示例:
// Create workbook and some local variables.
IWorkbook workbook = Factory.GetWorkbook();
IWorksheet worksheet = workbook.Worksheets["Sheet1"];
IWorksheetWindowInfo windowInfo = worksheet.WindowInfo;
// Get some measurements for B2:D20 (relative to the top-left corner of the
// worksheet and in Point units)
IRange range = worksheet.Cells["B2:D20"];
double left = windowInfo.ColumnToPoints(range.Column);
double top = windowInfo.RowToPoints(range.Row);
double right = left + range.Width;
double bottom = top + range.Height;
Console.WriteLine("{0} - Left={1}, Top={2}, Right={3}, Bottom={4}",
range.Address, left, top, right, bottom);
// OUTPUT: $B:$D - Left=51.0921431556344, Top=14.95, Right=204.368572622538, Bottom=299