I have a Word document which I want to attach an existing template to.
In order the template styles will be set as the document styles I have to update the styles.
All templates definitions are successfully updated except the footer of the template.
//Opening the document to Word application
Microsoft.Office.Interop.Word.Document wordDoc = null;
Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
object oFileName= MyDocumentPath;
wordDoc= wordApp.Documents.Open(ref oFileName,ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
//Use an existing template
object oTemplate = (object)coverPagePath;
wordApp.ActiveDocument.set_AttachedTemplate(ref oTemplate);
wordApp.ActiveDocument.UpdateStyles();
Any ideas?
Related
I have a code that opens up a word document, reads an excel file as data source for mail merge fields, and then saves the document.
The problem: I want the text in the merge field to be shown (and saved) as "previewed". (e.g. the field shows its value lets say "Dog" instead of its field title "Animal"). In the Word application i would simply click the button "Preview Result".
By recording a macro I have found that this can be solved in Visual Basic by the line ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
although I have not managed to use this in the C#-code.
I am new in both coding and this forum, so please let me know if I can provide more information.
using System;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
using Word = Microsoft.Office.Interop.Word;
using System.Runtime.InteropServices;
using Microsoft.Office.Core;
namespace word
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void CreateWordDocument(object wordFilename, object excelSource)
{
Word.Application wordApp = new Word.Application();
object missing = Missing.Value;
Word.Document myWordDoc = null;
object readOnly = false;
object isVisible = false;
wordApp.Visible = true;
myWordDoc = wordApp.Documents.Open(ref wordFilename, ref missing, ref readOnly,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing);
myWordDoc.Activate();
myWordDoc.MailMerge.MainDocumentType =
Word.WdMailMergeMainDocType.wdNotAMergeDocument;
myWordDoc.MailMerge.OpenDataSource(Name: excelSource, Format: ref missing,
SQLStatement: "SELECT*FROM`Data$`");
//Any code for previewing
//VB-code: ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
myWordDoc.SaveAs2(ref wordFilename, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref mailmerge, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing);
myWordDoc.Close();
wordApp.Quit();
}
}
The property to use is:
myWordDoc.ActiveWindow.View.MailMergeDataView = true;
Read more here:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.office.interop.word.view.mailmergedataview?view=word-pia
I am trying to get bullet list from docx using C#, however, instead of bullet number or symbol, the output gets a weird symbol or rectangle with a question mark inside "", instead of a bullet. Following is the code snippet I am using to get bullet value, but it is not working:
Application word = new Application ();
Document doc = new Document ();
object fileName = #"D:\testing\Sample_2.docx";
// Define an object to pass to the API for missing parameters
object missing = System.Type.Missing;
doc = word.Documents.Open (ref fileName,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
for (int i = 0; i < doc.Paragraphs.Count; i++) {
string bullet = doc.Paragraphs[i + 1].Range.ListFormat.ListString;
}
((_Document) doc).Close ();
((_Application) word).Quit ();
I am trying to create a Word document with checkboxes in it using Microsoft.Office.Interop.Word. I have used the following references to do so:
Create a Word document in C#
Create and edit a CheckBox in Word with c#
I have successfully generated a Word document with a checkbox but unfortunately it is disabled. What I am trying to achieve is to have a checkbox that can be checked/unchecked.
In the screenshot below, you can see that I have 3 checkboxes. The 1st one is generated using Microsoft.Office.Interop.Word and the 2nd and 3rd ones were created manually in Word 2016. The first one cannot be marked as checked/unchecked while the 2nd and 3rd ones behave just like a normal checkboxes
And this is the code I used to generate the Word document.
private void btnCreateWordInterop_Click(object sender, EventArgs e)
{
Word._Application word_app = new Word.ApplicationClass();
word_app.Visible = true;
object missing = Type.Missing;
Word._Document word_doc = word_app.Documents.Add(ref missing, ref missing, ref missing, ref missing);
Word.Paragraph para = word_doc.Paragraphs.Add(ref missing);
para.Range.Text = "Chrysanthemum Curve";
object style_name = "Heading 1";
para.Range.set_Style(ref style_name);
para.Range.InsertParagraphAfter();
//Microsoft.Office.Interop.Word.Range range =
para.Range.Collapse(ref missing);
Word.FormField checkBox = word_doc.FormFields.Add(para.Range, Word.WdFieldType.wdFieldFormCheckBox);
para.Range.InsertAfter(" Checkbox generated by Microsoft.Office.Interop.Word");
// Save the document.
object filename = #"C:\Users\Username\Desktop\InteropWord.docx";
word_doc.SaveAs(ref filename, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing);
//Close.
object save_changes = false;
word_doc.Close(ref save_changes, ref missing, ref missing);
word_app.Quit(ref save_changes, ref missing, ref missing);
MessageBox.Show("Saved");
}
How can I make the generated checkbox enabled?
Instead of using FormFields I'd recommend using Content Controls for this. These are more 'User Friendly' and easier to work with in general.
Change this line:
Word.FormField checkBox = word_doc.FormFields.Add(para.Range, Word.WdFieldType.wdFieldFormCheckBox);
Using a Content Control it would be something like (from the top of my head)
Word.ContentControl checkbox = para.Range.ContentControls.Add(Word.WdContentControlType.wdContentControlCheckBox);
I would like to use a word file in my visual studio project for edits and return the file.
Microsoft.Office.Interop.Word.Document tempDoc = null;
try
{
object missing = System.Reflection.Missing.Value;
Application wordApp = new Application();
//I have a copy on C: and this works.
object useFileName = "C:\\WordFile.doc";
object readOnly = false;
object isVisible = false;
wordApp.Visible = false;
tempDoc = wordApp.Documents.Open(ref useFileName, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref isVisible, ref missing, ref missing,
ref missing, ref missing);
...
}
return tempDoc;
How do I reference the word document in my project (Content/Documents/WordFile)?
Maybe using Server.MapPath which specifies the relative or virtual path to map to a physical directory.
Server.MapPath("~/Content/Documents/WordFile")
You can get the location on the executing code from
System.Reflection.Assembly.GetExecutingAssembly().Location;
Alternatively place the document location in the config file.
I'm using word automation to generate a docx file, then print it out. Here is my basic code. I found that I have to wait some time after adoc.PrintOut, otherwise, the print may fail. It seems it is because I close the file after that. Before the file is closed, word does not have time to print it out yet. So, basically, adoc.PrintOut is non-blocked (this may not be the correct term). Right now, I wait for 10 seconds, it works fine. However, does it have a more elegant solution for this? I mean, how can wait until PrintOut finished, then close the doc?
thanks
object yes = true;
object no = false;
object missing = System.Reflection.Missing.Value;
Word.Application wordApp = new Word.Application();
object fileName = originalFileName;
Word.Document adoc = null;
try
{
adoc = wordApp.Documents.Open(ref fileName,
ref missing, ref no, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing);
adoc.Activate();
/*
some other processing
*/
object sFile = fileName;
adoc.PrintOut(ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
// http://msdn.microsoft.com/en-us/library/b9f0ke7y
//adoc.PrintPreview();
for (int i = 0; i < 10; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(1));
Application.DoEvents();
}
//adoc.Save();
object savechanges = Word.WdSaveOptions.wdDoNotSaveChanges; //.wdSaveChanges;
object originalFormat = Word.WdOriginalFormat.wdWordDocument;
object routeDocument = missing; // Type.Missing; // true;
((Word._Document)adoc).Close(ref savechanges, ref originalFormat, ref routeDocument);
((Word._Application)wordApp).Quit(ref savechanges, ref missing, ref missing);
adoc = null;
wordApp = null;
}
catch
{
}
finally
{
/*
some dispose work
*/
// do it twice to release all memory
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
You can use the first parameter of PrintOut.
object background = false;
adoc.PrintOut(background, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing);
As the documentation says:
http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.document.printout(v=vs.80).aspx
"Background
true to have the customization code continue while Microsoft Office Word prints the document."