1. 程式人生 > >整理POI解析資料和生成下拉框模板的例子

整理POI解析資料和生成下拉框模板的例子


import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataValidation;
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;

/**
 * POI生成聯動下拉工具類
public class POIToExcelUtil {

	/* 隱藏的Sheet頁 */
	public static String EXCEL_HIDE_SHEET_NAME = "excelhidesheetname";
	
	
	
	/**
	 * 建立隱藏Sheet中的行和名稱集合
	 * @param workbook
	 * @param map
	 * @param rowIndex
	 * @param hideInfoSheet
	 */
	public static void createBatchRowAndNameList(Workbook workbook,Map<String,List<String>> map,int rowIndex,Sheet hideInfoSheet) {
		for (String name : map.keySet()) {
         	Row largeRegionWithSonRow = hideInfoSheet.createRow(rowIndex);
         	
         	List<String> temp = map.get(name);
         	POIToExcelUtil.creatRow(largeRegionWithSonRow,temp);
         	
         	POIToExcelUtil.creatExcelNameList(workbook,temp.get(0), rowIndex+1, temp.size() -1, true);
         	rowIndex++;
		}
	}

	/**
	 * 建立一行資料
	 * @param currentRow
	 * @param textList
	 */
	public static void creatRow(Row currentRow, List<String> textList) {
		if (textList != null && textList.size() > 0) {
			int i = 0;
			for (String cellValue : textList) {
				Cell userNameLableCell = currentRow.createCell(i++);
				userNameLableCell.setCellValue(cellValue);
			}
		}
	}

	/**
	 * 建立一個名稱
	 * @param workbook  工作薄
	 * @param nameCode 名稱
	 * @param order	
	 * @param size 長度
	 * @param cascadeFlag 是否聯動
	 */
	public static void creatExcelNameList(Workbook workbook, String nameCode,
			int order, int size, boolean cascadeFlag) {
		//名稱不能以數字開頭,Excel規定的。(名稱裡不能包含冒號,逗號,連線線)
		if(isNumeric(nameCode)) {
			nameCode = "_" + nameCode;
		} 
		Name name = null;
		name = workbook.createName();
		name.setNameName(nameCode);
		name.setRefersToFormula(EXCEL_HIDE_SHEET_NAME + "!"
				+ creatExcelNameList(order, size, cascadeFlag));
	}
	/**
	 * 驗證字串是否以數字開頭
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		Pattern pattern = Pattern.compile("[0-9]*");
		Matcher isNum = pattern.matcher(str.charAt(0)+"");
		if (!isNum.matches()) {
			return false;
		}
			return true;
		}

	/**
	 * 名稱資料行列計算表示式
	 * @param order
	 * @param size
	 * @param cascadeFlag
	 *            是否聯動
	 * @return
	 */
	public 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;
			}
		}
	}

	/**
	 * 使用已定義的資料來源方式設定一個數據驗證
	 * @param formulaString
	 * @param naturalRowIndex
	 * @param naturalColumnIndex
	 * @return
	 */
	public static DataValidation getDataValidationByFormula(
			String formulaString, int firstRow, int lastRow,int firstCol,int lastCol) {
		// 載入下拉列表內容
		DVConstraint constraint = DVConstraint
				.createFormulaListConstraint(formulaString);
		// 設定資料有效性載入在哪個單元格上。
		// 四個引數分別是:起始行、終止行、起始列、終止列
		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;
	}
	
	/**
	 * 使用已定義的資料來源方式設定一個數據驗證
	 * @param formulaString
	 * @param naturalRowIndex
	 * @param naturalColumnIndex
	 * @return
	 */
	public 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("選擇錯誤提示", "你輸入的值未在備選列表中,請下拉選擇合適的值!");
//		data_validation_list.setSuppressDropDownArrow(true);  
//		data_validation_list.setShowErrorBox(true);  
		return data_validation_list;
	}

	/**
	 * 日期有效期驗證
	 * @param naturalRowIndex
	 * @param naturalColumnIndex
	 * @return
	 */
	public static DataValidation getDataValidationByDate(int naturalRowIndex,
			int naturalColumnIndex) {
		// 載入下拉列表內容
		DVConstraint constraint = DVConstraint.createDateConstraint(
				DVConstraint.OperatorType.BETWEEN, "1900-01-01", "5000-01-01",
				"yyyy-mm-dd");
		// 設定資料有效性載入在哪個單元格上。
		// 四個引數分別是:起始行、終止行、起始列、終止列
		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("日期格式提示",
				"請按照'yyyy-mm-dd'格式輸入日期值!");
		// 設定輸入錯誤提示資訊
		data_validation_list.createErrorBox("日期格式錯誤提示",
				"你輸入的日期格式不符合'yyyy-mm-dd'格式規範,請重新輸入!");
		return data_validation_list;
	}

}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import com.hikvision.cms.rmp.moudules.store.user.account.dto.AccountImport;


/**
 * 讀取包含下拉框的Excel的工具類
 */
public class POIExcelReaderUtil {
	
	
	/**
     * 讀取Excel資料內容
     * @param InputStream
     * @return Map 包含單元格資料內容的Map物件
     */
    public static Map<Integer, String> readExcelContent(InputStream is) {
        Map<Integer, String> content = new HashMap<Integer, String>();
        String str = "";
        HSSFWorkbook wb = null;
        try {
            wb = new HSSFWorkbook(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Sheet sheet = wb.getSheetAt(0);
        Cell cell = sheet.getRow(0).getCell(3);
        // 得到總行數
        int rowNum = sheet.getLastRowNum();
//        System.out.println("rowNum:" + rowNum);
       
        Row row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
//        System.out.println("colNum:" + colNum);
        // 正文內容應該從第二行開始,第一行為表頭的標題
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            if(row == null) {
            	content.put(i, str);
            	continue;
            }
            int j = 0;
            while (j < colNum) {
                // 每個單元格的資料內容用"-"分割開,以後需要時用String類的replace()方法還原資料
                // 也可以將每個單元格的資料設定到一個javabean的屬性中,此時需要新建一個javabean
                // str += getStringCellValue(row.getCell((short) j)).trim() +
                // "-";
            	if(((row.getCell((short) j)) == null) || ("".equals(row.getCell((short) j)))){
            		str += "";
            		if(j == 0) {
            			break;
            		}
            	} else {
            		str += getCellFormatValue(row.getCell((short) j)).trim() + "-";
            	}
                j++;
            }
            content.put(i, str);
            str = "";
        }
        return content;
    }
    
    
    
    /**
     * 根據HSSFCell型別設定資料
     * @param cell
     * @return
     */
    private static String getCellFormatValue(Cell cell) {
        String cellvalue = "";
        if (cell != null) {
            // 判斷當前Cell的Type
            switch (cell.getCellType()) {
            // 如果當前Cell的Type為NUMERIC
            case HSSFCell.CELL_TYPE_NUMERIC:
            case HSSFCell.CELL_TYPE_FORMULA: {
                // 判斷當前的cell是否為Date
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date型別則,轉化為Data格式
                    
                    //方法1:這樣子的data格式是帶時分秒的:2011-10-12 0:00:00
                    //cellvalue = cell.getDateCellValue().toLocaleString();
                    
                    //方法2:這樣子的data格式是不帶帶時分秒的:2011-10-12
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    cellvalue = sdf.format(date);
                    
                }
                // 如果是純數字
                else {
                    // 取得當前Cell的數值
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            }
            // 如果當前Cell的Type為STRIN
            case HSSFCell.CELL_TYPE_STRING:
                // 取得當前的Cell字串
                cellvalue = cell.getRichStringCellValue().getString();
                break;
            // 預設的Cell值
            default:
                cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;

    }
    
    
    public static void main(String[] args) throws FileNotFoundException {
//    	  InputStream is2 = new FileInputStream("f:\\使用者資訊匯入模板2016-12-21 17_34_01.xls");
//    	  List<AccountImport> list = AccountImport.transferToEntity(is2);
//    	  for(AccountImport ai : list) {
//    		  System.out.println(ai.getAccount());
//    	  }

	}


}


相關推薦

整理POI解析資料生成模板例子

import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.poi.hssf

Spring 使用POI匯出Excel並生成選項

在開發中我們經常會用到生成excel,下面是spring專案前後端分離匯出excel工具類,介面中直接引用即可。首先引入poi-jar包: <dependency> <groupId>org.apache.poi</groupId&

生成的幾種方法總結——數據來源:枚舉

ati state 數據集 equal type() tty each 其中 sele 上節介紹數據來源是數據庫,這節介紹對枚舉進行數據獲取,形成下拉列表。 使用場景:某些狀態值獲取等,一般是數據量小,不需要在數據庫中進行維護的數據集 1、前提要有枚舉數據

freemaker中下(動態靜態)的塞值,回顯

靜態下拉,靜態的情況下把所有靜態的可能都列出來,判斷返回的值是否等於option中的值,如果相等就顯示那行,??是判斷不為空: <label class="control-label">所在端:</label>

easy ui獲取DataGrid表格的資料填充到easyui-combobox

前端程式碼:js程式碼:將獲取到的資料放到parameters陣列中,該陣列存的是一個個物件,物件裡有id、name兩個欄位,頁面顯示的是name,實際存入資料庫的是id,為什麼要放到onload的方法,親測如果不放在onload方法,那頁面還沒渲染結束就已經去捕獲資料,那將

Java使用POI操作Excel並建立

java建立 package poiexcel;   import java.io.FileOutputStream;   import java.util.Date;   import org

POI匯出帶級聯的excel

效果: 所需jar包: poi-3.8-20120326.jar demo: import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOExceptio

通過ajax返回的json資料,給預設選中顯示(給賦的選中值)

//編輯資料渲染 $("#zh_update").click(function(){ if(checknum==1){ $(".zh_update").show(); //獲取當前選中的引數

java操作poi生成excel.xlsx(設定)下載本地前端下載

需求:匯入excel表格,如果excel有錯誤,將錯誤的地方標紅,在把資料以excel的形式寫出,供使用者下載 解決方案:1.以實體類的方式接收excel並解析(建立兩個集合一個接收正常的資料一個接收錯誤的資料) 2.錯誤集合無論正確錯誤資料都要儲存,並記錄是否有誤(錯誤資料

關於alertdialog popupwindow listview,資料消失問題

1 流程: 點選按鈕- 彈出懸浮框- 點選懸浮框的選擇按鈕-  下拉lsitview - 點選選擇item。 問題:  popupwindow 中的listview 高度  高出 alertdialog 時候,資料消失。   現解決方式: 將alertdilog 的高

關於單選、複選資料回顯問題以及全選全不選

在列表顯示的介面中通常都有編輯操作,進行編輯操作時通常就牽涉到資料的回顯問題,本文中編輯介面和新增介面是在同一個介面。 頁面中使用了jstl中的c標籤,所以要先引用: <%@ taglib prefix="c" uri="http://java.sun.com/js

Axure學習筆記整理1-設定、列表元件文字內容

我一直認為Axure的使用是做產品經理必備的基礎技能之一,所以從一開始轉行做產品經理就在熟悉和試圖挖掘更多的Axure使用技巧。 本篇以及後面幾篇文章都希望較簡單的方式完成簡單的互動設計。事先說明一下,我不是專門做互動設計的,只是因為平時工作中個人覺得可以少量使用互動讓原型圖設計更為流暢。最近打

java指令碼實現文字資料交換

{                                   if(va.value==<%=a%>)                                      str=' <input name="cnum" type="text" id="cnum" value

bootstrap-select模糊搜尋動態繫結資料

前言 今天做專案的時候,需要對下拉框做一個模糊搜尋,就想到了bootstrap-select外掛, 在運用中遇到的問題進行總結下。 引入 引入bootstrap和bootstrap-select檔案 <link rel="stylesheet

省市區三級聯動select資料回顯 Demo js指令碼實現帶指令碼與案例,整理好了的下載既可用

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

ajax請求後臺得到json資料後動態生成樹形

<select id="cc" class="easyui-combotree" style="width:580px;" name="rempId"  data-options="required:true"></select> <scri

jsp頁面年份生成當前年的前n年後n年

因為要用到Calendar方法,首先要匯入Calendar類所在的包。<%@ page import="java.util.Calendar"%><select name='year'><option></option><

只顯示最初中的值json返回array的交集

sel .text json down emp tno append length drop 首先我們可以遍歷dropdown var array = new Array(); $("#select option").each(function(j){ array[j]=

jquery select easy-ui combox 選定指定項區別

strong value data har eas mit arp 下拉框 表單 jquey select <select id="gender" name="sex11" >//不能加easy-ui標記 <option value="

vue.js實現單選、復選

new type 方式 避免 -- js實現 處理 scrip 按鈕 Vue.js可以很方便的實現數據雙向綁定,所以在處理表單,人機交互方面具有很大的優勢。下邊以單選框、復選框和下拉框為例介紹他們在HTML和Vue.js中的具體實現方式。 一、單選框 在傳統的HTML