【SSH實戰】IntelliJ IDEA環境開發BOS物流項目(六)POI技術Excel文件導出

、分區組合條件分頁查詢

n 分區分頁查詢(沒有過濾條件)

頁面:WEB-INF/pages/base/subarea.jsp

第一步:修改jsp頁面中datagridURL地址


第二步:在SuareaAction中提供分頁查詢方法pageQuery

public String pageQuery(){
        subareaService.pageQuery(pageBean);
        this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","decidedzone","subareas"});
        return NONE;
    }

第三步:修改subarea.hbm.xml


n 分區分頁查詢(帶有過濾條件)

第一步:提供一個工具方法,可以將指定的form表單中所有的輸入項轉爲json數據,用於參數提交

            // 定義一個工具方法,用於將指定的form表單中所有的輸入項轉爲json數據
            $.fn.serializeJson=function(){
                var serializeObj={};
                var array=this.serializeArray();
                $(array).each(function(){
                    if(serializeObj[this.name]){
                        if($.isArray(serializeObj[this.name])){
                            serializeObj[this.name].push(this.value);
                        }else{
                            serializeObj[this.name]=[serializeObj[this.name],this.value];
                        }
                    }else{
                        serializeObj[this.name]=this.value;
                    }
                });
                return serializeObj;
            };

第二步:爲查詢窗口中查詢按鈕綁定事件

$("#btn").click(function(){
                // 將指定的form表單中所有的輸入項轉爲json數據
				var p = $("#searchForm").serializeJson();
                // 調用數據表格的load方法,重新發一次ajax請求,並且提交參數
				$("#grid").datagrid("load",p);
				// 關閉查詢窗口
				$("#searchWindow").window("close");
            });

第三步:修改Action中分頁查詢方法

   /**
     * 分頁查詢
     * @return
     */
    public String pageQuery(){
        DetachedCriteria dc = pageBean.getDetachedCriteria();
        // 動態添加過濾條件
        String addresskey = model.getAddresskey();
        if(StringUtils.isNotBlank(addresskey)){
            // 添加過濾條件,根據地址關鍵字模糊查詢
            dc.add(Restrictions.like("addresskey","%"+addresskey+"%"));
        }
        Region region = model.getRegion();
        if(region != null){
            String province = region.getProvince();
            String city = region.getCity();
            String district = region.getDistrict();
            // 參數一:分區對象中管關聯的區域對象屬性名稱
            // 參數二:別名,可以任意
            dc.createAlias("region","r");
            if(StringUtils.isNotBlank(province)){
                // 添加過濾條件,根據省份模糊查詢--多表關聯查詢,使用別名方式實現
                dc.add(Restrictions.like("r.province","%"+province+"%"));
            }
            if(StringUtils.isNotBlank(city)){
                // 添加過濾條件,根據市模糊查詢--多表關聯查詢,使用別名方式實現
                dc.add(Restrictions.like("r.city","%"+city+"%"));
            }
            if(StringUtils.isNotBlank(district)){
                // 添加過濾條件,根據區模糊查詢--多表關聯查詢,使用別名方式實現
                dc.add(Restrictions.like("r.district","%"+district+"%"));
            }
        }
        subareaService.pageQuery(pageBean);
        this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","decidedzone","subareas"});
        return NONE;
    }

第四步:修改BaseDao中的分頁查詢方法


、分區數據導出

n 頁面調整

		// 導出按鈕對應的處理函數
        function doExport(){
            // 發送請求,請求Action,進行文件下載
			window.location.href = "subareaAction_exportXLs.action";
        }

使用POI將數據寫到Excel文件

n 通過輸出流進行文件下載

    /**
     * 分區數據導出功能
     * @return
     */
    public String exportXLs() throws IOException {
        // 第一步:查詢所有的分區數據
        List<Subarea> list = subareaService.findAll();
        // 第二步:使用POI將數據寫到Excel文件中
        // 在內存中創建一個Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 創建一個標籤頁
        HSSFSheet sheet = workbook.createSheet("分區數據");
        // 創建標題行
        HSSFRow headRow = sheet.createRow(0);
        headRow.createCell(0).setCellValue("分區編號");
        headRow.createCell(1).setCellValue("開始編號");
        headRow.createCell(2).setCellValue("結束編號");
        headRow.createCell(3).setCellValue("位置信息");
        headRow.createCell(4).setCellValue("省市區");

        for(Subarea subarea:list){
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(subarea.getId());
            dataRow.createCell(1).setCellValue(subarea.getStartnum());
            dataRow.createCell(2).setCellValue(subarea.getEndnum());
            dataRow.createCell(3).setCellValue(subarea.getPosition());
            dataRow.createCell(4).setCellValue(subarea.getRegion().getName());
        }

        // 第三步:使用輸出流進行文件下載(一個流、兩個頭)
        String filename = "分區數據.xls";
        String contentType = ServletActionContext.getServletContext().getMimeType(filename);
        ServletOutputStream out = ServletActionContext.getResponse().getOutputStream();
        ServletActionContext.getResponse().setContentType(contentType);

        // 獲取客戶端瀏覽器類型
        String agent = ServletActionContext.getRequest().getHeader("User-Agent");
        filename = FileUtils.encodeDownloadFilename(filename, agent);
        ServletActionContext.getResponse().setHeader("content-disposition","attachment;filename="+filename);
        workbook.write(out);
        return NONE;
    }

、定區添加

n 定區概念

n 定區添加頁面調整

第一步:修改定區頁面中combobox下拉框URL地址


n 服務端實現

第二步:在StaffAction中提供listajax方法,查詢所有未刪除的取派員,返回json

    /**
     * 查詢所有未刪除的取派員,返回json
     * @return
     */
    public String listAjax(){
        List<Staff> list = staffService.findListNotDelete();
        this.java2Json(list,new String[]{"decidedzones"});
        return NONE;
    }

第三步:在BaseDao中擴展一個通用查詢方法

	@Override
	public List<T> findByCriteria(DetachedCriteria detachedCriteria) {
		return (List<T>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
	}

第四步:在StaffService中擴展方法,查詢未刪除的取派員

    public List<Staff> findListNotDelete() {
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);
        // 添加過濾條件
        detachedCriteria.add(Restrictions.eq("deltag","0"));
        //detachedCriteria.add(Restrictions.ne("dettag","1")); // 同上面等價
        return staffDao.findByCriteria(detachedCriteria);
    }

四、使用combobox展示取派員數據

n 頁面調整

第一步:修改頁面中datagridURL地址


n 服務端實現

第二步:在SubareaAction中提供listajax方法,查詢所有未關聯到定區的分區,返回json

    /**
     * 查詢所有未關聯到定區的分區,返回json
     * @return
     */
    public String listAjax(){
        List<Subarea> list = subareaService.findListNotAssociation();
        this.java2Json(list,new String[]{"decidedzone","region"});
        return NONE;
    }

第三步:在SubareaService中擴展方法,查詢未關聯到定區的分區

    /**
     * 查詢所有未關聯到定區的分區
     * @return
     */
    public List<Subarea> findListNotAssociation() {
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);
        // 添加過濾條件,分區對象中decidedzone屬性爲null
        detachedCriteria.add(Restrictions.isNull("decidedzone"));
        return subareaDao.findByCriteria(detachedCriteria);
    }

五、保存定區

第一步:爲保存按鈕綁定事件提交表單


問題一:提交的表單存在多個id


解決方案:將datagrid的filed由id改爲subareaid


問題二:

提交的表單中subareaid參數的值爲null

解決方案:在分區類中提供getSubareaid方法

第二步:服務端實現

創建定區的Action、Service、Dao

/**
 * 定區管理
 * @author lee [email protected]
 * @create 2018-04-21 15:12
 **/
@Controller
@Scope
public class DecidedzoneAction extends BaseAction<Decidedzone>{

    @Autowired
    private DecidedzoneService decidedzoneService;
    // 屬性驅動,接收多個分區id
    private String[] subareaid;

    public String[] getSubareaid() {
        return subareaid;
    }

    public void setSubareaid(String[] subareaid) {
        this.subareaid = subareaid;
    }

    /**
     * 添加定區
     * @return
     */
    public String add(){
        decidedzoneService.save(model,subareaid);
        return LIST;
    }

Service代碼

@Service
@Transactional
public class DecidedzoneServiceImpl implements DecidedzoneService{
    @Autowired
    private DecidedzoneDao decidedzoneDao;
    @Autowired
    private SubareaDao subareaDao;

    /**
     * 添加一個定區,同時關聯分區
     * @param model
     * @param subareaid
     */
    public void save(Decidedzone model, String[] subareaid) {
        decidedzoneDao.save(model);
        for(String id : subareaid){
            Subarea subarea = subareaDao.findById(id);
            subarea.setDecidedzone(model);
        }
    }

配置struts.xml

		<!--定區管理-->
		<action name="decidedzoneAction_*" class="decidedzoneAction"  method="{1}">
			<result name="list">/WEB-INF/pages/base/decidedzone.jsp</result>
		</action>

六、定區分頁查詢

第一步:修改定區jsp頁面中datagrid的URL地址


第二步:在定區Action中提供pageQuery方法

    /**
     * 分頁查詢定區
     * @return
     * @throws IOException
     */
    public String pageQuery() throws IOException {
        // 調用service分頁查詢
        decidedzoneService.pageQuery(pageBean);
        // 轉json並響應到頁面
        this.java2Json(pageBean,new String[]{"currentPage","detachedCriteria","pageSize","subareas","decidedzones"});
        return NONE;
    }

第三步:在Decidedzone.hbm.xml中修改,查詢定區對象時需要立即加載關聯的取派員對象


七、分頁問題總結

1、頁面不需要展示關聯數據時

解決:將關聯對象屬性排除掉


2、頁面需要展示關聯數據時
解決:將關聯對象改爲立即加載,並且將關聯對象中的屬性排除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章