最近的項(xiàng)目要求讀取xls文件內(nèi)的單元格,并且單元格旁邊會(huì)有復(fù)選框標(biāo)識(shí)類(lèi)型。
搜了下只有java的POI有例子,NOPI看項(xiàng)目文檔好像是沒(méi)有實(shí)現(xiàn)讀取控件的功能。
java實(shí)現(xiàn) POI?
POI如何解析出excel 中復(fù)選框是否被選中
https://blog.csdn.net/qq_29832217/article/details/104413475?
C#導(dǎo)出 Excel 時(shí), 生成 CheckBox 控件??https://www.cnblogs.com/wisdo/p/9970922.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632345.html
?
?
直接上代碼:
1 using Excel = Microsoft.Office.Interop.Excel; 2 using Range = Microsoft.Office.Interop.Excel.Range; 3 using Shape = Microsoft.Office.Interop.Excel.Shape; 4 var excelApp = new Excel.Application(); 5 var excelApp = new Excel.Application(); 6 Excel.Workbook wb = null; 7 excelApp.Visible = true;//代碼運(yùn)行時(shí)是否顯示excel界面 8 excelApp.DisplayAlerts = false;//代碼運(yùn)行時(shí)是否顯示警告 9 excelApp.AlertBeforeOverwriting = false;//覆蓋保存的時(shí)候是否提示 10 fi = new FileInfo(filepath); 11 var counter = 0; 12 string name = ""; 13 try 14 { 15 wb = excelApp.Workbooks.Open(fi.FullName);//打開(kāi)excel文件。 16 Excel.Worksheet ws = wb.Worksheets[3] as Excel.Worksheet;//選擇對(duì)應(yīng) sheet 17 //var control = ws.Shapes._Default(0); 18 var count = ws.Shapes.Count;//獲取總過(guò)有多少相關(guān)控件,一個(gè)控件需要一個(gè)shape 19 var chk = ws.CheckBoxes(1);//通過(guò)CheckBoxes的下標(biāo)去獲取CheckBox 最大值看excel表格的sheet里面有多少個(gè) 20 var chk1 = ws.CheckBoxes(13);//廠標(biāo) 21 var chk2 = ws.CheckBoxes(14);//特殊要求 22 string PumpColor = ""; 23 if (chk1.Value == 1) 24 { 25 PumpColor = chk1.Text + ":" + PumpColorDes; 26 } 27 if (chk2.Value == 1) 28 { 29 PumpColor = chk2.Text + ":" + PumpColorDes; 30 } 31 if (chk1.Value != 1 && chk2.Value != 1) 32 PumpColor = PumpColorDes; 33 this.txtFopResult.Text = PumpColor.Replace("\n","\r\n"); 34 } 35 catch (Exception ex) 36 { 37 MessageBox.Show(ex.Message); 38 } 39 finally 40 { 41 excelApp.Quit(); //退出excel應(yīng)用,否則進(jìn)程會(huì)一直存在 42 excelApp = null; 43 }
?
?
查找控件其實(shí)比較簡(jiǎn)單,但是因?yàn)橄瓤戳俗钌厦鎯蓚€(gè)例子,測(cè)試的時(shí)候發(fā)現(xiàn)所有的CheckBox并不會(huì)都讀取到。然后分析了一下里面Worksheets的類(lèi)型。相關(guān)的控件類(lèi)型可以直接取出來(lái),但是類(lèi)型是dyncmic類(lèi)型的,所以調(diào)試的時(shí)候看變量什么的不方便。
?相關(guān)的屬性字段可以從官網(wǎng)查詢(xún),然后調(diào)試的時(shí)候,從VS的監(jiān)視變量里去手動(dòng)讀取。
?
定位這些CheckBox可以通過(guò)修改一下這個(gè)CheckBox的名字,或者選中狀態(tài),或者CheckBox.Text顯示的文字,如果excel模板是固定的,一般獲取用的下標(biāo)就是固定的。
我這里用的是? 13和14,測(cè)試了別的用同一個(gè)模板做的表格都正常解析了。
20 var chk1 = ws.CheckBoxes(13);//廠標(biāo) 21 var chk2 = ws.CheckBoxes(14);//特殊要求
?
番外:
使用過(guò)程中的報(bào)錯(cuò),WInForm能正常運(yùn)行并解析表格,但是集成進(jìn)Windows Service后,就報(bào) 無(wú)法訪問(wèn)。
?
參考了下面兩個(gè)例子。
?
Microsoft Office Excel不能訪問(wèn)文件*.xls的解決方案
檢索 COM 類(lèi)工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時(shí)失 敗,原因是出現(xiàn)以下錯(cuò)誤: 80080005
集成到Windows servcie報(bào)錯(cuò)的解決方法(不一定正確,我是這樣試了然后就正常了的)
第一步,找到部署的Windows服務(wù)實(shí)例,進(jìn)入【屬性】——【登錄】界面。 勾選 【允許服務(wù)與桌面交互】,這個(gè)默認(rèn)是沒(méi)有勾選上的。
第二部,按照上面連接的給的例子,例子是 部署在IIS上,在組件服務(wù)里的DCOM -Microsoft Excel Appliction 增加NETWORK SERVICE用戶(hù)權(quán)限,我這邊因?yàn)槭遣渴鹪趦?nèi)網(wǎng),就直接把相關(guān)選項(xiàng)的權(quán)限設(shè)置成Everyone。
?
?并設(shè)置 【標(biāo)識(shí)】欄目的,不要設(shè)置成【交互式用戶(hù)】,交互式用戶(hù)需要服務(wù)器登錄進(jìn)去,才有用,比如遠(yuǎn)程桌面登錄進(jìn)去,但是一把遠(yuǎn)程桌面關(guān)掉,用戶(hù)就注銷(xiāo)了,DCOM組件就用不了了,之前在金蝶也碰到這個(gè)現(xiàn)象,遠(yuǎn)程進(jìn)去后,再斷開(kāi),他們客戶(hù)端就連不上,再遠(yuǎn)程桌面登錄進(jìn)去,又能用了。
選擇下列用戶(hù),并從【瀏覽】按鈕進(jìn)去選擇用戶(hù),不要自己手動(dòng)輸入,手動(dòng)輸入可能的是沒(méi)用的(我自己手輸入我電腦的用戶(hù)名,密碼也是對(duì)的,點(diǎn)應(yīng)用也驗(yàn)證通過(guò)了,但是就是不行) 記住,設(shè)置完如果還沒(méi)用,重啟下電腦或者服務(wù)器看看
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-632345.html
?
到了這里,關(guān)于C# 讀取帶CheckBox復(fù)選框控件的表格-并集成到Windows Service里面的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!