POI 多選下拉選單(複選框) 匯出Excel模板 下拉選單單選,下拉選單多選
最近公司要做Excel的模板匯出,匯入資料的工作,匯出時還要動態生成模板,並且生成單選下拉選單,和多選下拉選單。
開始搞這個很快除了多選的都搞定了,就是多選卡住了。弄了很久。。。最後終於在和多方面的交流下成功弄出。
之前在網上找不到方法很是頭疼,現在弄出來分享一下給大家。。歡迎指教 效果檔案
在效果檔案裡K(根據需要可以隱藏)列就是str = Sheet1.Cells(1, 11) 要獲取的值,其中6,7就是6列和7列
具體思路是,java POI 和帶有VB的Excel模板結合。注意:Excel要支援VB
1.先準備一個帶有VB語言實現下拉選單多選功能的Excel模板點選開啟連結
2.用java POI 讀取這個模板檔案,並把資料寫入模板這個就不具體寫了網上都有
想要下拉選單多選,要先有下拉選單。
Workbook workbook = null; try { workbook = WorkbookFactory.create(new File("C:\\Users\\LQS\\Desktop/test.xlsm")); //讀取模板Excel檔案, } catch (IOException e) { e.printStackTrace(); } catch (InvalidFormatException e) { e.printStackTrace(); } //建立一個標籤頁 Sheet sheet = workbook.getSheetAt(0);//獲取sheet
DataValidationHelper dvHelper = sheet.getDataValidationHelper(); XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper .createExplicitListConstraint(strs);//strs下拉選單的資料陣列例如:String[] strs = {"A","B","C"} addressList = new CellRangeAddressList(1,endRow, i,i);// 第一個引數是開始行,第二個是結束行,第三個是開始列,第四個是結束列 validation = dvHelper.createValidation(dvConstraint, addressList);
//設定只能選下拉選單裡的值不能隨便輸入
validation.setSuppressDropDownArrow(true); validation.setShowErrorBox(true);sheet.addValidationData(validation); VB 方法:
Private Sub Worksheet_Change(ByVal Target As Range) ' VB workSheet 裡自帶的方法(Change)
Dim str As String ' 定義一個字串用來獲取複選框所在的列數
str = Sheet1.Cells(1, 11) ' 獲取第1行第11列裡的值(‘’根據自己的需要看放在那裡合適‘’這個單元格里的資料就是你想要做成複選下拉選單的列或多列)
Dim vals() As String ' 定義一個字元竄陣列
vals = Split(str, ",") ' 獲取到的數是多個複選框進行切分例如:6,7,8
Dim Oldvalue As String ' 複選框單元格舊資料
Dim Newvalue As String ' 你選的新資料
Application.EnableEvents = True
On Error GoTo Exitsub
For i = 0 To UBound(vals) ' 迴圈遍歷vals陣列
If Target.Column = vals(i) Then ' 複選框所在的列
If Target.SpecialCells(xlCellTypeAllValidation) Is Nothing Then
GoTo Exitsub
Else: If Target.Value = "" Then GoTo Exitsub Else
Application.EnableEvents = False
Newvalue = Target.Value
Application.Undo
Oldvalue = Target.Value
If Oldvalue = "" Then
Target.Value = Newvalue
Else
If InStr(1, Oldvalue, Newvalue) = 0 Then ' 去重,
Target.Value = Oldvalue & ", " & Newvalue ' 如果不重複是新的就用‘,’拼接
Else:
Target.Value = Oldvalue ' 如果重複還是原來的值
End If
End If
End If
End If
Next
Application.EnableEvents = True
Exitsub:
Application.EnableEvents = True
End Sub