【ArcGIS Pro二次开发】(51):Excel表格内容导出图片

在做村规成果出图的时候,有这么一个需求,就是需要将生成的规划调整表导出图片,然后贴到布局里,实现图表一致:

【ArcGIS Pro二次开发】(51):Excel表格内容导出图片_第1张图片

估计这会是一个相对通用的需要,于是就专门做了这样一个方法,也顺便水一篇。


一、要实现的功能

【ArcGIS Pro二次开发】(51):Excel表格内容导出图片_第2张图片

上图是已经生成的Excel表格,工具的目的是将图中红框部分的内容导出图片(jpg、png等):

【ArcGIS Pro二次开发】(51):Excel表格内容导出图片_第3张图片


二、实现流程

首先要确定你的VS已经安装了【Interop.Microsoft.Office.Interop.Excel】。没装的可以看看之前的文章:

【ArcGIS Pro二次开发】(12):txt文件和Excel文件的读写

先按常规方法打开Excel表格:

// 创建Excel应用程序对象
Application excelApp = new Application();
// 打开Excel文件
Workbook workbook = excelApp.Workbooks.Open(excelPath);
// 获取工作表
Worksheet worksheet = workbook.Sheets[1];

再获取你要导出的范围,同时确定要导出图像的宽度和高度:

// 获取范围对象
Microsoft.Office.Interop.Excel.Range range = worksheet.Range[rangeAddress];
// 获取范围的像素宽度和高度
int widthInPixels = (int)Math.Round(range.Width * 1.3333);
int heightInPixels = (int)Math.Round(range.Height * 1.3333);

这里的宽度和高度最后乘的那个系数其实我也不太明白为什么是1.3333,这是自己慢慢测试出来的,反正最后刚好可以截到边界,我就不深究了,有知道的望告知。

然后就是创建图片对象,然后保存到剪贴板,再粘贴保存。

这部分的代码是抄来的,看了几个别人的代码,基本是固定格式,就直接用了(其实说起来都是在抄代码,测试过后把可用的归纳出来):

// 创建位图对象
Bitmap bitmap = new Bitmap(widthInPixels, heightInPixels);
// 将范围内容复制到剪贴板
range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);
// 获取剪贴板图像数据
System.Drawing.Image clipboardImage = null;
if (System.Windows.Forms.Clipboard.ContainsImage())
{
   clipboardImage = System.Windows.Forms.Clipboard.GetImage();

   // 在位图上绘制剪贴板图像
   using (Graphics graphics = Graphics.FromImage(bitmap))
   {
      graphics.DrawImage(clipboardImage, 0, 0);
   }

   // 将位图保存为图片文件
   bitmap.Save(outputPath, ImageFormat.Jpeg); // 或者保存为PNG图片,将第二个参数改为ImageFormat.Png
}

最后释放资源即可,完整方法代码如下:

        // Excel指定范围导出JPG图片
        public static void ExcelImportToJPG(string excelPath, string startRange, string endRange, string outputPath)
        {
            string rangeAddress = startRange + ":" + endRange;

            // 创建Excel应用程序对象
            Application excelApp = new Application();
            // 打开Excel文件
            Workbook workbook = excelApp.Workbooks.Open(excelPath);
            // 获取工作表
            Worksheet worksheet = workbook.Sheets[1];
            // 获取范围对象
            Microsoft.Office.Interop.Excel.Range range = worksheet.Range[rangeAddress];
            // 获取范围的像素宽度和高度
            int widthInPixels = (int)Math.Round(range.Width * 1.3333);
            int heightInPixels = (int)Math.Round(range.Height * 1.3333);
            // 创建位图对象
            Bitmap bitmap = new Bitmap(widthInPixels, heightInPixels);
            // 将范围内容复制到剪贴板
            range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);
            // 获取剪贴板图像数据
            System.Drawing.Image clipboardImage = null;
            if (System.Windows.Forms.Clipboard.ContainsImage())
            {
                clipboardImage = System.Windows.Forms.Clipboard.GetImage();

                // 在位图上绘制剪贴板图像
                using (Graphics graphics = Graphics.FromImage(bitmap))
                {
                    graphics.DrawImage(clipboardImage, 0, 0);
                }

                // 将位图保存为图片文件
                bitmap.Save(outputPath, ImageFormat.Jpeg); // 或者保存为PNG图片,将第二个参数改为ImageFormat.Png
            }

            // 关闭和释放资源
            workbook.Close(false);
            excelApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

            // 清空剪贴板数据
            System.Windows.Forms.Clipboard.Clear();
        }

调用方法示例:

// 导出现状表图片
ExcelImportToJPG(output_excel_path + @"\现状指标表.xlsx", "B2", "G26", output_excel_path + @"\现状指标表.jpg");

这里需要注意的上,以上方法采用的是直接复制到剪贴板的方法来获取图片,因此不能设置图片的分辨率,得到的图片大小一般不大,和你直接【CTRL+C、CTRL+V】的效果是一样的,所以如果你想要分辨率较高的图片,就需要将Excel表格的行高列宽和文字大小调大,才能得到分辨率相对较高的图:

【ArcGIS Pro二次开发】(51):Excel表格内容导出图片_第4张图片

这个方法的代码量不大,完整代码上面已经贴出,就不放工程文件了。

你可能感兴趣的:(ArcGIS,ArcGIS,Pro,SDK,arcgis,excel,Arcgis,Pro,SDK,二次开发,arcgis,pro,sdk)