1、引言編程
在咱們平常辦公中,咱們常常可能遇到一些重複性的工做的,好比,咱們在寫畢業設計的時候,有時候咱們寫的過程當中不注意,當整篇畢業論文寫完以後,發如今畢業論文中存在不少空白的段落,這是咱們就須要人工從新審閱一遍論文,再手動刪除一些空白行,因爲畢業論文也不是一篇,有開題報告啊,文獻翻譯等等,這樣就可能須要咱們人工都去審閱一篇把一些空白行刪除,這樣既花時間,咱們也看的累。而後還有一個例子就是——咱們人事部門的MM們,一到月末的時候就須要給本月的壽星員工發送郵件來通知參加生日會,若是員工信息是在Excel中的話,這時候人事的MM就要手動地從中查找本月壽星的郵箱,而後用Outlook一個一個添加郵件地址來給本月壽星發送郵件的,爲了讓人事MM們再也不那麼累,因此就想能不能用程序自動化地完成這一系列的過程呢?答案是確定的,下面就讓我來實現上面的兩個需求的,使咱們(尤爲是人事MM們)的辦公更加Easy。數組
2、自動刪除Word中的空白行和頁app
在引言部分,咱們已經提出了這個需求的。記得當時在寫畢業論文的時候,我也作過這些重複的事情,常常寫完以後會再去審閱一遍畢業論文中的全部文檔,而後手動把一些空白行刪除掉,因爲當時並不知道能夠對Word來進行自動化編程,因此只能傻傻地作這樣一些重複的事情。可是如今不同了,自從接觸了VSTO以後,才知道Office一系列產品都是提供了一些公開的API的,咱們能夠利用這些對象使咱們自定義Office程序和使Office自動化地工做,下面就具體講講如何實現這個小的工具的。ide
首先,咱們先明確下這個工具須要實現的功能——自動移除Word文檔中的空白行。而後向你們解釋下實現該工具的思路:函數
咱們打開一個Word文檔,該Word文檔就是一個Word.Document對象工具
Word文檔中內容都是段落組成的,然而段落在Word對象模型中是Word.Paragraph對象測試
空白行或空白頁也就是段落的內容爲空,明白了這點,咱們就能夠在程序中對段落對象的文本進行判斷,若是段落內容爲空,咱們就刪除該段落,這樣也就實現了移除空白行的功能了。動畫
有了上面的思路以後,而後你們只須要了解Word中對象模型,而後經過對象模型找到段落對象,而後再判斷它的文本是否爲空,爲空就刪除段落,不爲空就什麼都不作。因此思路有了以後,就是要了解Word對象模型了,對於這部份內容,你們能夠參考我博客的中的——建立Word解決方案。因爲代碼中都有註釋,這裏就直接看實現該工具的核心代碼:ui
string[] wordPatharray = null; spa
// 打開須要操做的Word文檔
privatevoid btnOpen_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "Word document(*.doc;*.docx)|*.dox;**.docx|All Files(*.*)|*.*";
// 設置容許選擇多個文件,該屬性默認爲false的,即只容許選擇一個文件
openFileDialog.Multiselect = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
txtWordPath.Text = openFileDialog.FileName;
// 得到全部選定文件的文件名
wordPatharray = openFileDialog.FileNames;
}
}
}
// 移除Word中的全部空頁
privatevoid btnRemove_Click(object sender, EventArgs e)
{
Word.Application wordapp = null;
Word.Document doc = null;
try
{
// 啓動Word應用程序並設置不可見
wordapp = new Word.Application();
// 若是不設置該屬性,就能夠看到Word程序的啓動過程,這個和咱們手動啓動Word是同樣的
wordapp.Visible = false;
// 遍歷每一個文件名
foreach (var wordpath in wordPatharray)
{
doc = wordapp.Documents.Open(wordpath);
// 刪除全部空白頁面
Word.Paragraph paragraph;
Word.Paragraphs paragraphs = doc.Paragraphs;
for (int i = paragraphs.Count; i > 0; i--)
{
paragraph = paragraphs[i];
// 若是段落的文本爲空的話,首先選擇該段落,而後再調用Word中Selection對象的Delete方法來刪除
// 不爲空什麼都不作
if (paragraph.Range.Text.Trim() == string.Empty)
{
paragraph.Range.Select();
wordapp.Selection.Delete();
}
}
if (doc != null)
{
// 先保存全部修改再關閉Word文檔
doc.Save();
((Word._Document)doc).Close();
}
}
MessageBox.Show("刪除空白行成功");
}
catch (Exception ex)
{
MessageBox.Show("異常發生,異常信息爲:" + ex.Message);
}
finally
{
// 釋放資源
// 退出Word程序
if (wordapp != null)
{
((Word._Application)wordapp).Quit();
}
doc = null;
wordapp = null;
}
}
爲了測試該程序的正確性,這裏我創建了兩個測試文檔,爲了測試,我故意在文檔中刪除了空白行和空白頁面,下面是兩個測試文檔的截圖:
下面就看看該工具的運行效果(效果圖是一段動畫,認爲這樣能夠更加說明運行效果)
3、人事部門的福音——自動給本月壽星員工發送郵件提醒
爲了幫助你們更好地理解該程序,仍是像以前同樣,首先說說實現該程序的思路:
咱們首先須要打開員工信息表,此時咱們能夠利用Excel對象模型中的Excel.Application.Workbooks.Open方法來得到一個工做簿對象,關於更多Excel對象模型的內容能夠轉向——建立Excel解決方案。
經過第一步咱們已經得到了工做簿對象了,而後經過遍歷工做簿中的激活表,即表格一(Sheet1),咱們能夠經過workbook.ActiveSheet來得到表格一對象。
遍歷表格一中的全部行來找到生日信息中的月份,若是月份等於當前月份,就給該員工的郵箱進行發郵件。
對於自動發送郵件的實現,該實現和咱們手動操做Outlook過程是同樣,手動操做時,咱們須要手動打開Outlook(在程序中就是建立Outlook應用程序對象),而後點擊新建郵件(在程序中就是經過Applicatin對象的CreateItem(Outlook.OlItemType.olMailItem)方法來建立一個郵件項目),在新建郵件窗口中指定收件人,主題,郵件內容以後,點擊Outlook中的發送郵件按鈕(在程序中就是經過指定 Outlook.MailItem對象(即表明一個郵件窗體)的To(收件人)、Subject(主題)、Body(郵件內容)屬性,而後再調用Send方法來發送郵件)
明白了思路以後,咱們理解代碼會更加容易了,具體實現代碼爲:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
// 引用Excel和Outlook的命名空間
using Excel = Microsoft.Office.Interop.Excel;
using Outlook = Microsoft.Office.Interop.Outlook;
string excelpath = string.Empty;
// 打開員工表格
privatevoid btnOpen_Click(object sender, EventArgs e)
{
using (OpenFileDialog openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "Excel File(*.xls;*.xlsx)|*.xls;**.xlsx|All Files(*.*)|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
txtExcelPath.Text = openFileDialog.FileName;
excelpath = openFileDialog.FileName;
}
}
}
// 自動給本月壽星發郵件通知
privatevoid btnSendEmail_Click(object sender, EventArgs e)
{
if (!File.Exists(txtExcelPath.Text))
{
MessageBox.Show("員工表路徑不存在,請確保輸入正確的文件路徑");
return;
}
if (txbBirthday.Text.Trim() == string.Empty || txbEmail.Text.Trim() == string.Empty)
{
MessageBox.Show("請先輸入員工表中生日信息所在的列和郵箱信息所在的列!");
return;
}
// 輸入信息都正確時開始發送郵件
SendEmail(int.Parse(txbBirthday.Text.Trim()), int.Parse(txbEmail.Text.Trim()));
}
// 發送郵件方法
privatevoid SendEmail(int birthDayColumn,int emailColumn)
{
// 得到當前月份
int nowmonth = DateTime.Now.Month;
// 發送郵件地址字符串
string toEmailString = string.Empty;
string emailBody="請收到郵件的員工,請本月28號到休閒室來參加生日Party";
Excel.Application excelApp = null;
Excel.Workbook workbook =null;
Excel.Worksheet worksheet = null;
Excel.Range range = null;
try
{
// 新建Excel應用程序被設置它不可見
excelApp = new Excel.Application();
excelApp.Visible = false;
workbook = excelApp.Workbooks.Open(excelpath);
// 得到打開文件的激活表格
worksheet= workbook.ActiveSheet;
// 遍歷表格中的全部行
for (int row = 2; row < worksheet.UsedRange.Rows.Count + 1; row++)
{
// 由於個人測試表格中第四列是生日信息,在Excel中第一行的下標是從1開始的
// 這裏原本須要在頁面設置一個文本框讓用戶填寫生日信息是在那一列的
// 這裏爲了測試就直接在程序中指定
// 下面的Range就表明生日列中每個單元格
range = worksheet.Cells[row, birthDayColumn];
// 咱們能夠經過Range.Value來得到單元格中的生日信息
// 由於我生日單元格中爲日期格式,因此得到的是日期類型,因此直接經過Month屬性來得到月份
int month = range.Value.Month;
// 若是咱們的Excel文檔中生日時間設置爲文本格式的話,這時候就須要經過分割字符串的方式來得到月份
// 經過Split函數來把生日信息以'/'符號分隔,分隔的數組的第二個就是月份
//int month = Int32.Parse(birthday.Split('/')[1]);
// 若是月份等於當前月的話,就給這我的發郵件
if (month == nowmonth)
{
// 得到本月生日員工的郵件地址
toEmailString += ";" + ((Excel.Range)worksheet.Cells[row, emailColumn]).Value;
}
}
}
catch (Exception ex)
{
MessageBox.Show("讀取員工表格時出錯,異常信息爲:" + ex.Message);
return;
}
finally
{
workbook.Close(Excel.XlSaveAction.xlDoNotSaveChanges);
excelApp.Quit();
if (workbook != null)
{
Marshal.FinalReleaseComObject(workbook);
workbook = null;
}
if (excelApp != null)
{
Marshal.FinalReleaseComObject(excelApp);
excelApp = null;
}
}
if (CreateEmailItem("生日提醒", toEmailString, emailBody))
{
MessageBox.Show("成功給本月壽星發送郵件提醒");
}
}
// 建立郵件項
privatebool CreateEmailItem(string subjectEmail,string toEmail,string bodyEmail)
{
Outlook.Application outlookapp = null;
Outlook.MailItem email =null;
try
{
// 建立郵件項,就如你手動點新建郵件同樣
outlookapp = new Outlook.Application();
email = outlookapp.CreateItem(Outlook.OlItemType.olMailItem);
// 指定郵件的主題,收件人和內容,就如你在新建郵件窗體中輸入收件人,主題和內容同樣
email.Subject = subjectEmail;
email.To = toEmail;
email.Body = bodyEmail;
email.Importance = Outlook.OlImportance.olImportanceHigh;
// 發送郵件,就如你點界面上的發送郵件操做同樣
((Outlook._MailItem)email).Send();
}
catch(Exception ex)
{
MessageBox.Show("發送郵件的時候失敗,異常信息爲:" + ex.Message);
returnfalse;
}
finally
{
// 釋放資源
((Outlook._Application)outlookapp).Quit();
if (email != null)
{
Marshal.FinalReleaseComObject(email);
email = null;
}
if (outlookapp != null)
{
Marshal.FinalReleaseComObject(outlookapp);
outlookapp = null;
}
}
returntrue;
}
爲了測試程序,我新建了一個員工信息表,表格的格式以下(你固然能夠根據本身的須要更改格式):
如今就讓咱們看看該程序的運行效果:
4、 小結
到這裏,本專題的內容就和你們介紹完了,在下一個專題中將向你們介紹下如何經過Office提供的API的來遙控幻燈片。若是你們對本專題中兩個工具的實現源碼有任何的疑問,均可以在下面留言給我。以爲不錯的話,幫忙贊下,感謝你們的支持。