11using System ;
2+ using System . Collections . Generic ;
23using System . Diagnostics ;
34using System . IO ;
45using System . IO . Compression ;
5- using System . Printing ;
6- using System . Reflection . Metadata . Ecma335 ;
6+ using System . Linq ;
77using System . Text . RegularExpressions ;
88using System . Windows ;
99using System . Windows . Controls ;
@@ -19,6 +19,13 @@ public partial class MainWindow : Window
1919 public MainWindow ( )
2020 {
2121 InitializeComponent ( ) ;
22+
23+ Loaded += MainWindow_Loaded ;
24+ }
25+
26+ private void MainWindow_Loaded ( object sender , RoutedEventArgs e )
27+ {
28+ OfficeFile . Text = @"C:\Users\LanXiaofang\Desktop\表格业务相关\PPT表格测试\内嵌Excel表格.pptx" ;
2229 }
2330
2431 private void OpenOfficeFile_OnClick ( object sender , RoutedEventArgs e )
@@ -97,12 +104,37 @@ private void UnzipFile()
97104 }
98105
99106 Directory . CreateDirectory ( directory ) ;
100-
101107 ZipFile . ExtractToDirectory ( file , directory , true ) ;
102108
109+ // 这个方法对嵌入excel表格的PPT文件进行处理。
110+ UnZipOleObjectFile ( ) ;
111+
103112 Warn ( "" ) ;
104113 }
105114
115+ /// <summary>
116+ /// 这个方法对嵌入excel表格的PPT文件进行处理。
117+ /// 如果PPT文件中嵌入了Excel表格,则调用该方法对OleObj映射的xlsx文件进行解压缩。
118+ /// </summary>
119+ void UnZipOleObjectFile ( )
120+ {
121+ // 获取OleObj的映射的xlsx文件。
122+ var oleObjDirectory = Path . Combine ( OfficeFolder . Text , "ppt\\ embeddings\\ " ) ;
123+ if ( Directory . Exists ( oleObjDirectory ) )
124+ {
125+ var oleFileInfo = new DirectoryInfo ( oleObjDirectory ) ;
126+ foreach ( var fileInfo in oleFileInfo . GetFiles ( ) )
127+ {
128+ if ( fileInfo . Extension . Equals ( ".xlsx" ) )
129+ {
130+ var directoryName = Path . Combine ( fileInfo . DirectoryName , Path . GetFileNameWithoutExtension ( fileInfo . Name ) ) ;
131+ Directory . CreateDirectory ( directoryName ) ;
132+ ZipFile . ExtractToDirectory ( fileInfo . FullName , directoryName , true ) ;
133+ }
134+ }
135+ }
136+ }
137+
106138 private static void FormatXml ( string directory )
107139 {
108140 foreach ( var xmlFile in Directory . GetFiles ( directory , "*.*" , SearchOption . AllDirectories ) )
@@ -213,15 +245,65 @@ private void Zip_OnClick(object sender, RoutedEventArgs e)
213245
214246 var directory = OfficeFolder . Text ;
215247
248+ // 这个步骤是查找问价夹里是否存在oleObj元素映射的xlsx文件,并进行压缩处理。
249+ var directoryInfos = ZipOleObjectFile ( ) ;
216250 ZipFile . CreateFromDirectory ( directory , file , CompressionLevel . NoCompression , false ) ;
217251
252+ if ( directoryInfos is not null )
253+ {
254+ foreach ( var directoryInfo in directoryInfos )
255+ {
256+ // 进行恢复现场。
257+ directoryInfo . Create ( ) ;
258+ }
259+ }
218260
219261 OfficeFile . Text = file ;
220262 OfficeFolder . Text = directory ;
221263
222264 Warn ( "" ) ;
223265 }
224266
267+ /// <summary>
268+ /// 这个方法对嵌入excel表格的PPT文件进行处理。
269+ /// 如果OleObj映射的xlsx文件被解压缩,则将解压缩的问价夹压缩为xlsx文件,并删除原有文件夹。
270+ /// 如果需要恢复,使用返回值进行恢复。
271+ /// </summary>
272+ /// <returns>返回删除的文件夹的集合。</returns>
273+
274+ private DirectoryInfo [ ] ZipOleObjectFile ( )
275+ {
276+ // 获取OleObj的映射的xlsx文件。
277+ var oleObjDirectory = Path . Combine ( OfficeFolder . Text , "ppt\\ embeddings\\ " ) ;
278+ if ( Directory . Exists ( oleObjDirectory ) )
279+ {
280+ var oleFileInfo = new DirectoryInfo ( oleObjDirectory ) ;
281+ var fileInfos = oleFileInfo . GetFiles ( ) ;
282+ var deleteDirectories = new List < DirectoryInfo > ( ) ;
283+ foreach ( var directoryInfo in oleFileInfo . GetDirectories ( ) )
284+ {
285+ // 如果xlsx文件去掉后缀后与文件夹同名,那我们将认为该文件夹是由xlsx文件解压缩而来的,此时需要删除原有的xlsx文件。
286+ if ( fileInfos . Any ( fileInfo => Path . GetFileNameWithoutExtension ( fileInfo . Name ) . Equals ( directoryInfo . Name )
287+ && fileInfo . Extension . Equals ( ".xlsx" ) ) )
288+ {
289+ var fileName = Path . ChangeExtension ( directoryInfo . FullName , ".xlsx" ) ;
290+ File . Delete ( fileName ) ;
291+ ZipFile . CreateFromDirectory ( directoryInfo . FullName , fileName , CompressionLevel . NoCompression , false ) ;
292+
293+ // 必须要删除原目录,否则PPT打开错误。
294+ directoryInfo . Delete ( true ) ;
295+ deleteDirectories . Add ( directoryInfo ) ;
296+ }
297+ }
298+
299+ if ( deleteDirectories . Count > 0 )
300+ {
301+ return deleteDirectories . ToArray ( ) ;
302+ }
303+ }
304+ return null ;
305+ }
306+
225307 private string CreateFileName ( string file )
226308 {
227309 var name = Path . GetFileNameWithoutExtension ( file ) ;
0 commit comments