Создание оглавления в Word, заполненном источником HTML в ASP.NET

Мне было поручено создать оглавление (оглавление) для документа Word, который заполнен HTML-кодом, динамически основанным на нескольких данных, полученных из базы данных, и с конкретным дизайном, и, наконец, эту операцию необходимо выполнить в ASP. Серверная сторона NET использует 3.5 .NET Framework, запрограммированный на C#, и его необходимо отправить клиентской стороне с созданным оглавлением и в формате Word.

Я также могу сказать вам, что ОС сервера - Windows 2008 Server, и на нем установлен Microsoft Office 2010.

Итак, сначала я пытаюсь использовать Microsoft.Interoffice.Word, интегрируя его в код серверной части, но потом я понял, что Microsoft не поддерживает такого рода вещи из-за вопросов безопасности. Затем я пытаюсь создать консольное приложение, которое выполняет эту функцию (используя Microsoft.Office.Interop.Word) и экспортирует HTML-код в документ документа, оба из которых находятся в одной папке, и группа IIS_USERS имеет полный доступ к этому местоположению. Но когда я пытаюсь запустить консольное приложение, которое создает оглавление в коде веб-сайта, оно показывает мне ошибку, связанную с консольным приложением.

Я протестировал консольное приложение с созданным документом, заполненным HTML-кодом, и оно работает без сбоев, поэтому я не понимаю, что происходит... обнаруживает ли IIS, что консольное приложение использует Microsoft.Office.Interop.Word, и не ' не позволяет это выполнить? Идея заключалась в том, чтобы после завершения консольного приложения я снова возвращал весь документ на веб-сайт и генерировал HTTP-ответ на стороне клиента, чтобы он отображал типичное диалоговое окно открытия / сохранения.

Я пытался использовать внешние библиотеки тоже без результатов, таких как GemBox (проблема FileFormat с HTML-кодом), NPOI (его библиотека HWPF находится в альфа-версии), OpenSDK (не может оценить подкачку страниц, поэтому он не может создать оглавление с документом, заполненным info), AsPposed Words (довольно дорогая библиотека, я не могу попробовать такие функции в бесплатной лицензии)

Я показываю, вы знаете код консольного приложения:

    ArrayList arrValoresIndices = new ArrayList();
Application wordApp = new Application();
object missing = System.Type.Missing;

try {
    Document wordDocument = wordApp.Documents.Open(docFileSource);
    //Applying style to headers
    System.Drawing.Color colorNecesario = System.Drawing.ColorTranslator.FromHtml("#1F497D");
    WdColor coloraplicado = (Microsoft.Office.Interop.Word.WdColor)(colorNecesario.R + 0x100 * colorNecesario.G + 0x10000 * colorNecesario.B);
    wordApp.ActiveDocument.Styles[WdBuiltinStyle.wdStyleHeading1].Font.Name = "Calibri";
    wordApp.ActiveDocument.Styles[WdBuiltinStyle.wdStyleHeading1].Font.Size = 14;
    wordApp.ActiveDocument.Styles[WdBuiltinStyle.wdStyleHeading1].Font.Bold = -1;
    wordApp.ActiveDocument.Styles[WdBuiltinStyle.wdStyleHeading1].Font.Color = coloraplicado;

    int numPalabras = wordDocument.Words.Count;

    for (int i = 1; i < numPalabras; i++)
    {

        string texto = wordDocument.Words[i].Text;

        if (texto.Equals("") == false && wordDocument.Words[i].Font.Size == 14 &&
             wordDocument.Words[i].Font.Name == "Calibri" &&
             wordDocument.Words[i].Font.Bold == -1 &&
             wordDocument.Words[i].Font.Color == coloraplicado)
        {
            wordDocument.Words[i].set_Style(WdBuiltinStyle.wdStyleHeading1);
        }

    }

    object gotoPage = WdGoToItem.wdGoToPage;
    object gotoNext = WdGoToDirection.wdGoToNext;
    object gotoCount = null;
    object gotoName = "2";
    wordApp.Selection.GoTo(ref gotoPage, ref gotoNext, ref gotoCount, ref gotoName);
    wordApp.Selection.InsertBreak(WdBreakType.wdPageBreak);
    gotoName = "2";
    Range indexPage= wordApp.Selection.GoTo(ref gotoPage, ref gotoNext, ref gotoCount, ref gotoName);
    object oTrue = true;
    TableOfContents toc = wordDocument.TablesOfContents.Add(indexPage, ref oTrue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref oTrue);

    wordDocument.TablesOfContents.Format = WdTocFormat.wdTOCModern;
    toc.Update();
    wordDocument.SaveAs2(docFileSource,WdSaveFormat.wdFormatFilteredHTML);
    wordDocument.Close();
    wordApp.Quit();
}
catch (COMException ce)
{
    wordApp.Application.Quit(ref missing, ref missing, ref missing);
    throw new COMException("Process has failed ...\n");
    }
}

Код веб-сайта, который запускает код:

String nombreDoc = "C:\\tempDocs\\JGA.doc"; //i will store the doc in this folder, in this folder IIS_USRS have full access
File.WriteAllText(nombreDoc, strCabecera.ToString()); //strCabecera contains the whole html code
Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = @"C:\\tempDocs\\TOCIndexer\\TOCIndexer.exe -nombreDoc";
p.StartInfo.UseShellExecute = false;
p.StartInfo.Verb = "runas";

using (Process exeProcess = Process.Start(p))
{
     exeProcess.WaitForExit();
}

//When the process has finished I import againg the content to a new string builder
StringBuilder strCabeceraVolcado = new StringBuilder();
using (var sr = new StreamReader(nombreDoc))
{
    strCabeceraVolcado.Append(sr.ReadToEnd());
}
if (File.Exists(@nombreDoc))
{
    File.Delete(@nombreDoc);
}
strCabecera = strCabeceraVolcado;

HttpContext.Current.Response.Write(strCabecera);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();

Не могли бы вы дать мне совет?

Спасибо

1 ответ

Решение

После исследования я понял, что все приложение было правильным, и проблема заключается в настройках сервера.

Это решение работает только для 64-разрядной версии Windows Server 2008. Если вы столкнулись с проблемами с Microsoft.Office.Interop.Word, вам необходимо выполнить следующие шаги:

1º Вы должны установить Microsoft.Office.Word на сервере.

2º Вы должны назначить разрешения "Полный доступ" в папке, в которой создаются документы, для "группы пользователей IIS" и пользователя "Анонимный вход".

3º Вы должны изменить службы компонентов (C:\Windows\System32\comexp.msc) и установить для параметра "Удостоверение" значение "Интерактивный пользователь" на "Свойства COM-сервера Office Licensing 14" (может быть 12 вместо 14 в зависимости от версии Офис вы устанавливаете)

4º Создайте папку "Рабочий стол" по пути, расположенному в C:\Windows\SysWOW64\config\systemprofile\

Если вы выполните эти шаги, ASP.NET позволит вам изменять документы с помощью библиотеки Microsof.Office.Interop.Word.

Другие вопросы по тегам