Вставьте HTML в OpenXML Word Document (.NET)

Вы просматриваете каждое наблюдение. Возможно, вы захотите рассмотреть data.table подход.

Обновление
Как отметил @MichaelChirico, следует использовать метод data.table::split.

library(data.table)

cities_files <- data.frame(bar = c(1:20000), 
                        city_name  = rep(paste0("city ", 1:200), 100), 
                        foo = c(1:20000))


microbenchmark::microbenchmark(
    khaynes = {
        # library(data.table)
        # Set the data.frame as a data.table
        cities_files_dt <- data.table(cities_files)
        lapply(unique(cities_files_dt[, city_name]), function(city) 
            fwrite(x = subset(cities_files_dt, city_name  == city), 
            file = paste0(city, ".csv")))

    },
    MichaelChirico = {
        cities_files_dt <- data.table(cities_files)
        list_dt <- split(cities_files_dt, cities_files_dt$city_name)
        for(i in 1:length(list_dt)) {
            fwrite(list_dt[[i]], paste0(names(list_dt[i]), ".csv"))
        }
    },
    times = 5
)
# Unit: milliseconds
#       expr      min       lq     mean   median       uq      max neval
#    khaynes 661.0689 680.6768 698.2449 683.1407 719.8056 746.5323     5
#    MichaelChirico 452.0800 456.5777 499.2832 458.0174 517.4398 612.3011     5

Использование пакета data.table должно значительно ускорить время обработки:

library(data.table)

# Create a dummy data.frame
cities_files <- data.frame(bar = c(1, 1, 2, 3, 3), 
                        city_name  = c("city a", "city a", "city b", "city c", "city c"), 
                        foo = c(20, 14, 40, 50, 60))

# Set the data.frame as a data.table
setDT(cities_files)

lapply(unique(cities_files[, city_name ]), function(city) 
    fwrite(x = subset(cities_files, city_name  == city), 
    file = paste0(city, ".csv")))
7
задан Nico 9 October 2008 в 14:12
поделиться

2 ответа

Ну, трудно для предоставления общих рекомендаций, потому что это зависит сильно от входа, что является лучшим.

Вот простой пример, вставляющий абзац в документ DOCX для каждого абзаца в (X) документ HTML с помощью OpenXML SDK v2.0 и XPathDocument:

    void ConvertHTML(string htmlFileName, string docFileName)
    {
        // Create a Wordprocessing document. 
        using (WordprocessingDocument package = WordprocessingDocument.Create(docFileName, WordprocessingDocumentType.Document))
        {
            // Add a new main document part. 
            package.AddMainDocumentPart();

            // Create the Document DOM. 
            package.MainDocumentPart.Document = new Document(new Body());
            Body body = package.MainDocumentPart.Document.Body;

            XPathDocument htmlDoc = new XPathDocument(htmlFileName);

            XPathNavigator navigator = htmlDoc.CreateNavigator();
            XmlNamespaceManager mngr = new XmlNamespaceManager(navigator.NameTable);
            mngr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");

            XPathNodeIterator ni = navigator.Select("//xhtml:p", mngr);
            while (ni.MoveNext())
            {
                body.AppendChild<Paragraph>(new Paragraph(new Run(new Text(ni.Current.Value))));
            }

            // Save changes to the main document part. 
            package.MainDocumentPart.Document.Save();
        }
    }

Пример требует, чтобы Ваш вход был допустимым XML, иначе Вы получите исключение при создании XPathDocument.

Обратите внимание на то, что это - очень простой пример, не берущий любое форматирование, заголовки, списки и т.д. во внимание.

4
ответ дан 6 December 2019 в 21:21
поделиться

Я не уверен, чего на самом деле требуется достигнуть. Документы OpenXML имеют собственную подобную HTML нотацию (WordprocessingML) для элементов форматирования (как абзац, полужирный текст, и т.д.). Если требуется добавить некоторый текст к документу с основным форматированием, чем я скорее предлагаю использовать синтаксис OpenXML и отформатировать вставленный текст с этим.

Если у Вас есть отрывок HTML, который необходимо включать в документ, как это, можно использовать "внешнее содержание" функция OpenXML. С внешним содержанием можно включать документ HTML пакету и создать ссылку (altChunk) в документе в положении, где Вы хотите включать это. Недостаток этого решения, это не все инструменты будут поддерживать (или поддерживать правильно), сгенерированный документ, поэтому я не рекомендую это решение, если Вы действительно не можете изменить источник HTML.

Как включать любое содержание (wordml) к openxml документу в формате Word независимый вопрос, по моему скромному мнению, и ответ зависит очень от того, как сложные модификации, которые Вы хотите применить, и насколько большой документ. Для простого документа я просто считал бы часть документа от пакета, получил бы, это - поток, и загрузите его в XmlDocument. Можно вставить дополнительное содержание в XmlDocument довольно легко и затем сохранить его назад к пакету. Если документ является большим, или Вам нужны сложные модификации в нескольких местах, XSLT является хорошим вариантом.

2
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

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