【ArcGIS Pro二次开发】(74):Python、C#实现Excel截图导出图片

以村庄规划制图为例,通过对现状和规划用地的统计,生成Excel格式的【空间功能结构调整表】后,需要进一步将表格导出成图片,并嵌入到图集中,这样可以实现全流程不用手动参与,让制图的流程完全自动化。

关于Excel截图的方法,从python、c#都曾经历过,虽然有些方法已经不再用,但还是记录下来。

Excel表格如下:

导出的图片如下:

基本是完美的截图。


1、Python的截图方法

python里处理Excel的库不少,我使用的是PyWin32。

其它的库可能也能实现这个功能,但我没找到。

直接上代码:

python 复制代码
import win32com.client as win32
from PIL import ImageGrab
import os

excel = win32.Dispatch('Excel.Application')
wb = excel.Workbooks.Open(excel_file)
ws = wb.WorkSheets(excel_tb)  # 打开工作簿

# 示例:截图的起始终止格
start_cell = "B2"
end_cell = "G8"

ws.Range(f"{start_cell}:{end_cell}").CopyPicture()  # 变成图片
ws.Paste(ws.Range(start_cell))  # 将图片黏贴在excel中

ws.Shapes(ws.Shapes.Count).Copy()  # 图片至剪贴板
img = ImageGrab.grabclipboard()  # 从剪贴板获取图片
img.save(output_png_path)  # 图片保存
wb.Save()  # excel保存
wb.Close()

这里的方法有曲折,相当于选定范围后,在Excel里CTRL+C,CTRL+V,然后再将粘贴后的图片复制出去。

2、C#的截图方法一:【Microsoft.Office.Interop.Excel】

【Microsoft.Office.Interop.Excel】库的功能非常强大,但它需要安装微软的Office才能使用,并且有兼容性和进程占用的问题,缺点也很明显。实际上这个方法之前也写过,这里复述一遍。

cs 复制代码
using Microsoft.Office.Interop.Excel;
using Application = Microsoft.Office.Interop.Excel.Application;
using Range = Microsoft.Office.Interop.Excel.Range;

// Excel指定范围导出JPG图片
public static void ExcelImportToJPG(string excelPath, string startRange, string endRange, string outputPath)
{
    // 在UI线程上执行添加item的操作
    System.Windows.Application.Current.Dispatcher.Invoke(() =>
    {
        // 例如:A1:G6
        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();
    });
}

3、C#的截图方法二:【Aspose.cells】

考虑到【Microsoft.Office.Interop.Excel】库的一些问题实在无法解决,后来选择了【Aspose.cells】库作为替代,那这个截图方法也得解决。

经网友【俊,】的帮助,【Aspose.cells】同样实现了这一方法,完美替代了【Microsoft.Office.Interop.Excel】。

代码如下:

cs 复制代码
using Aspose.Cells;
using Aspose.Cells.Rendering;

// Excel指定范围导出JPG图片
public static void ExcelImportToJPG(string excelPath, string Range, string outputPath)
{
    // 打开工作薄
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    LoadOptions loadOptinos = new LoadOptions(LoadFormat.Xlsx);
    Workbook wb = new Workbook(excelPath, loadOptinos);
    // 打开工作表
    Worksheet sheet = wb.Worksheets[0];
    // 定义要截图的单元格范围   例:Range = "B2:G26"
    Range range = sheet.Cells.CreateRange(Range);
    // 设置打印属性
    ImageOrPrintOptions imgOptions = new ImageOrPrintOptions();
    // 在一页内打印
    imgOptions.OnePagePerSheet = true;
    // 只打印区域内
    imgOptions.OnlyArea = true;
    // 打印
    SheetRender render = new SheetRender(sheet, imgOptions);
    render.ToImage(0, outputPath);
    // 保存
    wb.Save(excelPath);
    wb.Dispose();
}
相关推荐
凤枭香13 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺20 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森24 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁3 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev3 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理