Excel打开xml sdk - 控制图表位置

时间:2015-03-16 09:34:16

标签: excel openxml

我正在试图找出如何在工作表上获取现有图表的位置,并了解它“隐藏”的范围(列和行)...
我有图表部分和图表元素。

1 个答案:

答案 0 :(得分:4)

图表有两个部分 - 图表本身和包含图表位置信息的Drawing元素。因此,要找出图表的位置,您需要找到DrawingsPart。实际位置存储在TwoCellAnchor中,其中包含绘图对象的左上角和右下角单元格的从零开始的列和行索引。由于绘图对象不必位于单元格的边界上,因此还有一个偏移量可显示绘图对象在单元格中的起始位置。该值在EMU's中,除非该数字紧跟一个单位标识符。

以下代码将迭代所有ChartPartsDrawingsPart中的所有WorksheetParts并输出TwoCellAnchor信息。

public static void FindCharts(string filename)
{
    using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false))
    {
        foreach (WorksheetPart wsp in spreadsheetDocument.WorkbookPart.WorksheetParts)
        {
            if (wsp.DrawingsPart != null)
            {
                foreach (ChartPart chart in wsp.DrawingsPart.ChartParts)
                {
                    TwoCellAnchor tca = wsp.DrawingsPart.WorksheetDrawing.Descendants<TwoCellAnchor>().FirstOrDefault();
                    if (tca != null)
                    {
                        Console.WriteLine("A Chart starts at Column {0} ({1}), Row {2} ({3}) and ends at Column {4} ({5}), Row {6} ({7})",
                                            tca.FromMarker.ColumnId.Text,
                                            tca.FromMarker.ColumnOffset.Text,
                                            tca.FromMarker.RowId.Text,
                                            tca.FromMarker.RowOffset.Text,
                                            tca.ToMarker.ColumnId.Text,
                                            tca.ToMarker.ColumnOffset.Text,
                                            tca.ToMarker.RowId.Text,
                                            tca.ToMarker.RowOffset.Text
                                            );
                    }
                    else
                    {
                        Console.WriteLine("Couldn't find position of chart {0}", chart.ChartSpace.LocalName.ToString());
                    }
                }
            }
        }
    }
}