此次目的是将已有的数据表格以excel格式导出到本地
运用的技术(前端:easyui+jQuery ; 后台s2sh)
//前台代码(这里用的toolbar工具条)
{
id : 'button-export',
text : '导出',
iconCls : 'icon-undo',
//点击事件
handler : doExport
}
//写点击事件的函数
//导出所有区域(同步请求)
function doExport(){ location.href="../../area_exportData.action";
}
后台代码:
AreaAction
//导出所有区域的数据
@Action("area_exportData")
public String exportData() throws Exception{
/**
* 两大步:
* 第一步:从数据库查询数据,写成excel
* 使用poi技术写excel
* 编程技巧,现实中怎么写,这里就怎么写
* 创建一个空的工作簿
* 97格式
*/
//创建空的工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//在工作薄中创建新的工作表(迭代器,空)
HSSFSheet sheet = workbook.createSheet();
//在工作表中写行(行中有格)
//先写行头信息(第一行是头)
HSSFRow headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("区域编号");
headerRow.createCell(1).setCellValue("省份");
headerRow.createCell(2).setCellValue("城市");
headerRow.createCell(3).setCellValue("区域");
headerRow.createCell(4).setCellValue("邮编");
//查询数据列表
List<Area> areaList = areaService.findAreaList();
if(areaList != null && !areaList.isEmpty()){
//写内容
for (Area area : areaList) {
//创建一行:在有内容的行的下一行
HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
//创建一格一格,写入数据
dataRow.createCell(0).setCellValue(area.getId());
dataRow.createCell(1).setCellValue(area.getProvince());
dataRow.createCell(2).setCellValue(area.getCity());
dataRow.createCell(3).setCellValue(area.getDistrict());
dataRow.createCell(4).setCellValue(area.getPostcode());
//值最好都是字符串(String),不是的话手动转换
}
}
//第二步:设置下载两个的参数,将Excel写入响应即可
//响应对象
HttpServletResponse response = ServletActionContext.getResponse();
//设置客户端浏览器用于识别附件的两个参数Content-Type和Content-DisPosition
//文件名随便写
String downFileName = "区域数据.xls";
//获取文件的MIME类型
String contentType = ServletActionContext.getServletContext().getMimeType(downFileName);
//将MIME类型放入响应
response.setContentType(contentType);
//浏览器类型
String agent = ServletActionContext.getRequest().getHeader("user-agent");
//附件名编码,解决中文乱码问题(这里自己写的工具类)
downFileName = FileUtils.encodeDownloadFilename(downFileName, agent);
//获取附件的名字和下载方式
String contentDisposition="attachment;filename="+downFileName;
//将附件名字和下载方式放入响应头信息中
response.setHeader("Content-Disposition", contentDisposition);
//将excel文件流写入响应
workbook.write(response.getOutputStream());
return NONE;//响应为空格
}
其中FileUtils工具类是自己写的这里贴出来
package cn.itcast.utils;
import java.io.IOException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;
@SuppressWarnings("all")
public class FileUtils {
/**
* 下载文件时,针对不同浏览器,进行附件名的编码
*
* @param filename
* 下载文件名
* @param agent
* 客户端浏览器
* @return 编码后的下载附件名
* @throws IOException
*/
public static String encodeDownloadFilename(String filename, String agent)
throws IOException {
if (agent.contains("Firefox")) { // 火狐浏览器
filename = "=?UTF-8?B?"
+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
+ "?=";
filename = filename.replaceAll("\r\n", "");
} else { // IE及其他浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+"," ");
}
return filename;
}
}
service层接口
AreaService
/**
* 说明:查询所有区域列表
*/
List<Area> findAreaList();
service层实现类代码
AreaServiceImpl
@Override
public List<Area> findAreaList() {
return areaRepository.findAll();
}
DAO层代码(AreaRepository extends JpaRepository
@Override
public List<Area> findAreaList() {
return areaRepository.findAll();
}
如果要提供一个数据模板给客户填的时候,其实只要将表头查出来即可,下载下来自己填数据,然后数据写好后再通过一键上传将数据上传上去;
这里需要注意的是,一键上传的话,数据表格的版本和excel数据内容要是文本格式(在excel里选中数据单击右键设置单元格属性,数字这一列选择文本然后保存再上传)