POI 建立聯動下拉列表例項
現在很多java企業級應用要求進行資料在Excel上的操作,比較常用的技術是jxl和poi,對比而言兩者都是比較簡單實用,但在實現下拉列表功能上,jxl的功能介面沒有poi的完善,比如實現下拉列表聯動技術,就是poi比較簡單好用,目前還在網上沒有找到能夠用jxl實現這個功能,希望讀者能夠仔細閱讀jxl api,以求找到實現這一功能的介面。下面我來大概羅列用poi實現下拉列表聯動的思路,然後貼出程式碼。
1.建立一個要顯示的shee1t,並將非下拉框的資料依次寫入sheet中,下拉框的資料要另外處理;
2.建立一個隱藏的sheet2,用於規律存放下拉框的資料,以行為單位,要計算關聯的範圍,記住sheet1的下拉框是和sheet2的資料關聯的;
3.設定關聯;
4.設定下拉框並可以增加下拉框操作驗證;
主要核心程式碼:
package com.pccw.custom.ln.fas.ar.test;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import com.pccw.business.fas.ap.utils.excel.upload.UploadMappingCell;
import com.pccw.business.fas.ap.utils.excel.upload.UploadMappingReader;
import com.pccw.custom.ln.fas.ar.vo.SalesTaxAjustmentInfo;
import com.pccw.kernel.util.SystemProperties;
public class ExcelSelectUtils {
private static String EXCEL_HIDE_SHEET_NAME = "excelhidesheetname";
private static String HIDE_SHEET_NAME_LINE = "lineType";
private HashMap map = new HashMap();
private static String[] lineType = {"line","tax"};
private static String[] difReasonLine = {"line","a","b","c","d","e"};
private static String[] difReasonTax = {"tax","f","g","h","i","j)"};
private static CellStyle getTitleStyle(Workbook wb){
CellStyle style = wb.createCellStyle();
//對齊方式設定
style.setAlignment(CellStyle.ALIGN_CENTER);
//邊框顏色和寬度設定
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderTop(CellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
style.setFillBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
//設定背景顏色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
//粗體字設定
Font font = wb.createFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
style.setFont(font);
return style;
}
/**
* 建立一列資料
* @param currentRow
* @param textList
*/
private static void creatRow(Row currentRow,String[] textList){
if(textList!=null&&textList.length>0){
int i = 0;
for(String cellValue : textList){
Cell userNameLableCell = currentRow.createCell(i++);
userNameLableCell.setCellValue(cellValue);
}
}
}
/**
* 名稱資料行列計算表示式
* @param order
* @param size
* @param cascadeFlag
* @return
*/
private static String creatExcelNameList(int order,int size,boolean cascadeFlag){
char start = 'A';
if(cascadeFlag){
start = 'B';
if(size<=25){
char end = (char)(start+size-1);
return "$"+start+"$"+order+":$"+end+"$"+order;
}else{
char endPrefix = 'A';
char endSuffix = 'A';
if((size-25)/26==0||size==51){//26-51之間,包括邊界(僅兩次字母表計算)
if((size-25)%26==0){//邊界值
endSuffix = (char)('A'+25);
}else{
endSuffix = (char)('A'+(size-25)%26-1);
}
}else{//51以上
if((size-25)%26==0){
endSuffix = (char)('A'+25);
endPrefix = (char)(endPrefix + (size-25)/26 - 1);
}else{
endSuffix = (char)('A'+(size-25)%26-1);
endPrefix = (char)(endPrefix + (size-25)/26);
}
}
return "$"+start+"$"+order+":$"+endPrefix+endSuffix+"$"+order;
}
}else{
if(size<=26){
char end = (char)(start+size-1);
return "$"+start+"$"+order+":$"+end+"$"+order;
}else{
char endPrefix = 'A';
char endSuffix = 'A';
if(size%26==0){
endSuffix = (char)('A'+25);
if(size>52&&size/26>0){
endPrefix = (char)(endPrefix + size/26-2);
}
}else{
endSuffix = (char)('A'+size%26-1);
if(size>52&&size/26>0){
endPrefix = (char)(endPrefix + size/26-1);
}
}
return "$"+start+"$"+order+":$"+endPrefix+endSuffix+"$"+order;
}
}
}
private static DataValidation getDataValidationByFormula(String formulaString,int naturalRowIndex,int naturalColumnIndex){
//載入下拉列表內容
DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);
//設定資料有效性載入在哪個單元格上。
//四個引數分別是:起始行、終止行、起始列、終止列
int firstRow = naturalRowIndex-1;
int lastRow = naturalRowIndex-1;
int firstCol = naturalColumnIndex-1;
int lastCol = naturalColumnIndex-1;
CellRangeAddressList regions=new CellRangeAddressList(firstRow,lastRow,firstCol,lastCol);
//資料有效性物件
DataValidation data_validation_list = new HSSFDataValidation(regions,constraint);
//設定輸入資訊提示資訊
data_validation_list.createPromptBox("下拉選擇提示","請使用下拉方式選擇合適的值!");
//設定輸入錯誤提示資訊
data_validation_list.createErrorBox("選擇錯誤提示","你輸入的值未在備選列表中,請下拉選擇合適的值!");
return data_validation_list;
}
public static void setDataValidation(Workbook wb, int listSize){
int sheetIndex = wb.getNumberOfSheets();
if(sheetIndex>0){
for(int i=0;i<sheetIndex;i++){
Sheet sheet = wb.getSheetAt(i);
if(!EXCEL_HIDE_SHEET_NAME.equals(sheet.getSheetName())){
DataValidation data_validation_list = null;
for(int a=2; a<listSize+3; a++){
//行型別選項新增驗證
data_validation_list = getDataValidationByFormula(HIDE_SHEET_NAME_LINE,a,5);
sheet.addValidationData(data_validation_list);
//差異原因選項新增驗證資料
data_validation_list = getDataValidationByFormula("INDIRECT(E"+a+")",a,13);
sheet.addValidationData(data_validation_list);
}
}
}
}
}
/**
* 建立一個名稱
* @param workbook
* @param nameCode
* @param order
* @param size
* @param cascadeFlag
*/
private static void creatExcelNameList(Workbook workbook,String nameCode,int order,int size,boolean cascadeFlag){
Name name;
name = workbook.createName();
name.setNameName(nameCode);
name.setRefersToFormula(EXCEL_HIDE_SHEET_NAME+"!"+creatExcelNameList(order,size,cascadeFlag));
}
public static File getSelectExcels(String sheetName, List list, Class cls){
File file = null;
sheetName = StringUtils.isNotBlank(sheetName) ? sheetName : "Sheet 1";
if(list != null && list.size() >0){
List mappingList = UploadMappingReader.getSheetMapping(cls.getName(), "1");
Workbook wb = null;
if (mappingList != null && mappingList.size() > 0) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String fileName =SystemProperties.get("fas.download.temp") + fmt.format(new Date()) + ".xls";
file = new File(fileName);
int rowIndex = 0;
Map attrMap = new HashMap();
try{
//POI建立表格
wb = new HSSFWorkbook();
//建立標題行
//createExcelMo(wb,mappingList,sheetName,rowIndex);
Sheet sheet = wb.createSheet(sheetName); //建立一個sheet
Row row = sheet.createRow(rowIndex);
for(int column=0; column<mappingList.size(); column++){
UploadMappingCell headerCell = (UploadMappingCell) mappingList.get(column);
Cell cell = row.createCell(column);
cell.setCellStyle(getTitleStyle(wb));
cell.setCellValue(headerCell.getHeader());//列名
attrMap.put("" + column, headerCell.getAttribute());
}
rowIndex++; //換行
//迴圈單元格賦值
for(int i=0; i<list.size(); i++){
Object obj = list.get(i);
SalesTaxAjustmentInfo sat = (SalesTaxAjustmentInfo) obj;
//Row currentRow = hideInfoSheet.createRow(rowIndex);
Row currentRow = sheet.createRow(rowIndex);
for(int column = 0; column < attrMap.size();column++){
Cell cell = currentRow.createCell(column);
String value = "";
String attribute = (String) attrMap.get("" + column);
value = BeanUtils.getProperty(obj, attribute);
cell.setCellValue(value);
}
rowIndex++;
}
//建立級聯下拉框關聯
Sheet hideInfoSheet = wb.createSheet(EXCEL_HIDE_SHEET_NAME); //聯動隱藏
Row lineTypeRow = hideInfoSheet.createRow(0); //行型別
creatRow(lineTypeRow, lineType);
Row difReasonLineRow = hideInfoSheet.createRow(1);
creatRow(difReasonLineRow, difReasonLine);
Row difReasonTaxRow = hideInfoSheet.createRow(2);
creatRow(difReasonTaxRow, difReasonTax);
//名稱管理
creatExcelNameList(wb, HIDE_SHEET_NAME_LINE, 1, lineType.length, false);
//動態設定對應型別的原因列表
creatExcelNameList(wb, lineType[0], 2, difReasonLine.length, true);
creatExcelNameList(wb, lineType[1], 3, difReasonTax.length, true);
//設定隱藏頁標誌
wb.setSheetHidden(wb.getSheetIndex(EXCEL_HIDE_SHEET_NAME), true);
//增加下拉框並增加資料驗證
int listSize = list.size();
setDataValidation(wb,listSize);
}catch(Exception e){
e.printStackTrace();
}
}
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream(file);
wb.write(fileOut);
fileOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return file;
};
}
相關推薦
POI 建立聯動下拉列表例項
現在很多java企業級應用要求進行資料在Excel上的操作,比較常用的技術是jxl和poi,對比而言兩者都是比較簡單實用,但在實現下拉列表功能上,jxl的功能介面沒有poi的完善,比如實現下拉列表聯動技術,就是poi比較簡單好用,目前還在網上沒有找到能夠用jxl實現這個
Java基於POI實現excel任意多級聯動下拉列表——支援從資料庫查詢出多級資料後直接生成【附原始碼】
Excel相關知識點 (1)名稱管理器——Name Manager 【CoderBaby】首先需要建立多個名稱(包含key及value),作為下拉列表的資料來源,供後續通過名稱引用。可通過選單:“公式”---“名稱管理器&rdquo
JavaScript 數組 二級聯動下拉列表
結束 arr CI load 上海 恢復 rip null 遍歷數組 ---恢復內容開始--- <select id = "a1" onchange = "addOption()"></select> <select id = "a2">
js省市縣三級聯動下拉列表的示例
function selectOnChange(SelId,toSelId){//document.getElementById(toSelId).innerHTML="";$.ajax({url:"<%=basePath%>medium/findAreaByParentId.do",type:"
省市區三級聯動選單實現及三級聯動下拉列表框預設值的設定
以下是HTML程式碼<html> <body> <label for="select_city">城市</label> <div data-role="controlgroup" id="select_p_c_a" data-ajax="false"&g
Excel中如何製作下拉列表及聯動下拉列表
http://jingyan.baidu.com/article/414eccf61887cf6b421f0a74.html excel快速定位並提取指定行列交叉單元格的內容 本例介紹如何在Excel表中快速定位並提取指定行列交叉單元格的內容。 1、如圖
POI學習(一)資料校驗之建立下拉列表框
POI建立Excel下拉列表框來設定表格資料有效性,這裡需要使用幾個重要的物件,關係依賴圖如下 XSSFDataValidationHelper 工具類 XSSFDataValidationConstraint 設定資料有效性條件 CellRangeAddressList 設定有效區域 XSSFDataV
文本框實現下拉列表聯動
function on() ole -1 nbsp val edit end col 昨天做了一個文本框過濾下拉列表選項的東西,技術不復雜,記錄下來一遍提高再使用效率。 $(‘#searchOption‘).keyup(function(){
使用Cloud application Studio在C4C UI裡建立下拉列表(dropdown list)
在Cloud Application Studio裡新建一個Code List Data Type: 維護Value和描述資訊,以及在ABSL裡使用的constant值。 儲存之後,上述維護的資訊會儲存到一個名為.codelist 的檔案裡。啟用之後,這個新建的資料型別就可以用於定義extensi
下拉列表框聯動事件 DropList
1.新增onchange事件。 $("#gyomuKbn").on("change", function(){ var currVal = this.value; gyomuKbnChange(currVal); }); 2.觸發被聯動DropList的change事件 fun
jqGrid----下拉列表框下拉聯動,dataEvents回撥函式。
1.給單元格添onchange事件 例項: $('#gridYosan').setColProp('yosanka', {editoptions: { dataEvents:[{ type: 'change', fn: fun
Excel: Creating Drop-Down Lists 在Excel中建立下拉列表 Lynda課程中文字幕
Excel: Creating Drop-Down Lists 中文字幕 Excel:建立下拉列表 中文字幕Excel: Creating Drop-Down Lists 通過在Excel電子表格中包含下拉列表,您可以簡化自己和團隊的工作,並確保資料準確輸入 許多人認為它需要先進的
使用JavaScript實現下拉列表的聯動
在設計使用者註冊頁面時經常有籍貫等資訊要填寫,填寫這些資訊一般都是先選擇國家->省->市->鎮。 此篇主要講述,當第一個下拉列表中的內容選定之後第二個下拉列表中的內容也隨之改變(例如:當你第一個下拉列表選擇江西時,第二個下拉列表會顯示南昌贛州等城市;當你第
Vue下拉列表el-select二級聯動效果
最近公司有一個C#的專案需要來完成,前端用了Vue.js。首次使用Vue.js還是有點不適應的。 功能介紹:要實現第一級下拉列表資料改變時,二級下拉列表的值隨著改變。 <el-form-item prop="p_Roleprop" label="角色許可權:">
poi匯出下拉列表,解決下拉列表資料過多問題
// 傳入下拉列表陣列值,構造資訊模板 public static Workbook generateExcel(String[]typeArrays) { Workbook wb = new XSSFWorkbook(); // 建立模板工作表 Sh
省市聯動——季度-月份下拉列表框——省市聯動類庫版
引入的jQuery類庫: city.min.js; jquery.cityselect.js; jquery-1.6.1.js原始碼: <html> <head> <me
省市聯動——季度-月份下拉列表框——jQuery版
引入jQuery類庫: jquery-1.6.1.js; 原始碼: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <
下拉列表框三級聯動
Web頁面實現三級聯動 最近專案裡面有一個功能需要使用三級聯動來實現,但是專案中又沒有很好的 demo 來實現這個功能,於是乎自己手敲了一個簡單的三級聯動的程式碼,記錄一下。時間倉促,程式碼中還有很多地方可以優化。 <div class="row"> <div class="c
easyui中實現多個下拉列表聯動
先看下原始碼 <script type="text/javascript" charset="UTF-8"> $(function() { var provinceId = $('#provinceId').combobox({ url : 'p
使用標籤建立下拉列表和多選列表框
平常一樣使用<html:select/>得到下拉列表,也可以用該標籤得到多選列表框, 如下: <html:select property="rightSelect" size="18" multiple="true"> 在<html:selec