Изменил программу. Теперь она удаляет только стиль "Финансовый". Ссылка на скачивание. P.S. Требуется установка .NET Framework 4.6.2. P.P.S. Пробуйте на копиях файлов! Исходный код:
Код
private void button1_Click(object sender, EventArgs e)
{
var dialog = new FolderBrowserDialog();
if (dialog.ShowDialog() == DialogResult.Cancel) return;
foreach (var file_path in Directory.EnumerateFiles(dialog.SelectedPath))
{
using (var zip = ZipFile.Open(file_path, ZipArchiveMode.Update))
{
var styles_entry = zip.Entries.Where(entry => entry.FullName == "xl/styles.xml").First();
using (var stream = styles_entry.Open())
{
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
var xml = XElement.Load(stream);
var cell_style = xml.Element(ns + "cellStyles")
.Elements(ns + "cellStyle")
.Where(cellStyle => cellStyle.Attribute("name").Value == "Финансовый")
.FirstOrDefault();
if(cell_style != null)
{
cell_style.Remove();
stream.Position = 0;
stream.SetLength(0L);
xml.Save(stream);
}
}
}
}
MessageBox.Show("Готово!");
}
Элли, файл отправил. Если почта не пропустит файл (из-за того, что это программа), я тогда заменю расширение файла на DOC (вместо EXE), а Вы после получения измените расширение обратно на EXE.
sz val="11" Размер шрифта 11 color theme="1" Ссылается на (здесь отклонение нет):
Код
<a:clrScheme name="Стандартная">
<a:lt1>
<!-- lt1=accent 1 color
sysClr=color bound to predefined operating system elements
val=system color value (window=Specifies window background color)
lastClr=color value that was last computed by the generating application
-->
<a:sysClr val="window" lastClr="FFFFFF"/>
</a:lt1>
</a:clrScheme>
name="Calibri" Название шрифта family val="2" Font Family=Swiss charset val="204" Character Set=RUSSIAN_CHARSET scheme val="minor" This font is the minor font for this theme.
Может, у кого-то есть какие догадки, что здесь не так?
@Maks041982 Теоретически сделать можно. Сначала с помощью Shell.Application распаковать файл, потому с помощью XML библиотеки (Microsoft XML, v6.0) сделать изменения в XML. XML, в свою очередь, использует пространство имён (namespace), поэтому это надо учесть при сканировании элементов.
SuperCat, Ваше решение устранит проблему в самом его корне. А есть возможность зайти с другой стороны? Ведь если открывать файлы вручную - то эксель сам успешно справляется с проблемой, пользователю остается лишь соглашаться с исправлениями и на сохранение файла с исправлениями. можно ли автоматизировать не само исправление файлов, и именно ответы пользователя. т.е. идеальный конечный результат такой: 1) макрос открывает очередной файл; 2) эксель ругается, предлагает исправить; 3) макрос соглашается на исправления; 4) макрос сохраняет файл под тем же именем и переходит к следующему файлу