這個需求源於壹個朋友的請求,他向我陳述了這個需求的原因。
我朋友工廠的質量部門每天需要測試大量的產品零件,並將測試數據制作成報告,這是QC測量員的日常工作。由於近期公司訂單和生產任務增加,測量員每天需要檢測大量產品零件,產生大量測量數據。QC調查員還需要將這些數據整理成指定格式的報告,並提交給團隊負責人進行審查。訂單的增加將導致QC調查員的工作量增加。他問我有沒有什麽方法可以減輕QC調查員的工作量,提高工作效率。
從他的描述中可以看出,有兩項任務是重復的:測量零件和制作報告。對於測量零件,我沒有辦法提高效率,除非規定只測試部分零件,而不是全部。在工廠規定必須進行所有測試的情況下,很難優化第壹道工序。對於第二個過程,將測量數據制作成報告。看來這壹步可以用來提高效率。因為指定了需要制作的報告的格式,所以只需要將測量結果數據導入到指定格式的報告中,就可以順利完成第二步。
該報告為EXCEL格式,每行和每列的布局都已確定。只需將指定的數據放在相應的列位置即可。畫
項目列是零件的名稱,平均值列是相應零件的測量數據。
測量機導出的零件數據格式支持常用的CSV、XML和TXT格式,導出的數據在EXCEL中是這樣的。
我選擇將測量數據導出為csv格式,這樣便於查看和分析。如果選擇XML格式,大多數數據員工無法理解它,並且不方便查看它。對於這種平面結構(相對於層次結構)的數據,導出為CSV是首選。
下壹步是分析如何快速將測量數據制作成報告。
大多數EXCEL用戶都熟悉公式,並且制作報表相當專業和快速。我先嘗試直接用公式求解。
這個要求用公式來描述,即在指定區域中查找值,然後將指定值返回到相應的數據列中。
EXCEL的VLOOKUP功能可以實現我的目標。以下解釋:公式VLOOKUP(C1,A:B,2,)的意思是從A列到B列查找c 1的數據,並顯示B列的相應數據。
但是有壹個問題,報告和測量數據分別放在兩個文件中,測量數據不允許放在報告所在的文件中。用戶需要先將測量數據添加到報表文件中,然後使用上述公式查找匹配值,完成後再刪除測量數據所在的工作表。如果要制作許多這樣的報表,用戶必須重復添加和刪除工作表。雖然可以解決問題,但有點不完善,用戶操作起來不方便。這個方案可以解決問題,但並不完美。
試著用VBA的方法,網上有很多關於VBA的信息。VBA相當於程序的方式。我的想法是先讀取測量數據文件,將其放在類似字典的結構中,然後循環讀取報表中需要數據的部分,取出其對應的測量數據並將其分配給對應的單元格。我沒有研究過VBA,也不知道如何開始。我在網上用關鍵詞“如何閱讀VBA的壹份文件”搜索了很長時間,但我找不到相關內容。這個方案不會通過編程實現,所以我不得不放棄。
考慮使用VSTO。默認情況下,VS 2005/2008將安裝此組件,這相當於VBA的托管版本。而且VSTO支持C#語言,可以用最熟悉的技術解決這個問題。在C#中,讀取文件相當容易,StreamReader可以解決讀取文件的問題。
打開VS2008並創建壹個新的Excel 2003工作簿項目。
向導將創建具有以下主體代碼的類。
公共分部類ThisAddIn
{
private void ThisAddIn_Startup(對象發送方,系統。EventArgs e){ }
private void ThisAddIn_Shutdown(對象發送方,系統。EventArgs e){ }
}
如果妳不明白,妳可以猜壹猜。根據名稱,您可以猜測啟動和關閉是在插件加載和關閉時執行的事件。
在ThisAddIn_Startup中,加載接口。
您可以添加菜單或工具按鈕。添加菜單的效果如下
具體代碼編寫如下
private void ThisAddIn_Startup(對象發送方,系統。e)事件
{
#區域VSTO生成的代碼
這個。應用程序=(Excel。應用程序)微軟。office . tools . excel . excel locale 1033 proxy。換行(類型為(Excel。應用),這個。申請);
#結束區域
這個。AddMenu();
}
辦公室。commandbarcontrolmenutop;
辦公室。CommandBarControl menuCreateMail = null;
私有void AddMenu()
{
辦公室。CommandBar bar = this。application . command bars . activemenubar;
梅努托普。Caption =“胡藝工具公司“;
辦公室。CommandBarPopup commandBarPopupTmp = menu top。像辦公室壹樣控制。CommandBarPopup
菜單創建郵件。Caption =“導入數據“;
辦公室。CommandBarButton button menu = menu create mail as Office。CommandBarButton
按鈕菜單。Click+= new Microsoft . office . core . _ CommandBarButtonEvents _ Click eventhandler(button menu _ Click);
}
這裏有壹個竅門。如果在AddMenu方法中定義了menuTop或menuCreateMail,將導致在EXCEL打開後多次單擊按鈕事件,並且該事件只會執行壹次。除非您重新啟動EXCEL。
點擊菜單“導入數據”的事件代碼如下
void button menu _ Click(Microsoft。office . core . commandbarbutton Ctrl,ref bool CancelDefault)
{
//分析CSV文件並設置指定報告列的值。
}
代碼更長。第壹個是彈出對話框,您可以在其中選擇包含要導入、分析和導入值的測量數據的文件。
導入值的代碼涉及操作EXCEL。代碼如下所示
Excel。工作表sheet =(Excel。工作表)應用程序。ActiveWorkbook . ActiveSheet
int rowIndex = 10;int maxIndex = 300
for(rowIndex = 10;rowIndex & ltmaxIndexrowIndex++)
{
Excel。Range source = sheet . get _ Range(“A“+rowIndex,“A“+rowIndex);
Excel。Range target = sheet . get _ Range(“F“+rowIndex,“F“+rowIndex);
if(字符串。IsNullOrEmpty(來源。Value2.ToString())
繼續;
其他
{
string hashkey = source。value 2 . ToString();
如果(表。包含(hashkey))
目標。Value2 =表【hashkey】。ToString();
}
}
表的類型是Hashtable,它以零件名稱作為鍵名,以零件的測量數據作為值。
讀取文件的代碼也有點棘手。我的機器是XP SP2英文版,EXCEL是2003英文標準版。如果您使用COM Interop API讀取數據文件並將數據文件作為EXCEL文件讀取,通常會出現亂碼。如果您將數據文件作為文本文件讀取,則沒有問題。我壹直沒能找到這個問題的原因。
讓我們談談如何部署這個插件。以下步驟是必需的,您必須是管理員才能執行以下步驟。
1安裝。目標計算機上的。Net Framework 2.0。
2安裝Office 2007 PIAs
3安裝VSTO運行時2.0:
請確保EXCEL 2003已安裝了SP2補丁,否則請安裝SP2補丁。
5編譯並安裝項目,並執行它以完成插件的安裝。
6轉到安裝插件的目錄,執行命令行工具,設置程序集的權限(程序集名稱為QCExcelAddIn)。
caspol-machine–addfulltrust QCExcelAddIn.dll
完成這些步驟後,打開EXCEL,您應該能夠看到插件的菜單。如果您仍然看不到菜單,請查看EXCEL是否禁用了該插件。在DisalbeItems中激活插件。
至此,這個問題已經圓滿解決。使用壹段時間後,測量員要求修改測量數據的文件格式。
分析這種格式的代碼相對簡單,只需要通過正則公式直接對字符串進行分解。但是上面版本的格式也需要判斷是奇數行還是偶數行。奇數行顯示器件名稱,偶數行讀取測量數據。
關於這個插件的註冊信息,在註冊表中有相應的鍵值對。
插件所在的註冊表項的路徑是
也許這種方法也不是最佳方法。歡迎提供您的想法供您參考。