1. 程式人生 > >POI 多選下拉選單(複選框) 匯出Excel模板 下拉選單單選,下拉選單多選

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