NPOI獲取Excel文件裏的形狀/圖片的座標/錨點

有個妹紙找我請教如何獲取圖片座標,因此我到家後花了點時間,寫了這份代碼。

實測下來,可以正確獲取Excel 2003版本的形狀和圖片這兩種的座標/錨點,以及Excel 2007版本的圖片的座標/錨點。

暫未解決如何將Excel 2007以上版本的形狀(XSSFSimpleShape)轉換成圖片(XSSFPicture)的問題?

如有大佬懂的,還請多多指教。

class Program
{
	static void Main(params string[] args)
	{
		string excel2003FilePath = @"D:\Users\Allen\Desktop\image.xls";
		GetPictureAnchorTest(excel2003FilePath);

		string excel2007FilePath = @"D:\Users\Allen\Desktop\image.xlsx";
		GetPictureAnchorTest(excel2007FilePath);

		Console.ReadKey();
	}

	static void GetPictureAnchorTest(string excelFilePath)
	{

		IWorkbook workbook = WorkbookFactory.Create(excelFilePath);
		ISheet sheet = workbook.GetSheetAt(0);
		IEnumerable<IPicture> pictures = sheet.GetPictures();
		foreach (IPicture picture in pictures)
		{
			PictureAnchor anchor = picture.GetPictureAnchor();
			Console.WriteLine($"PictureType:{picture.GetType().FullName}, LeftmostCellIndex: {anchor.LeftmostCellIndex}, RightmostCellIndex: {anchor.RightmostCellIndex}, TopmostRowIndex: {anchor.TopmostRowIndex}, BottommostRowIndex: {anchor.BottommostRowIndex}");
		}
	}
}

public readonly struct PictureAnchor
{
	public PictureAnchor(int leftmostCellIndex, int rightmostCellIndex, int topmostRowIndex, int bottommostRowIndex)
	{
		LeftmostCellIndex = leftmostCellIndex;
		RightmostCellIndex = rightmostCellIndex;
		TopmostRowIndex = topmostRowIndex;
		BottommostRowIndex = bottommostRowIndex;
	}

	public int LeftmostCellIndex { get; }

	public int RightmostCellIndex { get; }

	public int TopmostRowIndex { get; }

	public int BottommostRowIndex { get; }

	public override string ToString()
	{
		return $"LeftmostCellIndex: {LeftmostCellIndex}, RightmostCellIndex: {RightmostCellIndex}, TopmostRowIndex: {TopmostRowIndex}, BottommostRowIndex: {BottommostRowIndex}";
	}
}

public static class NPOIExtensions
{
	public static IEnumerable<IPicture> GetPictures(this ISheet sheet)
	{
		var dp = sheet.DrawingPatriarch;

		// Excel 2003
		if (dp is HSSFPatriarch patriarch)
		{
			return patriarch.GetShapes().Select(x =>
			{
				if (x is HSSFPicture picture)
				{
					return picture;
				}
				else
				{
					return new HSSFPicture(x, x.Anchor);
				}
			}).Cast<IPicture>();
		}

		// Excel 2007 above
		if (dp is XSSFDrawing dr)
		{
			//TODO: How convert XSSFSimpleShape to XSSFPicture ???
			return dr.GetShapes().Where(x => x is XSSFPicture).Cast<IPicture>();
		}

		throw new NotSupportedException($"Unsupported DrawingPatriarch object type:{dp.GetType().FullName}");
	}

	public static PictureAnchor GetPictureAnchor(this IPicture picture)
	{
		var anchor = picture.ClientAnchor;
		return new PictureAnchor(anchor.Col1, anchor.Col2, anchor.Row1, anchor.Row2);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章