C# PPT Operator
来自:http://blog.csdn.net/lxzh12345/article/details/47047491
最近在写一个工具,设计到将界面内容到处到PPT中,且导出的内容能够编辑。网上搜了很多C#导出到PPT的方法,无非都是官方文档稍微改改到处传。因此结合MSDN的文档外加自己的摸索,将对PPT的操作封装了一下,里面包含几个常用的方法:添加文本框、直线、箭头、矩形、图片。后面有机会再继续扩展。
注:这里只给出了封装的类,直接使用可能会有问题,记得添加Office2007对应组件的引用。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Microsoft.Office.Core;
- using PPT = Microsoft.Office.Interop.PowerPoint;
- using System.Windows;
- using System.Collections;
- using System.Windows.Forms;
- using System.IO;
- using System.Reflection;
- using Tools.functionModel.file;
- using System.Drawing;
- using System.Drawing.Imaging;
- //using System.Windows.Controls;
- namespace Tools.baseModel.common {
- /// <summary>
- /// PPT文档操作实现类.
- /// </summary>
- public class pptBase {
- private string temPath = "";
- private string pptPath = "";
- #region=========基本的参数信息=======
- PPT.Application pptApp; //PPT应用程序变量
- public PPT.Application PptApp {
- get { return pptApp; }
- set { pptApp = value; }
- }
- PPT.Presentation pptDoc; //PPT文档变量
- PPT.Slides pptSlides = null;
- PPT.Slide pptSlide = null;
- private int pageCount=0;
- #endregion
- public PPT.Shapes Shapes {
- get { return pptSlide.Shapes; }
- }
- public pptBase(string path) {
- this.temPath = commonPath.fiberFolder + "/other/template.pot";
- this.pptPath = path;
- //如果已存在,则删除
- if (File.Exists((string)pptPath)) {
- File.Delete((string)pptPath);
- }
- FileInfo file = new FileInfo(this.temPath);
- pptApp = new PPT.Application(); //初始化
- pptApp.Visible = MsoTriState.msoTrue;
- pptDoc = pptApp.Presentations.Open(file.FullName, MsoTriState.msoFalse, MsoTriState.msoTrue, MsoTriState.msoTrue);
- pptSlides = pptDoc.Slides;
- //pptDoc = pptApp.Presentations.Add(Microsoft.Office.Core.MsoTriState.msoFalse);
- }
- public void AddPage() {
- pageCount++;
- //pptDoc.Slides.Add(pageCount, PPT.PpSlideLayout.ppLayoutText);
- pptSlide = pptSlides.Add(pageCount, PPT.PpSlideLayout.ppLayoutTitleOnly);
- }
- public void InsertPage(int index) {
- PPT.CustomLayout ppLayout = pptSlide.CustomLayout;
- pptSlide = pptSlides.AddSlide(index, ppLayout);
- pageCount++;
- }
- #region 添加文本框
- public PPT.Shape drawText(PPT.Shapes shapes, pptText textBox) {
- PPT.Shape shape = null;
- if (textBox == null || textBox.Location.IsEmpty || textBox.FrameSize.IsEmpty)
- return shape;
- shape = shapes.AddTextbox(textBox.Orientation, textBox.X, textBox.Y, textBox.Width, textBox.Height);
- shape.TextFrame.HorizontalAnchor = textBox.HorizontalAnchor;
- shape.TextFrame.VerticalAnchor = textBox.VerticalAnchor;
- shape.TextFrame.TextRange.Font.Color.RGB = colorFormat(textBox.ForeColor);
- shape.TextFrame.TextRange.Font.Bold = textBox.Font.Bold ? MsoTriState.msoTrue : MsoTriState.msoFalse;
- shape.TextFrame.TextRange.Font.Italic = textBox.Font.Italic ? MsoTriState.msoTrue : MsoTriState.msoFalse;
- shape.TextFrame.TextRange.Font.Underline = textBox.Font.Underline ? MsoTriState.msoTrue : MsoTriState.msoFalse;
- shape.TextFrame.TextRange.Font.Size = textBox.Font.Size;
- shape.TextFrame.TextRange.Font.Name = textBox.Font.Name;
- shape.TextFrame.MarginLeft = 0;
- shape.TextFrame.MarginRight = 0;
- if (textBox.BackColor == Color.Transparent) {
- shape.Fill.Visible = Microsoft.Office.Core.MsoTriState.msoFalse;
- } else {
- shape.Fill.BackColor.RGB = colorFormat(textBox.BackColor);
- }
- shape.Line.Weight = textBox.BoardWeight;
- if (textBox.BoardColor == Color.Transparent) {
- shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoFalse;
- } else {
- shape.Line.BackColor.RGB = colorFormat(textBox.BoardColor);
- }
- shape.Line.DashStyle = textBox.BoardStyle;
- shape.TextFrame.TextRange.Text = textBox.Text;
- return shape;
- }
- #endregion
- #region 添加基本图形
- //画直线
- public PPT.Shape drawLine(PPT.Shapes shapes, float beginX, float beginY, float endX, float endY) {
- PPT.Shape shape = shapes.AddLine(beginX, beginY, endX, endY);
- return shape;
- }
- //画直线
- public PPT.Shape drawLine(PPT.Shapes shapes, float beginX, float beginY, float endX, float endY, float weight, Color foreColor) {
- PPT.Shape shape = shapes.AddLine(beginX, beginY, endX, endY);
- shape.Line.ForeColor.RGB = colorFormat(foreColor); //线条颜色
- shape.Line.Weight = weight; //线条粗细
- return shape;
- }
- //画矩形
- public PPT.Shape drawRectangle(PPT.Shapes shapes, float beginX, float beginY, float width, float height) {
- PPT.Shape shape = shapes.AddShape(MsoAutoShapeType.msoShapeRectangle, beginX, beginY, width, height);
- return shape;
- }
- //画矩形
- public PPT.Shape drawRectangle(PPT.Shapes shapes, float beginX, float beginY, float width, float height, float weight, Color foreColor, Color backColor) {
- PPT.Shape shape = shapes.AddShape(MsoAutoShapeType.msoShapeRectangle, beginX, beginY, width, height);
- shape.Line.ForeColor.RGB = colorFormat(foreColor); //线条颜色
- shape.Fill.BackColor.RGB = colorFormat(backColor); //填充颜色
- shape.Line.Weight = weight; //线条粗细
- return shape;
- }
- //画箭头
- public PPT.Shape drawArrow(PPT.Shapes shapes, float beginX, float beginY, float endX, float endY,float weight) {
- float width=(float)Math.Sqrt(Math.Pow(endX-beginX,2)+Math.Pow(endY-beginY,2));
- float startX = (beginX + endX) / 2-width/2;
- float startY = (beginY + endY) / 2;
- float angle = endX==beginX?(endY>beginY?90:-90):(float)Math.Atan((endY - beginY) / (endX - beginX));
- angle = (float)(angle / Math.PI * 180.0);
- angle = angle < 0 ? 180.0f + angle : angle;
- PPT.Shape shape = shapes.AddShape(MsoAutoShapeType.msoShapeRightArrow, startX, startY, width, weight);
- shape.Rotation = angle;
- return shape;
- }
- //画箭头
- public PPT.Shape drawRightArrow(PPT.Shapes shapes, float beginX, float beginY, float endX, float endY, float weight, Color foreColor, Color backColor) {
- PPT.Shape shape = drawArrow(shapes, beginX, beginY, endX, endY, weight);
- shape.Line.ForeColor.RGB = colorFormat(foreColor); //线条颜色
- shape.Fill.BackColor.RGB = colorFormat(backColor); //填充颜色
- return shape;
- }
- #endregion
- #region 添加图片
- public PPT.Shape AddPicture(PPT.Shapes shapes, string picPath, float beginX, float beginY, float width, float height) {
- PPT.Shape shape = null;
- if (!File.Exists(picPath)) {
- throw new Exception("图片文件不存在!");
- } else {
- shape = shapes.AddPicture(picPath, MsoTriState.msoFalse, MsoTriState.msoTrue, beginX, beginY, width, height);
- }
- return shape;
- }
- public PPT.Shape AddPicture(PPT.Shapes shapes, Bitmap bitmap, float beginX, float beginY, float width, float height) {
- PPT.Shape shape = null;
- string picPath=System.IO.Path.GetTempPath()+"bitmap.bmp";
- bitmap.Save(picPath, ImageFormat.Bmp);
- shape = shapes.AddPicture(picPath, MsoTriState.msoFalse, MsoTriState.msoTrue, beginX, beginY, width, height);
- return shape;
- }
- #endregion
- public void Close() {
- try {
- //WdSaveFormat为PPT文档的保存格式
- PPT.PpSaveAsFileType format = PPT.PpSaveAsFileType.ppSaveAsDefault;
- //将pptDoc文档对象的内容保存为PPT文档
- pptDoc.SaveAs(pptPath, format, Microsoft.Office.Core.MsoTriState.msoFalse);
- //关闭pptDoc文档对象
- pptDoc.Close();
- //关闭pptApp组件对象
- pptApp.Quit();
- } catch (Exception ex) {
- outPrint.appendText("保存或关闭PPT出错,错误信息:" + ex.Message);
- }
- }
- /// <summary>
- /// 系统颜色转换为PPT支持的颜色值
- /// </summary>
- private int colorFormat(System.Drawing.Color color) {
- int value = ((color.B * 256 + color.G) * 256) + color.R;//Office RGB与 System.Drawing.Color.RGB顺序相反
- return value;
- }
- }
- }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using OFFICECORE = Microsoft.Office.Core; using POWERPOINT = Microsoft.Office.Interop.PowerPoint; using System.Windows; using System.Collections; using System.Windows.Controls; namespace PPTDraw.PPTOperate { /// <summary> /// PPT文档操作实现类. /// </summary> public class OperatePPT { #region=========基本的参数信息======= POWERPOINT.Application objApp = null ; POWERPOINT.Presentation objPresSet = null ; POWERPOINT.SlideShowWindows objSSWs; POWERPOINT.SlideShowTransition objSST; POWERPOINT.SlideShowSettings objSSS; POWERPOINT.SlideRange objSldRng; bool bAssistantOn; double pixperPoint = 0; double offsetx = 0; double offsety = 0; #endregion #region===========操作方法============== /// <summary> /// 打开PPT文档并播放显示。 /// </summary> /// <param name="filePath">PPT文件路径</param> public void PPTOpen( string filePath) { //防止连续打开多个PPT程序. if ( this .objApp != null ) { return ; } try { objApp = new POWERPOINT.Application(); //以非只读方式打开,方便操作结束后保存. objPresSet = objApp.Presentations.Open(filePath, OFFICECORE.MsoTriState.msoFalse, OFFICECORE.MsoTriState.msoFalse, OFFICECORE.MsoTriState.msoFalse); //Prevent Office Assistant from displaying alert messages: bAssistantOn = objApp.Assistant.On; objApp.Assistant.On = false ; objSSS = this .objPresSet.SlideShowSettings; objSSS.Run(); } catch (Exception ex) { this .objApp.Quit(); } } /// <summary> /// 自动播放PPT文档. /// </summary> /// <param name="filePath">PPTy文件路径.</param> /// <param name="playTime">翻页的时间间隔.【以秒为单位】</param> public void PPTAuto( string filePath, int playTime) { //防止连续打开多个PPT程序. if ( this .objApp != null ) { return ; } objApp = new POWERPOINT.Application(); objPresSet = objApp.Presentations.Open(filePath, OFFICECORE.MsoTriState.msoCTrue, OFFICECORE.MsoTriState.msoFalse, OFFICECORE.MsoTriState.msoFalse); // 自动播放的代码(开始) int Slides = objPresSet.Slides.Count; int [] SlideIdx = new int [Slides]; for ( int i = 0; i < Slides; i++) { SlideIdx[i] = i + 1; }; objSldRng = objPresSet.Slides.Range(SlideIdx); objSST = objSldRng.SlideShowTransition; //设置翻页的时间. objSST.AdvanceOnTime = OFFICECORE.MsoTriState.msoCTrue; objSST.AdvanceTime = playTime; //翻页时的特效! objSST.EntryEffect = POWERPOINT.PpEntryEffect.ppEffectCircleOut; //Prevent Office Assistant from displaying alert messages: bAssistantOn = objApp.Assistant.On; objApp.Assistant.On = false ; //Run the Slide show from slides 1 thru 3. objSSS = objPresSet.SlideShowSettings; objSSS.StartingSlide = 1; objSSS.EndingSlide = Slides; objSSS.Run(); //Wait for the slide show to end. objSSWs = objApp.SlideShowWindows; while (objSSWs.Count >= 1) System.Threading.Thread.Sleep(playTime * 100); this .objPresSet.Close(); this .objApp.Quit(); } /// <summary> /// PPT下一页。 /// </summary> public void NextSlide() { if ( this .objApp != null ) this .objPresSet.SlideShowWindow.View.Next(); } /// <summary> /// PPT上一页。 /// </summary> public void PreviousSlide() { if ( this .objApp != null ) this .objPresSet.SlideShowWindow.View.Previous(); } /// <summary> /// 对当前的PPT页面进行图片插入操作。 /// </summary> /// <param name="alImage">图片对象信息数组</param> /// <param name="offsetx">插入图片距离左边长度</param> /// <param name="pixperPoint">距离比例值</param> /// <returns>是否添加成功!</returns> public bool InsertToSlide(List<PPTOBJ> listObj) { bool InsertSlide = false ; if ( this .objPresSet != null ) { this .SlideParams(); int slipeint = objPresSet.SlideShowWindow.View.CurrentShowPosition; foreach (PPTOBJ myobj in listObj) { objPresSet.Slides[slipeint].Shapes.AddPicture( myobj.Path, //图片路径 OFFICECORE.MsoTriState.msoFalse, OFFICECORE.MsoTriState.msoTrue, ( float )((myobj.X - this .offsetx) / this .pixperPoint), //插入图片距离左边长度 ( float )(myobj.Y / this .pixperPoint), //插入图片距离顶部高度 ( float )(myobj.Width / this .pixperPoint), //插入图片的宽度 ( float )(myobj.Height / this .pixperPoint) //插入图片的高度 ); } InsertSlide = true ; } return InsertSlide; } /// <summary> /// 计算InkCanvas画板上的偏移参数,与PPT上显示图片的参数。 /// 用于PPT加载图片时使用 /// </summary> private void SlideParams() { double slideWidth = this .objPresSet.PageSetup.SlideWidth; double slideHeight = this .objPresSet.PageSetup.SlideHeight; double inkCanWidth = SystemParameters.PrimaryScreenWidth; //inkCan.ActualWidth; double inkCanHeight = SystemParameters.PrimaryScreenHeight; //inkCan.ActualHeight ; if ((slideWidth / slideHeight) > (inkCanWidth / inkCanHeight)) { this .pixperPoint = inkCanHeight / slideHeight; this .offsetx = 0; this .offsety = (inkCanHeight - slideHeight * this .pixperPoint) / 2; } else { this .pixperPoint = inkCanHeight / slideHeight; this .offsety = 0; this .offsetx = (inkCanWidth - slideWidth * this .pixperPoint) / 2; } } /// <summary> /// 关闭PPT文档。 /// </summary> public void PPTClose() { //装备PPT程序。 if ( this .objPresSet != null ) { //判断是否退出程序,可以不使用。 //objSSWs = objApp.SlideShowWindows; //if (objSSWs.Count >= 1) //{ if (MessageBox.Show( "是否保存修改的笔迹!" , "提示" , MessageBoxButton.OKCancel) == MessageBoxResult.OK) this .objPresSet.Save(); //} //this.objPresSet.Close(); } if ( this .objApp != null ) this .objApp.Quit(); GC.Collect(); } #endregion } } |
主要实现将ppt转换成html的功能,方法很多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | using System; using System.Collections.Generic; using System.Text; using System.IO; using PPT = Microsoft.Office.Interop.PowerPoint; using System.Reflection; namespace WritePptDemo { class Program { static void Main( string [] args) { string path; //文件路径变量 PPT.Application pptApp; //PPT应用程序变量 PPT.Presentation pptDoc; //PPT文档变量 PPT.Presentation pptDoctmp; path = @"C:\MyPPT.ppt" ; //路径 pptApp = new PPT.ApplicationClass(); //初始化 //如果已存在,则删除 if (File.Exists(( string )path)) { File.Delete(( string )path); } //由于使用的是COM库,因此有许多变量需要用Nothing代替 Object Nothing = Missing.Value; pptDoc = pptApp.Presentations.Add(Microsoft.Office.Core.MsoTriState.msoFalse); pptDoc.Slides.Add(1, Microsoft.Office.Interop.PowerPoint.PpSlideLayout.ppLayoutText); string text = "示例文本" ; foreach (PPT.Slide slide in pptDoc.Slides) { foreach (PPT.Shape shape in slide.Shapes) { shape.TextFrame.TextRange.InsertAfter(text); } } //WdSaveFormat为Excel文档的保存格式 PPT.PpSaveAsFileType format = PPT.PpSaveAsFileType.ppSaveAsDefault; //将excelDoc文档对象的内容保存为XLSX文档 pptDoc.SaveAs(path, format, Microsoft.Office.Core.MsoTriState.msoFalse); //关闭excelDoc文档对象 pptDoc.Close(); //关闭excelApp组件对象 pptApp.Quit(); Console.WriteLine(path + " 创建完毕!" ); Console.ReadLine(); string pathHtml = @"c:\MyPPT.html" ; PPT.Application pa = new PPT.ApplicationClass(); pptDoctmp = pa.Presentations.Open(path, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoFalse); PPT.PpSaveAsFileType formatTmp = PPT.PpSaveAsFileType.ppSaveAsHTML; pptDoctmp.SaveAs(pathHtml, formatTmp, Microsoft.Office.Core.MsoTriState.msoFalse); pptDoctmp.Close(); pa.Quit(); Console.WriteLine(pathHtml + " 创建完毕!" ); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理