此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台
一. jar包介绍
1. commons-collections-3.2.jar
2. commons-digester-2.1.jar
3. commons-jexl-2.1.1.jar
4. jxls-core-1.0.jar
5. poi-3.8-20120326.jar
6. poi-ooxml-3.8-20120326.jar
二. 相关文件介绍
1. TestController.java
package com.ims.web.controller; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import net.sf.jxls.transformer.XLSTransformer; import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
@RequestMapping("test")
public class TestController extends BaseController{ @RequestMapping("view")
public ModelAndView test(){
ModelAndView view = new ModelAndView("test.jsp");
return view;
} @RequestMapping("export!excel")
public void export(){
String templateFileName = "runRecord.xls";
String webrootPath = System.getProperty("webapp.root");
String templateFilePath = webrootPath + "view\\iot\\";
String destFileName= "设备运行记录卡.xls"; Map<String, Object> beans = new HashMap<String, Object>(); // 设备信息
Map<String, Object> product = new HashMap<String, Object>();
product.put("model", "XG2016");
product.put("version", "V1.0");
beans.put("product", product); // 年、月、日
beans.put("year", "2016");
beans.put("month", "08");
beans.put("day", "08"); // 运行记录
Map<String, Object> record = new HashMap<String, Object>();
record.put("inputVoltage", "200");
record.put("inputVoltageStatus", 0);
record.put("inputCurrent", "50");
record.put("inputCurrentStatus", 0);
beans.put("record", record); // 异常处理
List<Map<String, Object>> exceptions = new ArrayList<Map<String, Object>>();
Map<String, Object> e1 = new HashMap<String, Object>();
e1.put("detail", "输入电压过大");
e1.put("handle", "降低输入电压");
e1.put("handleMode", 1);
exceptions.add(e1); Map<String, Object> e2 = new HashMap<String, Object>();
e2.put("detail", "输入电流过大");
e2.put("handle", "降低输入电流");
e2.put("handleMode", 1);
exceptions.add(e2); beans.put("exceptions", exceptions); InputStream in = null;
OutputStream out = null; try {
XLSTransformer transformer = new XLSTransformer();
in = new BufferedInputStream(new FileInputStream(templateFilePath+templateFileName));
Workbook workbook=transformer.transformXLS(in, beans);
HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0); int startMergeLine = 7; // 开始合并的行数
// 合并异常处理清单单元格
if(exceptions.size()>0){
sheet.addMergedRegion(new CellRangeAddress(startMergeLine, startMergeLine+exceptions.size()-1, 0, 0));
} //将内容写入输出流并把缓存的内容全部发出去
// out = new FileOutputStream(templateFilePath+destFileName);
request.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download;charset=GBK");
response.setHeader("Content-Disposition", "attachment;filename="+new String(destFileName.getBytes("GBK"),"ISO8859_1")); out=response.getOutputStream();
workbook.write(out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally{
try{
if(out!=null)
out.close();
if(in!=null)
in.close();
}catch(Exception e){
e.printStackTrace();
}
}
} }
2. excelModelExport.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试</title>
<%@ include file="/common/basePath.jsp"%>
</head>
<body>
~~~~~~~~~~~~~~~~~~~~~~excel模板导出~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<br><br>
<button type="button" onclick="exportExl();">导出</button> <script type="text/javascript" src="content/js/jquery/jquery-1.8.1.min.js"></script>
<script type="text/javascript" src="content/js/core/utils.js"></script>
<script type="text/javascript" src="content/js/core/common.js"></script>
<script type="text/javascript">
function exportExl(){
var exporter = com.exporter();
exporter.params.action = rootPath+"/test/export!excel.do";
exporter.download('xls');
}
</script>
</body>
</html>
3. utils.js
/**
* 模块名:共通脚本
* 程序名: 通用工具函数
**/ var utils = {}; /**
* 格式化字符串
* 用法:
.formatString("{0}-{1}","a","b");
*/
utils.formatString = function () {
for (var i = 1; i < arguments.length; i++) {
var exp = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
arguments[0] = arguments[0].replace(exp, arguments[i]);
}
return arguments[0];
};
4. common.js
/// <reference path="utils.js" /> /**
* 模块名:共通脚本
* 程序名: 通用方法common.js
**/
var com = {}; com.exporter = function (opt) {
var self = this; var defaultOptions = {
action: "",
dataAction: "",
dataParams: {},
titles: [[]],
fileType: 'xls',
compressType: 'none'
}; this.paging = function (page,rows) {
self.params.dataParams.page = page;
self.params.dataParams.rows = rows;
return self;
}; this.compress = function () {
self.params.compressType = 'zip';
return self;
}; this.title = function (filed,title) {
self.params.titles[filed] = title;
return self;
}; this.download = function (suffix) {
self.params.fileType = suffix || "xls";
self.params.dataParams = JSON.stringify(self.params.dataParams);
self.params.titles = JSON.stringify(self.params.titles); //创建iframe
var downloadHelper = $('<iframe style="display:none;" id="downloadHelper"></iframe>').appendTo('body')[0];
var doc = downloadHelper.contentWindow.document;
if (doc) {
doc.open();
doc.write('')//微软为doc.clear();
doc.writeln(utils.formatString("<html><body><form id='downloadForm' name='downloadForm' method='post' action='{0}'>", self.params.action));
for (var key in self.params) doc.writeln(utils.formatString("<input type='hidden' name='{0}' value='{1}'>", key, self.params[key]));
doc.writeln('<\/form><\/body><\/html>');
doc.close();
var form = doc.forms[0];
if (form) {
form.submit();
}
}
}; initFromGrid = function (grid) {
var options = grid.$element().datagrid('options');
if (grid.treegrid)
options.url = options.url || grid.treegrid('options').url; var titles = [[]], length = Math.max(options.frozenColumns.length, options.columns.length);
for (var i = 0; i < length; i++)
titles[i] = (options.frozenColumns[i] || []).concat(options.columns[i] || []) self.params = $.extend(true, {}, defaultOptions, {
dataAction: options.url,
dataParams: options.queryParams,
titles: titles
});
}; if (opt && opt.$element)
initFromGrid(opt);
else
self.params = $.extend(true, {}, defaultOptions, opt); return self;
};
5. excel模板可参考: jxls实现动态图表
三. 运行测试
访问:http://localhost:8080/ims/test/excelModelExport.do,点击 导出 按钮,就有"设备运行记录卡.xls"导出到浏览器