0

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

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

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

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

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

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

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(); 

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

Благодаря

ответ

0

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

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

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

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

3º Вам необходимо изменить Службы компонентов (C: \ Windows \ System32 \ comexp.msc) и установите Identity значение «Интерактивный пользователь» на «Свойства лицензирования COM-сервера Office 14» (может быть 12 вместо 14 в зависимости от версии Office, которую вы устанавливаете)

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^