Open password protected document in application level add in - c#

Is there a way of opening password protected Word and Excel files without manually entering password when developing an application or document level VSTO Add-in. In other words, how do I set the password programmatically.
I have tried to do it in the document open event but it is invoked after opening document.
Is there an event which is invoked before the document gets opened?
Basically what I want to achieve is avoid opening the document outside the my Add in

Yes there is - look at documentation here. Basically - you need to pass the password, when opening the document instead of relying on events.
For Word:
var WordApp = new Word.Application();
WordApp.Documents.Open("[your doc path].docx", ReadOnly: false, Password: "[your password]")
For Excel:
var ExcelApp = new Excel.Application();
ExcelApp.Workbooks.Open("[your doc path].xslx", ReadOnly: false, Password: "[your password]")

Related

Find and replace text in .docx file without opening the file

I have a template .docx file where I have to replace the placeholder. I've used the code from c# word interop find and replace everything to replace the name in my word file. That works just fine.
object fileName = GetFilePath();
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application { Visible = true };
Microsoft.Office.Interop.Word.Document aDoc = wordApp.Documents.Open(fileName, ReadOnly: false, Visible: true);
aDoc.Activate();
FindAndReplace(wordApp, "firstname", "Max");
aDoc.Save();
This implementation does open the word file.
My question is, if there is any way to replace the text without opening the file?
To partially change any file you do need to open it first, there is no other way except completely rewriting it every time with contents stored elsewhere like in your application's memory for example.
If you just want to hide the fact that it is open for the user, simply change this parameter:
Visible: false
The file will still be opened, but it will not display a window.
Note that this will still affect the file in the same way as when it is opened normally (other users may not be able to edit it etc).

Getting 'Compile error in hidden module: SmartTagsMod' while opening a word document in MS Word 2010

I am converting a large number of MS Word documents to PDFs using the Interop library in a multi-threaded WPF application (.NET Framework 4). I get the following error on some word documents:
It blocks the current thread until I click OK on the dialog and then continues with the conversion and the converted PDF comes out to be fine as well.
This only happens on certain documents. I am running the application on multiple computers and this has occured on other computers too.
Below is my code for conversion:
var wordApplication = new Microsoft.Office.Interop.Word.Application();
// Opening the word document
var wordDocument = wordApplication.Documents.Open(tempFile, false, true, false, NoEncodingDialog: false);
// Exporting the document to the PDF
wordDocument.ExportAsFixedFormat(pdfPath, Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF);
// Closing the document and the application.
((Microsoft.Office.Interop.Word._Document)wordDocument).Close(false);
((Microsoft.Office.Interop.Word._Application)wordApplication).Quit(false);
Marshal.ReleaseComObject(wordDocument);
Marshal.ReleaseComObject(wordApplication);
wordDocument = null;
wordApplication = null;
Does anyone know what could be causing this? Or whether I can close this dialog box from my application?
Thanks
wordApplication.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;
This seem to have fixed the issue.
Thanks bibadia for providing the link to the question that had the fix.

How to set the active (i.e. foreground) Word document using C#

I have looked and failed to find a solution to my problem. I have developed an Add-in ribbon for Word 2007 which provides an additional set of load and save functions, to allow users to load and save documents from a bespoke system.
I have most of it working - when a user requests a file to be opened, it is downloaded and saved to the AppData folder, and then opened. However, the problem I am having is that if the user for example opens Word and uses this new 'load' function, the blank Word document remains, and Word opens the new document quite happily, but it does not get the focus.
(I'm on Windows 7 and it creates a second 'W' icon in the task bar for the new document, but it doesn't switch to it in the same way that Word would if I'd used the normal 'Open' route.)
I have tried (as a result of suggestions found elsewhere on here) either setting the 'visible' attribute to true, and calling doc.Activate() but neither does what I need. What am I missing? The code I'm using to open the file is below:
private void OK_Click(object sender, EventArgs e)
{
this.Close();
FES.FESServices wService = new FES.FESServices();
int request_id = wService.SubmitRequestFromAddIn(username, password, "RETR", "", textBox1.Text, "", "");
FES.FileRequestResponse response = wService.GetFileMembersFromAddIn(username, password, request_id);
if (response.ResponseType == "RETR")
{
byte[] data = wService.GetBytesForFilename(response.ResponseValue);
//MessageBox.Show("Loaded data for file...");
//MessageBox.Show(Application.UserAppDataPath);
FileStream fs = new FileStream(Application.UserAppDataPath + "\\" + response.ResponseValue.Substring(6).Split('~')[0], FileMode.Create, FileAccess.Write);
fs.Write(data, 0, (int)data.Length);
fs.Close();
object oMissing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Word.Document doc = Globals.ThisAddIn.Application.Documents.Open(
Application.UserAppDataPath + "\\" + response.ResponseValue.Substring(6).Split('~')[0], Visible:true
);
doc.Activate();
}
}
(I have included this.Close() as the function loading the document is held within a modal dialog box, and without closing it first, Word throws an exception about switching documents with a dialog box open).
Any help gratefully received!
Running this code whilst the modal dialog is showing is interfering with window activation.
I'm not sure exactly what the mechanism is for this interference, but the fix is simple enough. Move the code outside the dialog. Execute this code immediately after the call to ShowDialog returns.

update password protected linked word document in C#

Let me first describe the problem. I have this application that opens a word document and updates all the fields and then saves the document in another folder. The word document is just used as a template for a report. It is filled with linked content from an excel worksheet. The whole application works, but the problem is that the excel document is password protected. when I update the document fields the application is stopped and word asks for a password.
When you input the password, the program works as advertised, you have to insert it more than once thou, dont really know why. But the program is suppose to work autonomously without user input. Is there a way to give word the password so that it doesnt have to be entered, either via code or in the word document properties.
Below is my current code that does this, its in C#
Microsoft.Office.Interop.Word.Application ap = new Microsoft.Office.Interop.Word.Application();
Document doc = ap.Documents.Open(template, ReadOnly: false, Visible: false);
doc.Activate();
red_debug.AppendText("opening " + template + "\n");
doc.Fields.UpdateSource();
doc.Fields.Update();
red_debug.AppendText("Saving as " + final + "\n");
doc.SaveAs(final, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatDocument);
doc.SaveAs(path + "\\" + name, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF);
red_debug.AppendText("Closing word" + "\n");
doc.Close();
ap.Quit();
Get the Word document to open up the Excel file (with the password) for you everytime it has been opened. Same time, we can also successfully close the Excel file from Word.
Put this into the Word macro area.
Private Sub Document_Open()
Dim xlApp As Object
Dim xlWB As Object
Dim myRange
Application.DisplayAlerts = wdAlertsNone
Set xlApp = CreateObject("Excel.Application")
Set xlWB = xlApp.Workbooks.Open("C:\ExcelFile.xls", , , , "password", "password")
Set myRange = Selection.Range
Selection.WholeStory
Selection.Fields.Update
myRange.Select
xlApp.Quit
Set xlWB = Nothing
Set xlApp = Nothing
Application.DisplayAlerts = wdAlertsAll
End Sub
This will open up the excel document and update ALL fields on your word document and shouldnt ask you for password
I think you can try to call doc.Unprotect(ref Object password) by passing your password as argument.
Check out this article on CodeProject and this on MSDN.

How to open Excel file with Read Only protection?

I have opened Excel file in my C# WinForm Application adding reference to Microsoft.Office.Interop.Excel.dll and using DSO FRAMER CONTROL. But i want to open my excel file with read only protection.I have successfully done this for WORD Application like this
Word.Document wordDoc = (Word.Document)axFramerControl1.ActiveDocument;
Word.Application wordApp = wordDoc.Application;
wordDoc.Protect(Word.WdProtectionType.wdAllowOnlyReading);
In the same i want to do this work for Excel.But i couldn't able to protect Excel file on that way.
string path = "C:\\test-wb.xlsx";
axFramerControl1.Open(path, true,"excel.sheet", "", "");
Excel._Workbook excelDoc =(Microsoft.Office.Interop.Excel._Workbook)axFramerControl1.ActiveDocument;
Excel.Application excelApp =excelDoc.Application;
//What code should i write to protect Excel Workbook with read - only.
excelDoc.Protect(misval, true, misval);//It is not working.
Call theOpen method with third parameter (ReadOnly) = true.
See MSDN documentation :
ReadOnly
Optional Object. True to open the workbook in read-only mode.
The WorkBook class has a Protect method, similar (but not identical) to the one supported by Word. I can't find the COM/interop documentation, but the VSTO documentation covers the same ground, and the method signatures are the same:
Protect
Protects a workbook so that it cannot be modified.
public virtual void Protect (
[OptionalAttribute] Object Password,
[OptionalAttribute] Object Structure,
[OptionalAttribute] Object Windows
)
(This all assumes that what you wanted to achieve was to protect the document, since that's what the Word code does, as opposed to opening the document read only, which is what your narrative seems to be saying, in which case, #gdoron's answer is more suitable

Categories