Skip to content

Commit 6dd135c

Browse files
authored
Merge pull request #23 from RafaelLxf/t/lanxiaofang/ZipExcel
支持PPT中嵌入Excel文件的解压缩
2 parents f411c5f + 59d0380 commit 6dd135c

1 file changed

Lines changed: 93 additions & 6 deletions

File tree

src/dotnetCampus.OfficeDocumentZipper/MainWindow.xaml.cs

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Diagnostics;
34
using System.IO;
45
using System.IO.Compression;
5-
using System.Printing;
6-
using System.Reflection.Metadata.Ecma335;
6+
using System.Linq;
77
using System.Text.RegularExpressions;
88
using System.Windows;
99
using 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

Comments
 (0)