Spread for WinForms 中提供了 TextCellType 和 ImageCellType 两种单元格类型,可分别用于文字和图片类型的单元格,不过有时也希望在单元格中同时显示文字和图片,今天就使用自定义单元格类型来实现图文混排效果。
首先,我们需要从 ImageCellType 继承实现一个自定义单元格类型 ImageTextCellType,并重写 PaintCell 方法,代码如下:
public class ImageTextCellType : FarPoint.Win.Spread.CellType.ImageCellType { private Picture picture; public ImageTextCellType() { picture = new Picture(); } public override void PaintCell(Graphics g, Rectangle r, FarPoint.Win.Spread.Appearance appearance, object value, bool isSelected, bool isLocked, float zoomFactor) { if (value != null) { Image image = value as Image; string strValue = image.Tag.ToString();//文字 SolidBrush brush = new SolidBrush(Color.White); GraphicsState gstate = g.Save(); g.IntersectClip(r); g.FillRectangle(brush, r); brush.Dispose(); if (image != null) { Rectangle rectangle = new Rectangle(new Point(r.X, r.Y), new Size(200, 200)); if (rectangle == Rectangle.Empty) { g.Restore(gstate); return; } picture.Image = image; picture.Paint(g, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); SizeF size = g.MeasureString(strValue, appearance.Font); g.DrawString(strValue, appearance.Font, new SolidBrush(Color.Black), new PointF(r.X, r.Y + image.Size.Height + 5)); } g.Restore(gstate); } else { base.PaintCell(g, r, appearance, value, isSelected, isLocked, zoomFactor); } } }
接下来在Spread中使用 ImageTextCellType 单元格类型,代码如下:
private void Form1_Load(object sender, EventArgs e) { ImageTextCellType itct = new ImageTextCellType(); fpSpread1.ActiveSheet.Columns[0].CellType = itct; Image image = Image.FromFile(Application.StartupPath + @"\Images\八仙花.jpg"); image.Tag = "八仙花"; fpSpread1.ActiveSheet.Cells[0, 0].Value = image; image = Image.FromFile(Application.StartupPath + @"\Images\灯塔.jpg"); image.Tag = "灯塔"; fpSpread1.ActiveSheet.Cells[1, 0].Value = image; }
运行截图:
源码下载: