Skip to content

Commit c8a5718

Browse files
author
兰小方
committed
支持解压缩PPT中嵌入的Excel文件。
1 parent f411c5f commit c8a5718

1 file changed

Lines changed: 85 additions & 3 deletions

File tree

src/dotnetCampus.OfficeDocumentZipper/MainWindow.xaml.cs

Lines changed: 85 additions & 3 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;
@@ -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

Comments
 (0)