I'm working on a MS word template generator, it works like this:
User opens a webpage fill in some text boxes, marks some check boxes and then clicks on the button, word document opens (template I previously defined before with all the bookmarks needed), using what he inputted in the webpage, it's all in the document and the fields and check boxes are marked as he marked, he only needs to print the document. It worked PERFECTLY on my PC
But when I tested it on the server, an error occurred:
My code:
I have included the reference (using Word = Microsoft.Office.Interop.Word;
)
private void CreateWordDocument(int DepositNo)
{
Random RandomClass = new Random();
int randomInt = RandomClass.Next();
string templateName = "Form15Template.docx";
string docFileName = "Form15_" + DepositNo.ToString() + "_" + randomInt.ToString() + ".docx";
string destenation = "D:\\_Documents\\Form15\\";
File.Copy(Server.MapPath(@"_Documents/" + templateName), destenation + docFileName, true); //
String POBox = "9769";
String City = "الرياض";
String PostalCode = "11423";
String Address = "ص.ب " + POBox + " " + City + " " + PostalCode;
// Modify Checkboxes variables in Doc to true if they have been checked
if (RadioButtonListResult.SelectedValue.Equals("اجتاز"))
A = true;
if (RadioButtonListResult.SelectedValue.Equals("تعديل") || RadioButtonListResult.SelectedValue.Equals("لم يجتز"))
B = true;
if (CheckBoxAllElements.Checked)
AllElements = true;
if (CheckBoxElements.Checked)
Elements = true;
if (CheckBoxEdit.Checked)
Edit = true;
if (CheckBoxBoxPage.Checked)
BoxPage = true;
if (CheckBoxRequestArabic.Checked)
RequestArabic = true;
if (CheckBoxMultiInvention.Checked)
MultiInvention = true;
if (CheckBoxRecency.Checked)
Recency = true;
if (CheckBoxInventiveStep.Checked)
InventiveStep = true;
if (CheckBoxImplemented.Checked)
Implemented = true;
if (CheckBoxC.Checked)
C = true;
if (CheckBoxD.Checked)
D = true;
object bA = "A", bB = "B", bC = "C", bD = "D", bAllElements = "AllElements", bElements = "Elements",
bRecency = "Recency", bInventiveStep = "InventiveStep", bImplemented = "Implemented",
bApprove = "Approve", bEdit = "Edit", bBoxPage = "BoxPage", bRequestArabic = "RequestArabic",
bMultiInvention = "MultiInvention", bObjection = "Objection", bMark = "Mark",
bRejection = "Rejection";
//Start Word and open template.
Word._Application oWord;
Word._Document oDoc;
oWord = new Word.Application();
oWord.Visible = true;
object FileName = @"C:\Users\aalhammad\Documents\Visual Studio 2010\Projects\FormEditing\FormEditing\_Documents\Form15Template.docx";
object oMissing = System.Reflection.Missing.Value;
oDoc = oWord.Documents.Open(ref FileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
// ============================================== CheckBoxes ====================================================
// Modifying CheckBoxes in Document
oDoc.FormFields.get_Item(ref bA).CheckBox.Value = A;
oDoc.FormFields.get_Item(ref bB).CheckBox.Value = B;
oDoc.FormFields.get_Item(ref bC).CheckBox.Value = C;
oDoc.FormFields.get_Item(ref bD).CheckBox.Value = D;
oDoc.FormFields.get_Item(ref bAllElements).CheckBox.Value = AllElements;
oDoc.FormFields.get_Item(ref bElements).CheckBox.Value = Elements;
oDoc.FormFields.get_Item(ref bRecency).CheckBox.Value = Recency;
oDoc.FormFields.get_Item(ref bInventiveStep).CheckBox.Value = InventiveStep;
oDoc.FormFields.get_Item(ref bImplemented).CheckBox.Value = Implemented;
oDoc.FormFields.get_Item(ref bApprove).CheckBox.Value = Approve;
oDoc.FormFields.get_Item(ref bEdit).CheckBox.Value = Edit;
oDoc.FormFields.get_Item(ref bBoxPage).CheckBox.Value = BoxPage;
oDoc.FormFields.get_Item(ref bRequestArabic).CheckBox.Value = RequestArabic;
oDoc.FormFields.get_Item(ref bMultiInvention).CheckBox.Value = MultiInvention;
oDoc.FormFields.get_Item(ref bObjection).CheckBox.Value = Objection;
oDoc.FormFields.get_Item(ref bMark).CheckBox.Value = Mark;
oDoc.FormFields.get_Item(ref bRejection).CheckBox.Value = Rejection;
// ============================================== BookMarks =====================================================
String ApplicantName = "شركة الزيت العربية السعودية",
AgentName = "مكتب سليمان العمار للمحاماة والاستشارات القانونية",
AppDate = "13/01/2013",
Title = "حماية خط تدفق رأس بئر ونظام اختبار باستخدام وحدة تحكم في سرعة مضخة كهربائية مغمورة وصمام فاصل يستخدم عند الطوارئ";
// find bookmark
object oBookmark = "DepositNO"; // name of bookmark in doc
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = GetDepositNO(DepositNo);
oBookmark = "AppDate";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = AppDate;
oBookmark = "Title";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Title;
oBookmark = "ApplicantName";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ApplicantName;
oBookmark = "AgentName";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = AgentName;
oBookmark = "Address";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Address;
oBookmark = "AgentName01";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = AgentName;
oBookmark = "Times";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Times;
oBookmark = "NumOfElements";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = NumOfElements;
oBookmark = "txtElements";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtElements;
oBookmark = "txtRecency";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtRecency;
oBookmark = "txtInventiveStep";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtInventiveStep;
oBookmark = "txtImplemented";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtImplemented;
oBookmark = "ElementsC";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ElementsC;
oBookmark = "ElementsD1";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ElementsD1;
oBookmark = "ElementsD2";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ElementsD2;
oBookmark = "txtBoxPage";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = txtBoxPage;
oBookmark = "Fees";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = Fees;
oBookmark = "DepositNO01";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = GetDepositNO01(DepositNo);
oBookmark = "ExamTime";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ExamTime;
oBookmark = "ExamTime01";
oDoc.Bookmarks.get_Item(ref oBookmark).Range.Text = ExamTime;
object saveFileName = "D:\\_Documents\\Form15\\" + "Form15 " + DepositNo.ToString() + "_" + randomInt.ToString() + ".docx";
oDoc.SaveAs(ref saveFileName, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing);
Knowing that I was working on: Visual Studios C# 2010, and Microsoft .NET Framework 4.0 And on the server it's: Visual Studio C# 2005, MS Framework 2.0
Any idea what might the problem be?
The ad-hoc solution to your issue is to install Microsoft Word (make sure to select the .NET Programmability Support component during setup) and run the application at least once as the user that is running the Web application. This user needs to be an interactive user having a desktop.
Note that Office needs to be installed if you want to automate it - the interop assemblies you probably deployed are just a wrapper and do not contain the actual code.
However, keep in mind that non-interactive automation of Microsoft Office application is tricky and not officially supported by Microsoft. It requires a lot more code to make the thing reliable and stable than you will find in the automation samples in MSDN. Things like creating an interactive desktop, maintaining word instances or accounting for blocking popup messages all need to be explicitly implemented in your code.
A much better alternative would be to create your documents using the Open XML SDK (Though one should be aware that the generation is not thread-safe in the current SDK version).