用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://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

可以使用C#的Microsoft.Office.Interop.Excel库来操作Excel工作簿,使用该库可以在Excel插入图片。以下是示例代码: ```csharp using Excel = Microsoft.Office.Interop.Excel; using System.Drawing; // 创建Excel应用程序对象 Excel.Application excelApp = new Excel.Application(); // 打开工作簿 Excel.Workbook workbook = excelApp.Workbooks.Open("D:\\example.xlsx"); // 获取第一个工作表 Excel.Worksheet worksheet = workbook.Sheets[1]; // 插入图片 Image image = Image.FromFile("D:\\example.jpg"); Excel.Range range = worksheet.Range["A1"]; range.Select(); worksheet.Shapes.AddPicture("D:\\example.jpg", Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, range.Left, range.Top, image.Width, image.Height); // 保存并关闭工作簿 workbook.Save(); workbook.Close(); // 退出Excel应用程序 excelApp.Quit(); ``` 以上代码,我们首先使用excelApp对象创建Excel应用程序对象,然后打开需要插入图片的工作簿,获取第一个工作表。接着,我们使用Image.FromFile方法读取图片,然后使用Shapes.AddPicture方法在工作表插入该图片,其,第一个参数为图片的路径,第二个参数表示是否链接到文件,第三个参数表示是否保存图片大小和位置信息,第四个参数和第五个参数表示图片的左上角在工作表的位置,最后两个参数表示图片的宽度和高度。最后,我们保存并关闭工作簿,并退出Excel应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值