用c#在excel中插入图片和设置表格宽度

Posted 小哈龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c#在excel中插入图片和设置表格宽度相关的知识,希望对你有一定的参考价值。

问题的由来是我想在excel中自动插入图片,插入图片后我想根据图片的大小调整cell的大小,于是不经意间就来到了一个坑的面前。。。。

Range对象有ColumnWidth属性和RowHeight属性,这两个属性的单位不同,并且都不是像素。。。

RowHeight的单位是point,可以这样换算

        public static int PixelToPointY(int pixels)
        
            return (int)((((double)pixels) * 1440.0) / ((double)GetPPIVertical() * 20));
        
        public static int GetPPIVertical()
        
            int ppi;
            IntPtr dc = GetDC(IntPtr.Zero);
            ppi = GetDeviceCaps(dc, 90); //DEVICECAP LOGPIXELSY
            ReleaseDC(IntPtr.Zero, dc);
            return ppi;
        

ColumnWidth的单位是在默认字体中,0-9这几个字符中最宽的宽度。这个值在C#中好像没有直接获取的方法,最后找了一个trick的办法

            System.Drawing.Font font = new System.Drawing.Font("宋体", 11.0f, FontStyle.Regular);
            int w0 = System.Windows.Forms.TextRenderer.MeasureText("____", font).Width;
            int w = System.Windows.Forms.TextRenderer.MeasureText("__0__", font).Width;
            digitWidth = w - w0;

好在宋体中数字的字符宽度都一样。另外注意直接用MeasureText("0", font).Width是不行的,中间会有padding。

故事到这里还没有结束。真正的pixel到ColumnWidth的计算公式是这样的:Truncate((pixels-5)/Maximum Digit Width * 100+0.5)/100

写出来就是这样

        public static float PixelsToColumnWdthX(int pixels)
        
            return (float)((int)((float)(pixels - 5) / (float)digitWidth * 100f + 0.5f)) / 100f;
        

另外,想把图片保存到excel中有两个方法

方法1

Pictures pictures = worksheet.Pictures() as Pictures;

Picture pic = pictures.Insert(fileName);

这样保存的是图片的链接,图片文件的位置不能变

方法2会将文件内容保存到xls文件中

Microsoft.Office.Interop.Excel.Shape shape = worksheet .Shapes.AddPicture(fileName,

MsoTriState. msoFalse, MsoTriState. msoTrue, l, t, -1, -1);

先是用参数-1, -1将图片按原大小插入,然后再保持比例缩放

shape.Height = PixelToPointY(height);

最后的宽度还有有一点点对不上,不过问题不大。

参考

https://support.office.com/en-us/article/change-the-column-width-and-row-height-72f5e3cc-994d-43e8-ae58-9774a0905f46

https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.column.aspx

http://stackoverflow.com/questions/7716078/formula-to-convert-net-pixels-to-excel-width-in-openxml-format

————————————————

版权声明:本文为CSDN博主「Garuda」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Garuda/article/details/53106632

以上是关于用c#在excel中插入图片和设置表格宽度的主要内容,如果未能解决你的问题,请参考以下文章

excel表格怎样添加水印图片背景

excel怎么在单元格里嵌入图片?

怎么在Excel中插入地图

word 如何固定表格宽度,使插入的图片适应表格宽度?

如何在C#中使用EPPlus设置xlsx单元格宽度

word表格里插入数码图片问题