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

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. MapReduce Map数 reduce数设置

    JobConf.setNumMapTasks(n)是有意义的,结合block size会具体影响到map任务的个数,详见FileInputFormat.getSplits源码.假设没有设置mapred ...

  2. 11.11luffycity(5)

    2018-11-11 17:52:46 昨天和今天把两个接口写完啦! 今天双十一,感觉没啥感觉!!!买了个耳机,原价24, -5-7.  最后12买了 由于这个今天没源码,所以贴上笔记, 越努力,越幸 ...

  3. Nestjs 使用mongodb

    Docs: https://docs.nestjs.com/techniques/mongodb yarn add @nestjs/mongoose mongoose 链接 // sec/app.mo ...

  4. Thinkphp路由配置和静态缓存规则【原创】

    ThinkPHP框架对URL有一定的规范,所以如果你希望定制你的URL格式的话,就需要好好了解下内置的路由功能了,它能让你的URL变得更简洁和有文化. 首先我们在Common/config.php设置 ...

  5. 限时免费 | 12月6日,广州保利洲际酒店,ABC Summit 2018云智峰会来了!

    随着科技的迅猛发展,人工智能技术也逐渐取得了各个突破.自20世纪70年代以来,作为计算机学科的一个分支,人工智能就被列为世界三大尖端技术之一.近年来,阿尔法狗战胜世界第一柯洁,使人工智能再度迎来新的热 ...

  6. Win7升Windows10有获取通知,但是就不推送的解决方法

    1. 删除“C:\Windows\SoftwareDistribution\Download”下所有文件2. 以管理员身份运行命令提示符,输入“wuauclt.exe /updatenow”并回车(注 ...

  7. 计算机组成原理——主存与cache的映射关系

    全相联映像: 特点:指主存的一个字块能够映像到整个Cache的不论什么一个字块中.这样的映射方法比較灵活,cache的利用率高.但地址转换速度慢,且须要採用某种置换算法将cache中的内容调入调出,实 ...

  8. WIN7搭建ASP站点

    在WIN7配置IIS用于搭建ASP站点(非ASP.NET) ,仅安装.配置必要文件. 1.安装IIS管理工具,用于支持静态页面. 2.添加匿名访问权限. 搭建站点指定到特定文件夹,浏览静态页面会报如下 ...

  9. 016-并发编程-java.util.concurrent.locks之-Lock及ReentrantLock

    一.概述 重入锁ReentrantLock,就是支持重进入的锁 ,它表示该锁能够支持一个线程对资源的重复加锁.支持公平性与非公平性选择,默认为非公平. 以下梳理ReentrantLock.作为依赖于A ...

  10. webstorm 配置 开发微信小程序

    默认情况下,webstorm是不支持wxml和wxss的文件类型,不会有语法高亮 设置高亮 除了高亮,还需要代码提示, 所幸已经有前辈整理了小程序的代码片段,只需要导入其安装包即可使用,包文件路径如下 ...