未保存PowerPoint图表数据

Powerpoint chart data not saved(未保存PowerPoint图表数据)
本文介绍了未保存PowerPoint图表数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在C#中使用了一些办公自动化功能来更改PowerPoint中的幻灯片。

由于某些Windows更新(尚未找到),因此不会保存所包含的EXCEL中更改的图表数据。

保存的PowerPoint文件似乎没有问题,但在尝试编辑图表数据时,更改为旧值。

是否有人有相同的行为?

我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Excel = Microsoft.Office.Interop.Excel;

namespace PowerpointAutomation
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "pptx|*.pptx";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show("changing chart data");

                string m_filename = openFileDialog1.FileName;
                string fullPath = System.IO.Path.GetFullPath(m_filename);
                string fileName = System.IO.Path.GetFileNameWithoutExtension(m_filename);

                PowerPoint.Application objApp = new PowerPoint.Application();
                PowerPoint.Presentations objPresSet = objApp.Presentations;
                PowerPoint._Presentation objPres = objPresSet.Open(m_filename, MsoTriState./*msoTrue*/msoFalse, MsoTriState./*msoTrue*/msoFalse, MsoTriState.msoFalse);
                PowerPoint.Slides objSlides = objPres.Slides;
                foreach (PowerPoint._Slide objSlide in objSlides)
                {
                    PowerPoint.Shapes objShapes = objSlide.Shapes;
                    foreach (PowerPoint.Shape objShape in objShapes)
                    {
                        switch (objShape.Type)
                        {
                            case MsoShapeType.msoChart:
                                if (objShape.HasChart == MsoTriState.msoTrue)
                                {
                                    PowerPoint.Chart mychart = objShape.Chart;
                                    PowerPoint.ChartData mydata = mychart.ChartData;
                                    mydata.Activate();
                                    ((Excel.Workbook)mydata.Workbook).Application.Visible = false;
                                    Excel.Workbook mywkb = mydata.Workbook as Excel.Workbook;
                                    Excel._Worksheet mysheet = (Excel._Worksheet)mywkb.Worksheets[1];
                                    Excel.Range usedRange = mysheet.UsedRange;
                                    string address = usedRange.Address;
                                    
                                    usedRange.Clear();

                                    //
                                    Excel::Range newCellsRange = mysheet.Cells;
                                    int axisCategories = 10;
                                    int serieCount = 1;
                                    int i = 0;
                                    for (i = 1; i <= axisCategories; i++)
                                    {
                                        newCellsRange.set_Item(1, i + 1, string.Format("cat{0}", i - 1));
                                    }
                                    for (i = 1; i <= serieCount; i++)
                                    {
                                        newCellsRange.set_Item(i + 1, 1, string.Format("serie{0}", i));
                                    }
                                    Random random = new Random(15);
                                    for (int r = 1; r <= serieCount; r++)
                                    {
                                        for (int c = 1; c <= axisCategories; c++)
                                        {
                                            newCellsRange.set_Item(r + 1, c + 1, random.Next(10, 1000));
                                        }
                                    }

                                    usedRange = mysheet.UsedRange;
                                    string sAddress = "=Sheet1!";
                                    sAddress += usedRange.Address;
                                    mychart.SetSourceData(sAddress);
                                    //just to make sure that is changed
                                    string excelFileSaved = fullPath.Replace(fileName+".pptx", "changedexcel.xlsx");
                                    mywkb.SaveCopyAs(@excelFileSaved);
                                    mywkb.RefreshAll();
                                    mychart.Refresh();
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
                string newFileName = fileName + "_NEW";
                string newFullPath = fullPath.Replace(fileName, newFileName);
                objPres.SaveAs(@newFullPath, PowerPoint.PpSaveAsFileType.ppSaveAsDefault, MsoTriState.msoTrue);
                
                MessageBox.Show("saved");

                objPres.Close();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objPres);
                objPres = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);
                objApp = null;
            }
        }
    }
}

推荐答案

似乎除了"Mirco"之外,没有人使用Microsoft.Office.Interop.PowerPoint。 问题已解决

这篇关于未保存PowerPoint图表数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)