none
如何使用VSTO获取Excel中所有图片并导出成图片 RRS feed

  • 问题

  • 公司有个Excel表格,其中有很多图片,图片对应一条记录。

    现在需要把Excel中的图片全部导出,导出时需要知道图片所在行列号,需要和行记录有联系(取行记录主键作为图片文件名),请教各位大侠如何实现?


    Sonny.Lin

    2017年9月23日 15:26

答案

  • 问题解决!

    把解决代码贴一下,为有相同需求的人提供帮助。

    见Excel中有4个图形,三个是外部加入的图片,一个是内置图形,现在需要导出三张图片。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Office.Tools.Ribbon;
    using ex = Microsoft.Office.Interop.Excel;
    using System.Windows.Forms;
    
    namespace ExportPics
    {
        public partial class Ribbon1
        {
            private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
            {
    
            }                     
    
            private void btnExport_Click(object sender, RibbonControlEventArgs e)
            {      
                ex.Worksheet sheet1 = (ex.Worksheet)Globals.ThisWorkbook.Sheets[1];
                ex.ChartObjects charts = sheet1.ChartObjects();
    
                int count = 0;
                for(int i = 1; i <= sheet1.Shapes.Count; i++)
                {
                    //获取图形对象
                    ex.Shape shape = sheet1.Shapes.Item(i);
                    //System.Diagnostics.Debug.WriteLine(shape.ShapeStyle);
                    //判断是否是非预设的图形
                    if (shape.ShapeStyle != Microsoft.Office.Core.MsoShapeStyleIndex.msoShapeStyleNotAPreset) continue;
                    //行号
                    int row = shape.TopLeftCell.Row;
                    //列号
                    int column = shape.TopLeftCell.Column;
                    //复制图片
                    shape.CopyPicture();
                    ex.ChartObject co = charts.Add(0, 0, shape.Width, shape.Height);
                    co.Chart.Paste();
                    //导出图形
                    co.Chart.Export("E:/TEMP/2/p" + row+column + ".jpg","jpg");
                    co.Delete();
                    count++;
                }
                MessageBox.Show("export " + count + " pictures.");
            }
        }
    }
    

    导出后的结果。

    下载:链接: https://pan.baidu.com/s/1skTKuap 密码: 6us4


    Sonny.Lin

    • 已标记为答案 qing2000 2017年9月24日 13:37
    2017年9月24日 13:37

全部回复

  • 问题解决!

    把解决代码贴一下,为有相同需求的人提供帮助。

    见Excel中有4个图形,三个是外部加入的图片,一个是内置图形,现在需要导出三张图片。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Office.Tools.Ribbon;
    using ex = Microsoft.Office.Interop.Excel;
    using System.Windows.Forms;
    
    namespace ExportPics
    {
        public partial class Ribbon1
        {
            private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
            {
    
            }                     
    
            private void btnExport_Click(object sender, RibbonControlEventArgs e)
            {      
                ex.Worksheet sheet1 = (ex.Worksheet)Globals.ThisWorkbook.Sheets[1];
                ex.ChartObjects charts = sheet1.ChartObjects();
    
                int count = 0;
                for(int i = 1; i <= sheet1.Shapes.Count; i++)
                {
                    //获取图形对象
                    ex.Shape shape = sheet1.Shapes.Item(i);
                    //System.Diagnostics.Debug.WriteLine(shape.ShapeStyle);
                    //判断是否是非预设的图形
                    if (shape.ShapeStyle != Microsoft.Office.Core.MsoShapeStyleIndex.msoShapeStyleNotAPreset) continue;
                    //行号
                    int row = shape.TopLeftCell.Row;
                    //列号
                    int column = shape.TopLeftCell.Column;
                    //复制图片
                    shape.CopyPicture();
                    ex.ChartObject co = charts.Add(0, 0, shape.Width, shape.Height);
                    co.Chart.Paste();
                    //导出图形
                    co.Chart.Export("E:/TEMP/2/p" + row+column + ".jpg","jpg");
                    co.Delete();
                    count++;
                }
                MessageBox.Show("export " + count + " pictures.");
            }
        }
    }
    

    导出后的结果。

    下载:链接: https://pan.baidu.com/s/1skTKuap 密码: 6us4


    Sonny.Lin

    • 已标记为答案 qing2000 2017年9月24日 13:37
    2017年9月24日 13:37
  • Hi Sonny.Lin,

    感谢分享你的解决方案。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年9月26日 1:13
    版主