最近的項目要求讀取xls文件內的單元格,並且單元格旁邊會有覆選框標識類型。 搜了下只有java的POI有例子,NOPI看項目文檔好像是沒有實現讀取控制項的功能。 java實現 POI POI如何解析出excel 中覆選框是否被選中 https://blog.csdn.net/qq_29832217/a ...
最近的項目要求讀取xls文件內的單元格,並且單元格旁邊會有覆選框標識類型。
搜了下只有java的POI有例子,NOPI看項目文檔好像是沒有實現讀取控制項的功能。
java實現 POI
POI如何解析出excel 中覆選框是否被選中
https://blog.csdn.net/qq_29832217/article/details/104413475
C#導出 Excel 時, 生成 CheckBox 控制項 https://www.cnblogs.com/wisdo/p/9970922.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;//代碼運行時是否顯示excel界面 8 excelApp.DisplayAlerts = false;//代碼運行時是否顯示警告 9 excelApp.AlertBeforeOverwriting = false;//覆蓋保存的時候是否提示 10 fi = new FileInfo(filepath); 11 var counter = 0; 12 string name = ""; 13 try 14 { 15 wb = excelApp.Workbooks.Open(fi.FullName);//打開excel文件。 16 Excel.Worksheet ws = wb.Worksheets[3] as Excel.Worksheet;//選擇對應 sheet 17 //var control = ws.Shapes._Default(0); 18 var count = ws.Shapes.Count;//獲取總過有多少相關控制項,一個控制項需要一個shape 19 var chk = ws.CheckBoxes(1);//通過CheckBoxes的下標去獲取CheckBox 最大值看excel表格的sheet裡面有多少個 20 var chk1 = ws.CheckBoxes(13);//廠標 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應用,否則進程會一直存在 42 excelApp = null; 43 }
查找控制項其實比較簡單,但是因為先看了最上面兩個例子,測試的時候發現所有的CheckBox並不會都讀取到。然後分析了一下裡面Worksheets的類型。相關的控制項類型可以直接取出來,但是類型是dyncmic類型的,所以調試的時候看變數什麼的不方便。
相關的屬性欄位可以從官網查詢,然後調試的時候,從VS的監視變數里去手動讀取。
定位這些CheckBox可以通過修改一下這個CheckBox的名字,或者選中狀態,或者CheckBox.Text顯示的文字,如果excel模板是固定的,一般獲取用的下標就是固定的。
我這裡用的是 13和14,測試了別的用同一個模板做的表格都正常解析了。
20 var chk1 = ws.CheckBoxes(13);//廠標 21 var chk2 = ws.CheckBoxes(14);//特殊要求
番外:
使用過程中的報錯,WInForm能正常運行並解析表格,但是集成進Windows Service後,就報 無法訪問。
參考了下麵兩個例子。
Microsoft Office Excel不能訪問文件*.xls的解決方案
檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時失 敗,原因是出現以下錯誤: 80080005
集成到Windows servcie報錯的解決方法(不一定正確,我是這樣試瞭然後就正常了的)
第一步,找到部署的Windows服務實例,進入【屬性】——【登錄】界面。 勾選 【允許服務與桌面交互】,這個預設是沒有勾選上的。
第二部,按照上面連接的給的例子,例子是 部署在IIS上,在組件服務里的DCOM -Microsoft Excel Appliction 增加NETWORK SERVICE用戶許可權,我這邊因為是部署在內網,就直接把相關選項的許可權設置成Everyone。
並設置 【標識】欄目的,不要設置成【互動式用戶】,互動式用戶需要伺服器登錄進去,才有用,比如遠程桌面登錄進去,但是一把遠程桌面關掉,用戶就註銷了,DCOM組件就用不了了,之前在金蝶也碰到這個現象,遠程進去後,再斷開,他們客戶端就連不上,再遠程桌面登錄進去,又能用了。
選擇下列用戶,並從【瀏覽】按鈕進去選擇用戶,不要自己手動輸入,手動輸入可能的是沒用的(我自己手輸入我電腦的用戶名,密碼也是對的,點應用也驗證通過了,但是就是不行) 記住,設置完如果還沒用,重啟下電腦或者伺服器看看