话不多说,看效果图,直接上代码。

sheet  商户表

hideSheet ,功能完成后隐藏的Sheet,用于储存下拉框中的信息,(以一定的规则将所需数据存储在表格中)。

下面是代码

部分数据需要在导出时使用,如通过省名去找它的编码,这时就没有必要再去数据库查询,把此数据储存成全局参数,使用时只需要简单的判断即可。

四大直辖市在这里被忽略,如有需要根据实际情况去处理。

数组可使用动态数组。

 @RequestMapping(params = "action=toExcel")
public void toExcel(HttpServletRequest request,HttpServletResponse response) {
try {
String name = "商户表"; String valStr = "attachment;filename="
+ new String(name.getBytes("gb2312"), "ISO8859-1") + ".xls";
OutputStream os = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
// 设定输出文件头
response.setHeader("Content-Disposition", valStr);
response.setContentType("application/msexcel");// 定义输出类型
Workbook workbook = new HSSFWorkbook(); String[] fieldLabelArray = { "商户简称", "商户全称", "商户类型", "父级商户", "省",
"市", "县", "电话", "联系人", "邮箱", "邮编", "地址", "经度",
"纬度" }; //得到省名称
Map<String,String> params = new HashMap<String,String>();
//所有的省
if(faMerchantList.size()==0){
faMerchantList = service.findList("UU_BANK_MERCHANT.queryName", paramData);
}
if(merchantList.size()==0){
merchantList = bankMerchantTypeService.findList("UU_BANK_MERCHANTTYPE.query", paramData);
}
if(proviceLists.size()==0){
proviceLists = serviceOut.findList("UU_BANK_BANKOUTLET.selectProvices", paramData);
}
String[] provinceArr=new String[proviceLists.size()];
//将有子区域的父区域放到一个数组中
ArrayList areaFatherNameArr=new ArrayList();
Map<String,String[]> areaMap =new HashMap<String, String[]>();
int index=0;
int cityIndex=0;
for(Object object:proviceLists){
Map entry=(Map) object;
provinceArr[index]=(String) entry.get("NAME");
String provinceCode = (String) entry.get("CITYCODE");
areaFatherNameArr.add(cityIndex,(String) entry.get("NAME"));
cityIndex+=1;
if(!provinceCode.isEmpty()){
String city_Code = provinceCode.substring( 0, 2);
params.put("CITY_CODE", city_Code);
params.put("CITYCODE", provinceCode);
}
List cityLists = serviceOut.findList("UU_BANK_BANKOUTLET.selectCitys", params);
String[] areaArr= new String[cityLists.size()];
int indexs=0;
for(Object city:cityLists){
Map entryCity=(Map) city;
areaFatherNameArr.add(cityIndex, (String) entryCity.get("NAME"));
areaArr[indexs]=(String) entryCity.get("NAME");
String cityCode = (String) entryCity.get("CITYCODE");
if(!cityCode.isEmpty()){
String city_Code = cityCode.substring( 0, 4);
params.put("CITY_CODE", city_Code);
params.put("CITYCODE", cityCode);
}
List countyLists = serviceOut.findList("UU_BANK_BANKOUTLET.selectCountys", params);
String[] countyArr= new String[countyLists.size()];
int countyindex=0;
for(Object county:countyLists){
Map entryCounty=(Map) county;
countyArr[countyindex]=(String) entryCounty.get("NAME");
countyindex++;
}
areaMap.put((String) entryCity.get("NAME"), countyArr);
indexs++;
cityIndex++;
}
areaMap.put((String) entry.get("NAME"),areaArr);
index++;
};
//查询商户类型
int merchantArrIndex=0;
String[] merchantArr=new String[merchantList.size()];
for (Object merchantType : merchantList) {
Map merchant=(Map) merchantType;
merchantArr[merchantArrIndex]=(String) merchant.get("NAME");
merchantArrIndex++;
}
//查询父级商户
int faMerchantIndex=0;
String[] faMerchantArr=new String[faMerchantList.size()];
for (Object fmerchantI : faMerchantList) {
Map merchantf=(Map) fmerchantI;
faMerchantArr[faMerchantIndex]=(String) merchantf.get("NAME");
faMerchantIndex++;
}
// 创建Sheet
String sheetName = name;
Sheet sheet = workbook.createSheet(name);
//创建sheet1
Sheet hideSheet =workbook.createSheet("area");
//是否隐藏sheet1
workbook.setSheetHidden(workbook.getSheetIndex(hideSheet), true);
//生成数据
int rowId=0;
Row provinceRow = hideSheet.createRow(rowId++);
provinceRow.createCell(0).setCellValue("省列表");
for(int i = 0; i < provinceArr.length; i ++){
Cell provinceCell = provinceRow.createCell(i + 1);
provinceCell.setCellValue(provinceArr[i]);
}
//将具体数据写入每一行中
for(int i = 0;i < areaFatherNameArr.size();i++){
String key = (String) areaFatherNameArr.get(i);
String[] son = areaMap.get(key);
Row row = hideSheet.createRow(rowId++);
row.createCell(0).setCellValue(key);
for(int j = 0; j < son.length; j ++){
Cell cell = row.createCell(j + 1);
cell.setCellValue(son[j]);
} //添加名称管理
String range = getRange(1,rowId,son.length);
Name names =workbook.createName();
names.setNameName(key);
String formula ="area!"+range;
names.setRefersToFormula(formula);
} // 商户类型
DVConstraint typeConstraint = DVConstraint.createExplicitListConstraint(merchantArr);
CellRangeAddressList typeRangeAddressList = new CellRangeAddressList(1, 1000, 2, 2);
DataValidation typeDataValidation = new HSSFDataValidation(typeRangeAddressList, typeConstraint);
typeDataValidation.createErrorBox("error", "请选择正确的商户类型");
sheet.addValidationData(typeDataValidation);
// 父级商户
DVConstraint faConstraint = DVConstraint.createExplicitListConstraint(faMerchantArr);
CellRangeAddressList faRangeAddressList = new CellRangeAddressList(1, 1000, 3, 3);
DataValidation faDataValidation = new HSSFDataValidation(faRangeAddressList, faConstraint);
typeDataValidation.createErrorBox("error", "请选择正确的商户类型");
sheet.addValidationData(faDataValidation); // 省规则
DVConstraint provConstraint = DVConstraint.createExplicitListConstraint(provinceArr);
CellRangeAddressList provRangeAddressList = new CellRangeAddressList(1, 1000, 4, 4);
DataValidation provinceDataValidation = new HSSFDataValidation(provRangeAddressList, provConstraint);
provinceDataValidation.createErrorBox("error", "请选择正确的省份");
sheet.addValidationData(provinceDataValidation); // 市以规则,此处仅作一个示例
// "INDIRECT($A$" + 2 + ")" 表示规则数据会从名称管理器中获取key与单元格 A2 值相同的数据,如果A2是浙江省,那么此处就是
// 浙江省下的区域信息。
DVConstraint formula = DVConstraint.createFormulaListConstraint("INDIRECT($E:$E)");
CellRangeAddressList rangeAddressList = new CellRangeAddressList(1, 1000, 5, 5);
DataValidation cacse = new HSSFDataValidation(rangeAddressList, formula);
cacse.createErrorBox("error", "请选择正确的市");
sheet.addValidationData(cacse); // 区规则
formula = DVConstraint.createFormulaListConstraint("INDIRECT($F:$F)");
rangeAddressList = new CellRangeAddressList(1, 1000, 6, 6);
cacse = new HSSFDataValidation(rangeAddressList, formula);
cacse.createErrorBox("error", "请选择正确的区");
sheet.addValidationData(cacse);
//设置格式
CellStyle cellStyle = workbook.createCellStyle();
       //设置边框:
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
//设置居中:
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
//设置字体:
Font font2 = workbook.createFont();
font2.setFontName("仿宋_GB2312");
font2.setFontHeightInPoints((short) 11);
cellStyle.setFont(font2);//选择需要用到的字体格式
//设置标题行格式
CellStyle cellStyleHeader = workbook.createCellStyle();
//设置背景色
cellStyleHeader.setFillForegroundColor(HSSFColor.LIME.index);
cellStyleHeader.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//设置边框:
cellStyleHeader.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyleHeader.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyleHeader.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyleHeader.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
//设置居中:
cellStyleHeader.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
//设置字体:
Font font = workbook.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 12);
cellStyleHeader.setFont(font);//选择需要用到的字体格式
WritableCell cell;
// 生成表头
Row headerRow = sheet.createRow(0);
for (int i = 0; i < fieldLabelArray.length; i++) {
sheet.setDefaultColumnStyle(i, cellStyle);
sheet.setColumnWidth(i, 4000);
headerRow.createCell(i).setCellValue(fieldLabelArray[i]);
headerRow.getCell(i).setCellStyle(cellStyleHeader);
}
// 输出文件
workbook.write(os);
os.close();
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

添加名称管理方法

private String getRange(int offset, int rowId, int colCount) {
char start =(char) ('A'+offset);
if(colCount<=25){
char end =(char) (start+colCount-1);
return "$"+start+"$"+rowId+":$"+end+"$"+rowId;
}else{
char endPrefix ='A';
char endSuffix ='A';
if((colCount-25)/26==0 || colCount==51){//26-51之间,包括边界(仅两次字母表计算)
if((colCount-25)%26==0){//边界值
endSuffix=(char)('A'+25);
}else{
endSuffix=(char)('A'+(colCount-25)%26-1);
}
}else{//51以上
if((colCount-25)%26==0){
endSuffix=(char)('A'+25);
endPrefix=(char)(endPrefix+(colCount-25)/26-1);
}else{
endSuffix=(char)('A'+(colCount-25)%26-1);
endPrefix=(char)(endPrefix+(colCount-25)/26);
}
}
return "$"+start+"$"+rowId+":$"+endPrefix+endSuffix+"$"+rowId;
}
}

有更好的希望能给给我邮箱发一封,大家共同学习,共同进步,有部分内容网上找的,如有冒犯,请谅解,本人,菜鸟。

导入有时间再整理。

处理一些bug

1.超255错误

     for (Object fmerchantI : faMerchantList) {
Map merchantf=(Map) fmerchantI;
faMerchantArr[faMerchantIndex]=(String) merchantf.get("NAME");
faMerchantIndex++;
}
areaFatherNameArr.add("上级商户");
areaMap.put("上级商户",faMerchantArr);
// 创建Sheet
String sheetName = name;
 //添加名称管理
String range = getRange(,rowId,son.length);
Name names =workbook.createName();
names.setNameName(key);
String formula ="area!"+range;
names.setRefersToFormula(formula);
//避免超过255错误
if("上级商户".equals(key)){
merChantName=formula;
}
  // 父级商户
DVConstraint faConstraint = DVConstraint.createFormulaListConstraint(merChantName);
CellRangeAddressList faRangeAddressList = new CellRangeAddressList(1, 1000, 3, 3);

2.对市和区设置有效性,有时无效的处理,去掉原先的市区有效性,新加如下:

 //对前1000行设置有效性
2 for(int i = 2;i < 1000;i++){
setDataValidation("E" ,sheet,i,6);
setDataValidation("F" ,sheet,i,7);
}
//设置格式
CellStyle cellStyle = workbook.createCellStyle();
 //设置有效性
/* @param offset 主影响单元格所在列,即此单元格由哪个单元格影响联动
* @param sheet
* @param rowNum 行数
* @param colNum 列数
*/
public static void setDataValidation(String offset,HSSFSheet sheet, int rowNum,int colNum) {
HSSFDataValidationHelper dvHelper = new HSSFDataValidationHelper(sheet);
DataValidation data_validation_list;
data_validation_list = getDataValidationByFormula(
"INDIRECT($" + offset +"$"+ (rowNum) + ")", rowNum, colNum,dvHelper);
sheet.addValidationData(data_validation_list);
} /**
* 加载下拉列表内容
* @param formulaString
* @param naturalRowIndex
* @param naturalColumnIndex
* @param dvHelper
* @return
*/
private static DataValidation getDataValidationByFormula(
String formulaString, int naturalRowIndex, int naturalColumnIndex,HSSFDataValidationHelper dvHelper) {
// 加载下拉列表内容
// 举例:若formulaString = "INDIRECT($A$2)" 表示规则数据会从名称管理器中获取key与单元格 A2 值相同的数据,
//如果A2是江苏省,那么此处就是江苏省下的市信息。
DVConstraint formula = 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);
// 数据有效性对象
// 绑定
HSSFDataValidation data_validation_list = (HSSFDataValidation) dvHelper.createValidation(formula, regions);
data_validation_list.createErrorBox("error", "请选择正确的市或区");
return data_validation_list;
}

动态从数据库获取数据,省市县三级联动,有校验,导出Excel模板的更多相关文章

  1. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  2. 记一次 PHP 省市县三级联动 数据库取值

    /** * Notes:省市县三级联动 * Created by depressiom * Date: 2022年4月14日 */ public function getCityData(){ //获 ...

  3. easyui-datagrid通过action从数据库获取数据的关键代码

    实际上是结合struts2来从数据获取json格式的数据.   关键代码: GetUserAction.java代码   package com.log.control; import java.io ...

  4. AngularJs从数据库获取数据并显示

    哈哈,昨天下午和今天早上,花上一些时间,学习AngularJs,仅是粗略预览一下.很好,非常好. 由于手上有开发ASP.NET MVC环境,就在这测试下,去数据库获取数据并显示数据. 数据库表创建,添 ...

  5. Loadrunner脚本优化-参数化之关联MySQL数据库获取数据

    脚本优化-参数化之关联MySQL数据库获取数据 by:授客 QQ:1033553122 测试环境: Loadrunner 11 Win7 64位 实操: 1.   安装MySQL ODBC驱动程序 O ...

  6. Python使用Flask框架,结合Highchart处理csv数据(引申-从文件获取数据--从数据库获取数据)

    参考链接:https://www.highcharts.com.cn/docs/process-text-data-file 1.javascript代码 var options = { chart: ...

  7. 在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效??

    在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效?? 是因为swiper提前初始化了,那时候数据还没有完全出来.这里有两种解决办法 1. 使用vue提供的$nextTic ...

  8. 项目总结01:JSP mysql SpringMvc下中国省市县三级联动下拉框

    JSP mysql SpringMvc下中国省市县三级联动下拉框 关键词 JSP  mysql数据库  SpringMvc  ajax   Controller层  Service层  中国地区  省 ...

  9. android:省市县三级联动(基于json和spring)

    一.请看效果图": 二.程序的代码: 1.MainActivity.java package com.loveplusplus.loader.demo.ui; import org.json ...

随机推荐

  1. Spark Streaming之dataset实例

    Spark Streaming是核心Spark API的扩展,可实现实时数据流的可扩展,高吞吐量,容错流处理. bin/spark-submit --class Streaming /home/wx/ ...

  2. php算法题2

    一群猴子排成一圈,按1,2,…,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大 ...

  3. python中 requests 支持 socks代理

    参考博客 https://zhengheng.me/2016/08/25/python-requests-socks5/

  4. missing python bz2 module

    import bz2 ImportError: No module named bz2 一般是手动编译python时,编译的机器上环境不全面导致的依赖库不完整. 需要安装bzip库,使用如下命令: s ...

  5. 怎么用js实现jq的removeClass方法

    1.addClass:为指定的dom元素添加样式. 2.removeClass:删除指定dom元素的样式. 3.toggleClass:如果存在(不存在),就删除(添加)一个样式. 4.hasClas ...

  6. php 检测url

    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@ ...

  7. Nginx之使用nginx搭建简单的文件服务器

    使用nginx可以搭建简单文件服务器 安装nginx(不详述) 修改配置文件 /usr/local/nginx/conf/nginx.conf user root; /usr/local/nginx/ ...

  8. Web开发——HTML基础(高级文本格式 列表/style)

    文档资料参考: 参考:https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Advanced_text_fo ...

  9. 前端paging分页,前端设置每页多少条和当前页面的索引,传给后端,数据显示出来

    1.首先引入jquery 2.在引入paging.css和paging.js  这2个我存在百度云上: 链接:https://pan.baidu.com/s/1SPxlBkkx-pNAtLuRLifE ...

  10. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...