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 ;
@@ -97,12 +97,37 @@ private void UnzipFile()
9797 }
9898
9999 Directory . CreateDirectory ( directory ) ;
100+ System . IO . Compression . ZipFile . ExtractToDirectory ( file , directory , true ) ;
100101
101- ZipFile . ExtractToDirectory ( file , directory , true ) ;
102+ // 这个方法对嵌入excel表格的PPT文件进行处理。
103+ UnZipOleObjectFile ( ) ;
102104
103105 Warn ( "" ) ;
104106 }
105107
108+ /// <summary>
109+ /// 这个方法对嵌入excel表格的PPT文件进行处理。
110+ /// 如果PPT文件中嵌入了Excel表格,则调用该方法对OleObj映射的xlsx文件进行解压缩。
111+ /// </summary>
112+ private void UnZipOleObjectFile ( )
113+ {
114+ // 获取OleObj的映射的xlsx文件。
115+ var oleObjDirectory = Path . Combine ( OfficeFolder . Text , "ppt\\ embeddings\\ " ) ;
116+ if ( Directory . Exists ( oleObjDirectory ) )
117+ {
118+ var oleFileInfo = new DirectoryInfo ( oleObjDirectory ) ;
119+ foreach ( var fileInfo in oleFileInfo . GetFiles ( ) )
120+ {
121+ if ( fileInfo . Extension . Equals ( ".xlsx" , StringComparison . OrdinalIgnoreCase ) )
122+ {
123+ var directoryName = Path . Combine ( fileInfo . DirectoryName , Path . GetFileNameWithoutExtension ( fileInfo . Name ) ) ;
124+ Directory . CreateDirectory ( directoryName ) ;
125+ System . IO . Compression . ZipFile . ExtractToDirectory ( fileInfo . FullName , directoryName , true ) ;
126+ }
127+ }
128+ }
129+ }
130+
106131 private static void FormatXml ( string directory )
107132 {
108133 foreach ( var xmlFile in Directory . GetFiles ( directory , "*.*" , SearchOption . AllDirectories ) )
@@ -191,7 +216,10 @@ private void Explorer_OnClick(object sender, RoutedEventArgs e)
191216 Warn ( "" ) ;
192217 }
193218
194- private void Zip_OnClick ( object sender , RoutedEventArgs e )
219+ /// <summary>
220+ /// 压缩PPT文件。
221+ /// </summary>
222+ private void ZipFile ( )
195223 {
196224 if ( ! CheckFolderExists ( ) )
197225 {
@@ -213,15 +241,62 @@ private void Zip_OnClick(object sender, RoutedEventArgs e)
213241
214242 var directory = OfficeFolder . Text ;
215243
216- ZipFile . CreateFromDirectory ( directory , file , CompressionLevel . NoCompression , false ) ;
244+ // 这个步骤是查找文件夹里是否存在oleObj元素映射的xlsx文件,并进行压缩处理。
245+ ZipOleObjectFile ( ) ;
246+
247+ System . IO . Compression . ZipFile . CreateFromDirectory ( directory , file , CompressionLevel . NoCompression , false ) ;
217248
249+ // 还原ZipOleObjectFile方法删除的Excel文件解压出来的文件夹。
250+ UnZipOleObjectFile ( ) ;
218251
219252 OfficeFile . Text = file ;
220253 OfficeFolder . Text = directory ;
221254
222255 Warn ( "" ) ;
223256 }
224257
258+ private void Zip_OnClick ( object sender , RoutedEventArgs e )
259+ {
260+ // 涉及IO操作,最好捕获一下异常。
261+ try
262+ {
263+ ZipFile ( ) ;
264+ }
265+ catch ( Exception exception )
266+ {
267+ Warn ( exception . ToString ( ) ) ;
268+ }
269+ }
270+
271+ /// <summary>
272+ /// 这个方法对嵌入excel表格的PPT文件进行处理。
273+ /// 如果OleObj映射的xlsx文件被解压缩,则将解压缩的文件夹压缩为xlsx文件,并删除原有文件夹。
274+ /// </summary>
275+ private void ZipOleObjectFile ( )
276+ {
277+ // 获取OleObj的映射的xlsx文件。
278+ var oleObjDirectory = Path . Combine ( OfficeFolder . Text , "ppt\\ embeddings\\ " ) ;
279+ if ( Directory . Exists ( oleObjDirectory ) )
280+ {
281+ var oleFileInfo = new DirectoryInfo ( oleObjDirectory ) ;
282+ var fileInfos = oleFileInfo . GetFiles ( ) ;
283+ foreach ( var directoryInfo in oleFileInfo . GetDirectories ( ) )
284+ {
285+ // 如果xlsx文件去掉后缀后与文件夹同名,那我们将认为该文件夹是由xlsx文件解压缩而来的,此时需要替换原有的 xlsx 文件并删除 xlsx 对应的文件夹。
286+ if ( fileInfos . Any ( fileInfo => Path . GetFileNameWithoutExtension ( fileInfo . Name ) . Equals ( directoryInfo . Name )
287+ && fileInfo . Extension . Equals ( ".xlsx" , StringComparison . OrdinalIgnoreCase ) ) )
288+ {
289+ var fileName = Path . ChangeExtension ( directoryInfo . FullName , ".xlsx" ) ;
290+ File . Delete ( fileName ) ;
291+ System . IO . Compression . ZipFile . CreateFromDirectory ( directoryInfo . FullName , fileName , CompressionLevel . NoCompression , false ) ;
292+
293+ // 必须要删除原目录,否则PPT打开错误。
294+ directoryInfo . Delete ( true ) ;
295+ }
296+ }
297+ }
298+ }
299+
225300 private string CreateFileName ( string file )
226301 {
227302 var name = Path . GetFileNameWithoutExtension ( file ) ;
@@ -314,7 +389,19 @@ private string GetFile()
314389
315390 private void ZipAndOpen_OnClick ( object sender , RoutedEventArgs e )
316391 {
317- Zip_OnClick ( sender , e ) ;
392+ // 涉及IO操作,最好捕获一下异常。
393+ try
394+ {
395+ ZipFile ( ) ;
396+ }
397+ catch ( Exception exception )
398+ {
399+ Warn ( exception . ToString ( ) ) ;
400+
401+ // 异常了就没必要打开PPT文件了。
402+ return ;
403+ }
404+
318405 OpenOfficeFile_OnClick ( sender , e ) ;
319406 }
320407
0 commit comments