4

我正在尝试将图像映射到 excel 电子表格中,我需要找到当前单元格的坐标是什么?

我的代码目前循环遍历每个单元格,直到它在 excel 中找到一个匹配的标签,它知道这是放置图片的单元格。

我有单元格,我只是不知道如何获得单元格的顶部和左侧属性?

foreach (ExcelRangeBase cell in range1)
     {

     }

请帮忙!

提前致谢。

4

4 回答 4

3
int row = cellAddress.Start.Row;
int column = cellAddress.Start.Column;


if (mCellsResult.Count() > 0)
{
var mCells = mCellsResult.First();

//if the cell and the merged cell do not share a common start address then skip this cell as it's already been covered by a previous item
if (mCells.Start.Address != cellAddress.Start.Address)
                                                        continue;

if (mCells.Start.Column != mCells.End.Column)
{
colSpan += mCells.End.Column - mCells.Start.Column;
}

if (mCells.Start.Row != mCells.End.Row)
{
   rowSpan += mCells.End.Row - mCells.Start.Row;
}
}
double height = 0, width = 0;
for (int h = 0; h < rowSpan; h++)
{
height += xlWorkSeet1[k].Row(row + h).Height;
}
for (int w = 0; w < colSpan; w++)
{
 width += xlWorkSeet1[k].Column(column + w).Width;
}

double pointToPixel = 0.75;

height /= pointToPixel;
width /= 0.1423;


picture = xlWorkSeet1[k].Drawings.AddPicture(System.Guid.NewGuid().ToString() + row.ToString() + column.ToString(), image);
picture.From.Column = column - 1;
picture.From.Row = row - 1;
picture.SetSize((int)width, (int)height);
于 2012-10-15T12:34:26.070 回答
1

Cell.Top 和 Cell.Left 会很好,但它们在 EPPlus 中不存在。我受到 Pomster 的启发,做了这个功能:

/// <summary>Get top, left, width and height of a given cell.</summary>
    Rectangle GetCellTopLeftCoordinates(ExcelWorksheet worksheet, ExcelRangeBase cell)
    {
        double top = 0, left = 0, width = 0, height = 0;

        //Get top and left position:
        for (int i = 1; i < cell.Start.Row; i++)
            top += worksheet.Row(i).Height;

        for (int i = 1; i < cell.Start.Column; i++)
            left += worksheet.Column(i).Width;

        //Get width and height:
        if (cell.Merge)  //Then the cell are merged with others:
        {
            foreach (string address in worksheet.MergedCells)  //Loop through all merged cells:
                if (Intersect(worksheet.Cells[address], cell))  //Then we have found the particular, merged range:
                {
                    ExcelRange range = worksheet.SelectedRange[address];

                    for (int i = range.Start.Row; i <= range.End.Row; i++)
                        height += worksheet.Row(i).Height;

                    for (int i = range.Start.Column; i <= range.End.Column; i++)
                        width += worksheet.Column(i).Width;

                    break;
                }
        }
        else //No merges - just get dimensions:
        {
            width = worksheet.Column(cell.Start.Column).Width;
            height = worksheet.Row(cell.Start.Row).Height;
        }

        //Convert point to pixels:
        top /= 0.75;
        left /= 0.1423;
        height /= 0.75;
        width /= 0.1423;
        return new Rectangle((int)left, (int)top, (int)width, (int)height);
    }

    bool Intersect(ExcelRange range, ExcelRangeBase cell)
    {
        foreach (ExcelRangeBase item in range)
            if (item.Address == cell.Address)
                return true;

        return false;
    }
于 2014-05-18T06:25:56.317 回答
0

试试cell.topand cell.left,它们存在于 excel 对象模型中。

于 2012-10-12T17:15:36.873 回答
-1

如何获取excel范围的左上角:

using Excel = Microsoft.Office.Interop.Excel;
...
// get upper left corner of range defined by a RangeStr like "B2:D4"
Excel.Range UpperLeftCell = (Excel.Range)wsheet.get_Range(RangeStr).Cells[1,1]; 

其中 wsheet 是 Worksheet 对象。

于 2014-08-24T10:29:28.823 回答