С# NPOI Word .docx Чтение Запись Редактирование?

Доброго времени суток!

У меня вопрос может кто из присутствующих работал с библиотекой NPOI, меня интересует работа с Word .docx . А точнее изменение/заполнение шаблонов на сервере и передача их пользователю.

Там в "паутине" как то все сильно запутанно и не совсем понятно.

Что я научился делать:
1. Открывать шаболн .docx
2. Искать строчку текста и заменять ее на интересующую меня информацию
ну и так по мелочи...

Но это чисто пальцем в небо, может кто работал с данной библиотекой и решал подобные задачи и не против поделиться своим прокомментированным кодом? :)

public static byte[] Fill(string path, List<WordValue> values)
        {
            XWPFDocument doc;

            try
            {
                using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    try
                    {
                        doc = new XWPFDocument(fs);
                    }
                    catch
                    {
                        doc = null;
                    }

                    foreach (var p in doc.BodyElements)
                    {
                        if (p.ElementType == BodyElementType.PARAGRAPH)
                        {
                            var paragraph = (XWPFParagraph) p;
                            if (paragraph.Text != "" && paragraph.Text.Contains("#*"))
                            {
                                int i = 0;
                            }
                        }

                        if (p.ElementType == BodyElementType.TABLE)
                        {
                            var table = (XWPFTable)p;
                            if (table.Text != "" && table.Text.Contains("#*"))
                            {
                                int i = 0;
                                Regex rx = new Regex(@"#\*.*?#\*");
                                MatchCollection matchCollect = rx.Matches(table.Text);
                                string text = ProcessWordValue(table.Text, matchCollect, values); // тут мы улетаем заменяем и т.д

                                int b = 0;
                            }
                        }
                    }

                    //сохраним изменения
                    using (var stream = new MemoryStream())
                    {
                        doc.Write(stream);
                        stream.Seek(0, SeekOrigin.Begin); //ставим поток в начало
                        return stream.ToArray();
                    }
                }
            }
            catch (Exception ex) //ошибка открытия
            {
                return null;
            }
        }


В интернете не нашел не одного путевого мана, по крайней мере для моего понимания, если у кого то лежит под рукой буду признателен ссылке для изучения :)

Заранее благодарен!)

Ну и да я видел другие библиотеки для работы с Word, но у меня скажем такая задача, справиться с использованием этой библиотеки, и отступать я не хочу :)
  • Вопрос задан
  • 2955 просмотров
Пригласить эксперта
Ответы на вопрос 2
newross
@newross
Product owner
Разбирался с NPOI по этой документации https://github.com/nissl-lab/npoi/wiki/Getting-Sta...
Мой код тебе не поможет, могу дать пару советов:
- не генерируй весь документ с нуля, используй шаблоны. Оставь в шаблоне плейсхолдеры типа {CustomerName} и заменяй их на нужный тебе текст
- при копировании параграфов, строк в таблице и т.п. у NPOI течет память. Чтобы избежать этого, надо писать свои костыли
Ответ написан
Для поиска и замены я вот так делал. Метод написан для asp core. Он заменяет данные в тексте и выдает его в ответе сервера.
public IActionResult Index()
        {
            if (System.IO.File.Exists(@"d:\1_.docx"))
                System.IO.File.Delete(@"d:\1_.docx");
            System.IO.File.Copy(@"d:\1.docx", @"d:\1_.docx");
            using (var doc = WordprocessingDocument.Open(@"d:\1_.docx", true))
            {
                var body = doc.MainDocumentPart.Document.Body;
                var paras = body.Elements<Paragraph>();
                foreach (var para in paras)
                {
                    foreach (var run in para.Elements<Run>())
                    {
                        foreach (var text in run.Elements<Text>())
                        {
                            if (text.Text.Contains("replaced-text"))
                            {
                                text.Text = text.Text.Replace("replaced-text", DateTime.Now.ToString("dd.MM.yy"));
                            }
                        }
                    }
                }
                doc.Save();
                doc.Close();
            }
            string path = @"d:\1_.docx";
            FileStream fs = new FileStream(path, FileMode.Open);
            string file_type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
            string file_name = "book3.docx";
            return File(fs, file_type, file_name);
            /*
            using (MemoryStream mem = new MemoryStream())
            {
                using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(mem, DocumentFormat.OpenXml.WordprocessingDocumentType.Document, true))
                {
                    wordDoc.AddMainDocumentPart();
                    // siga a ordem
                    Document doc = new Document();
                    Body body = new Body();
                    // 1 paragrafo
                    Paragraph para = new Paragraph();

                    ParagraphProperties paragraphProperties1 = new ParagraphProperties();
                    ParagraphStyleId paragraphStyleId1 = new ParagraphStyleId() { Val = "Normal" };
                    Justification justification1 = new Justification() { Val = JustificationValues.Center };
                    ParagraphMarkRunProperties paragraphMarkRunProperties1 = new ParagraphMarkRunProperties();

                    paragraphProperties1.Append(paragraphStyleId1);
                    paragraphProperties1.Append(justification1);
                    paragraphProperties1.Append(paragraphMarkRunProperties1);

                    Run run = new Run();
                    RunProperties runProperties1 = new RunProperties();

                    Text text = new Text() { Text = "The OpenXML SDK rocks!" };

                    // siga a ordem 
                    run.Append(runProperties1);
                    run.Append(text);
                    para.Append(paragraphProperties1);
                    para.Append(run);

                    // 2 paragrafo
                    Paragraph para2 = new Paragraph();

                    ParagraphProperties paragraphProperties2 = new ParagraphProperties();
                    ParagraphStyleId paragraphStyleId2 = new ParagraphStyleId() { Val = "Normal" };
                    Justification justification2 = new Justification() { Val = JustificationValues.Start };
                    ParagraphMarkRunProperties paragraphMarkRunProperties2 = new ParagraphMarkRunProperties();

                    paragraphProperties2.Append(paragraphStyleId2);
                    paragraphProperties2.Append(justification2);
                    paragraphProperties2.Append(paragraphMarkRunProperties2);

                    Run run2 = new Run();
                    RunProperties runProperties3 = new RunProperties();
                    Text text2 = new Text();
                    text2.Text = "Teste aqui";

                    run2.AppendChild(new Break());
                    run2.AppendChild(new Text("Hello"));
                    run2.AppendChild(new Break());
                    run2.AppendChild(new Text("world"));

                    para2.Append(paragraphProperties2);
                    para2.Append(run2);

                    // todos os 2 paragrafos no main body
                    body.Append(para);
                    body.Append(para2);

                    doc.Append(body);

                    wordDoc.MainDocumentPart.Document = doc;

                    wordDoc.Close();
                }
                return File(mem.ToArray(), "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "ABC.docx");
            }
            */
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы