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


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

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

    Excel表格如下:

    导出的图片如下:

    基本是完美的截图。


    1、Python的截图方法

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

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

    直接上代码:

    1. import win32com.client as win32
    2. from PIL import ImageGrab
    3. import os
    4. excel = win32.Dispatch('Excel.Application')
    5. wb = excel.Workbooks.Open(excel_file)
    6. ws = wb.WorkSheets(excel_tb) # 打开工作簿
    7. # 示例:截图的起始终止格
    8. start_cell = "B2"
    9. end_cell = "G8"
    10. ws.Range(f"{start_cell}:{end_cell}").CopyPicture() # 变成图片
    11. ws.Paste(ws.Range(start_cell)) # 将图片黏贴在excel中
    12. ws.Shapes(ws.Shapes.Count).Copy() # 图片至剪贴板
    13. img = ImageGrab.grabclipboard() # 从剪贴板获取图片
    14. img.save(output_png_path) # 图片保存
    15. wb.Save() # excel保存
    16. wb.Close()

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

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

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

    1. using Microsoft.Office.Interop.Excel;
    2. using Application = Microsoft.Office.Interop.Excel.Application;
    3. using Range = Microsoft.Office.Interop.Excel.Range;
    4. // Excel指定范围导出JPG图片
    5. public static void ExcelImportToJPG(string excelPath, string startRange, string endRange, string outputPath)
    6. {
    7. // 在UI线程上执行添加item的操作
    8. System.Windows.Application.Current.Dispatcher.Invoke(() =>
    9. {
    10. // 例如:A1:G6
    11. string rangeAddress = startRange + ":" + endRange;
    12. // 创建Excel应用程序对象
    13. Application excelApp = new Application();
    14. // 打开Excel文件
    15. Workbook workbook = excelApp.Workbooks.Open(excelPath);
    16. // 获取工作表
    17. Worksheet worksheet = workbook.Sheets[1];
    18. // 获取范围对象
    19. Microsoft.Office.Interop.Excel.Range range = worksheet.Range[rangeAddress];
    20. // 获取范围的像素宽度和高度
    21. int widthInPixels = (int)Math.Round(range.Width * 1.3333);
    22. int heightInPixels = (int)Math.Round(range.Height * 1.3333);
    23. // 创建位图对象
    24. Bitmap bitmap = new Bitmap(widthInPixels, heightInPixels);
    25. // 将范围内容复制到剪贴板
    26. range.CopyPicture(XlPictureAppearance.xlScreen, XlCopyPictureFormat.xlBitmap);
    27. // 获取剪贴板图像数据
    28. System.Drawing.Image clipboardImage = null;
    29. if (System.Windows.Forms.Clipboard.ContainsImage())
    30. {
    31. clipboardImage = System.Windows.Forms.Clipboard.GetImage();
    32. // 在位图上绘制剪贴板图像
    33. using (Graphics graphics = Graphics.FromImage(bitmap))
    34. {
    35. graphics.DrawImage(clipboardImage, 0, 0);
    36. }
    37. // 将位图保存为图片文件
    38. bitmap.Save(outputPath, ImageFormat.Jpeg); // 或者保存为PNG图片,将第二个参数改为ImageFormat.Png
    39. }
    40. // 关闭和释放资源
    41. workbook.Close(false);
    42. excelApp.Quit();
    43. System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
    44. System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
    45. System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
    46. // 清空剪贴板数据
    47. System.Windows.Forms.Clipboard.Clear();
    48. });
    49. }

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

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

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

    代码如下:

    1. using Aspose.Cells;
    2. using Aspose.Cells.Rendering;
    3. // Excel指定范围导出JPG图片
    4. public static void ExcelImportToJPG(string excelPath, string Range, string outputPath)
    5. {
    6. // 打开工作薄
    7. System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    8. LoadOptions loadOptinos = new LoadOptions(LoadFormat.Xlsx);
    9. Workbook wb = new Workbook(excelPath, loadOptinos);
    10. // 打开工作表
    11. Worksheet sheet = wb.Worksheets[0];
    12. // 定义要截图的单元格范围 例:Range = "B2:G26"
    13. Range range = sheet.Cells.CreateRange(Range);
    14. // 设置打印属性
    15. ImageOrPrintOptions imgOptions = new ImageOrPrintOptions();
    16. // 在一页内打印
    17. imgOptions.OnePagePerSheet = true;
    18. // 只打印区域内
    19. imgOptions.OnlyArea = true;
    20. // 打印
    21. SheetRender render = new SheetRender(sheet, imgOptions);
    22. render.ToImage(0, outputPath);
    23. // 保存
    24. wb.Save(excelPath);
    25. wb.Dispose();
    26. }
  • 相关阅读:
    第十八章Swing程序设计总结
    Android 蓝牙BLE串口通信之高低位转换、16进制字符串转换float浮点型
    mysql 锁总结
    Performing Inference In INT8 Precision
    人工智能申报!武汉市人工智能创新专项项目申报要求、流程和申报限制
    一、C#冒泡排序算法
    Patroin源码修改八:初始化Opengauss
    【数据结构与算法】泛型的介绍及使用
    设计模式之适配器模式
    Golang Struct 继承的深入讨论和细节
  • 原文地址:https://blog.csdn.net/xcc34452366/article/details/134233272