Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
233 / 29 / 11
Регистрация: 04.06.2010
Сообщений: 293
1

Работа с колонтитулами docx через Open XML

19.07.2015, 17:09. Показов 4344. Ответов 4
Метки нет (Все метки)

Добрый день, уважаемые форумчане !
Появилась необходимость найти и заменить некоторые слова в документе *.docx. Использую для этого библиотеку Open XML. Она без проблем справляется со всем содержимым, за исключением колонтитулов. Я так понимаю, это связано с тем, что текст хранится в файле document.xml, а колонтитулы в footer№.xml. Есть ли методы для редактирования колонтитулов в этой библиотеке ?
Если с помощью Open XML редактировать колонтитулы нельзя, то подскажите, пожалуйста как это сделать с помощью Interop.
Заранее благодарю всех за оказанную помощь.

Привожу кусочек кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using DocumentFormat.OpenXml.Packaging;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        // Метод выбора документа
        private void button1_Click(object sender, EventArgs e)
        {
            LoadDoc.Filter = "Text files (*.docx)|*.docx|All files (*.*)|*.*"; // Фильтрация docx документов
            LoadDoc.FileName = "Выберите файл";
            LoadDoc.Title = "Выберите шаблонный файл из нужной папки"; // Заголовок диалогового окна
            if (LoadDoc.ShowDialog() == DialogResult.OK)
            {
                tFileName.Text = LoadDoc.FileName;
            }
        }
 
        // Метод открытия и редактирования документа
        private void button2_Click(object sender, EventArgs e)
        {
 
            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(tFileName.Text, true))
            {
                string docText = null;
                using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
                {
                    docText = sr.ReadToEnd();
                }
 
                Regex regexText = new Regex("Hello world!");
                docText = regexText.Replace(docText, "Hi Everyone!");
 
                using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
                {
                    sw.Write(docText);
                    MessageBox.Show("!");
                }
            }
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2015, 17:09
Ответы с готовыми решениями:

Не удается открыть файл OFFICE Open XML *.docx из за ошибок его содержимого
Добрый день! помогите пожалуста. Файл не открывается.

Не открывается файл Документ Office Open XML (docx) - файл поврежден, поэтому его нельзя открыть
Посмотрите, пожалуйста кто может! очень важно:cry: документ , который не отрывается. помогите...

Работа с архивами/или как извлечь xml из docx
Здравствуйте. Код: ... $objZip = new ZipArchive(); $objZip->open($_SESSION) or die('невозможно...

Работа Java с docx файлами через Docx4j
Поставлена задача получить заголовок из docx файла. Сделать не получается, нужна помощь

4
1992 / 1163 / 444
Регистрация: 20.12.2014
Сообщений: 3,088
19.07.2015, 21:48 2
Насчет Open XML можно посмотреть здесь:
https://msdn.microsoft.com/RU-... 46917.aspx
про Interop здесь:
https://msdn.microsoft.com/ru-... -snippet-1
1
233 / 29 / 11
Регистрация: 04.06.2010
Сообщений: 293
28.07.2015, 20:37  [ТС] 3
chumich, спасибо за полезные ссылки. Пару дней копаюсь, но никак не могу понять, как с помощью open xml получить доступ к нижним колонтитулам..) Если у кого-то был опыт работы с колонтитулами с помощью open xml, то был бы рад взглянуть на любой код.
Если уж не получится, то придётся распаковывать docx и править файл footer.xml. В принципе, вариант не такой уж и плохой. Буду ждать ответов, а сам пока попробую это реализовать.
0
chumich
28.07.2015, 20:40
  #4

Не по теме:

Цитата Сообщение от Бедел Посмотреть сообщение
Если у кого-то был опыт работы с колонтитулами с помощью open xml
Увы... :pardon:

0
233 / 29 / 11
Регистрация: 04.06.2010
Сообщений: 293
29.07.2015, 00:23  [ТС] 5
Если вдруг кому интересно/возникнет подобная проблема.
Поизвращался я, конечно, на славу

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public void Colontituls()
        {
            string[] colontituls = new string[9] {"НазваниеПроекта", "ШифрПроекта", "РП", "Разраб",
                                                        "Компания", "Директор", "ГИП", "Н.Контр", "Date"};
            var zip = ZipFile.Open(tFileName.Text, ZipArchiveMode.Read); // Открываем архив на чтение
            string path = @"C:\\Folder";
            zip.ExtractToDirectory(path); // Извлекаем все файлы в директорию
            string footer = ""; // Строка, куда будем считывать файл измененный колонтитул
 
            footer = FooterRead(path + "\\word\\footer1.xml"); // Вызываем функцию, которая вернет строку с измененным колонтитулом
            FooterReplace(footer, path + "\\word\\footer1.xml"); // Перезаписываем файл с колонтитулом
 
            ZipFile.CreateFromDirectory(path, @"C:\\1.docx"); // Упаковываем всю папку снова в архив
            Directory.Delete(path, true); // Удаляем папку
 
        }
 
        // Метод чтения из колонтиутла
        public string FooterRead(string footerPath)
        {
            string footer = ""; // Строка, в которой будет измененный текст
            using (StreamReader sr = new StreamReader(footerPath)) // Считываем в поток весь файл с колонтитулом
            {
                footer = sr.ReadToEnd(); // Записываем в строку этот поток
                sr.Close(); // Закрываем поток
            }
            /*
            ...
            Делаем замену нужного текста в строке
            ...
            */
 
            return footer; // Возвращаем строку с измененным колонтитулом
        }
 
        // Метод перезаписи файлов с колонтитулами
        public void FooterReplace(string footer, string footerPath)
        {
            using (StreamWriter sw = new StreamWriter(footerPath)) // Создаем поток для записи
            {
                sw.Write(footer); // Перезаписываем файл (обновляем колонтитул)
                sw.Close(); // Закрываем поток
            }
        }
Добавлено через 6 минут
Естественно, string[] colontituls тут не нужен, он случайно перенесся сюда из моего проекта, забыл удалить)

Добавлено через 2 минуты
Также добавлю, что использовались: using System.IO.Compression и ссылки (надо добавить в проект) System.IO.Compression, System.IO.Compression.SystemFile
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2015, 00:23

Ворд: работа с колонтитулами
Как программно можно получить номер раздела документа по текущему положению курсора? С уважением

Работа с колонтитулами Excel
Всем привет. Создаю программу. Необходимо, чтобы она вписывала в колонтитул файлов excel...

Работа с колонтитулами в Word
Добрый день! Подскажите пожалуйста как изменить шрифт и размер для номеров страницы в документе...

Работа с колонтитулами на VBA
Доброго времени суток! Подскажите, пожалуйста, как решить следующую задачку: Задача:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.