Struts2 配置
<package name="xxx" namespace="/xxx" extends="json-default">
<result name="excel" type="stream">
<param name="contentType">application/vnd.ms-excel</param>
<param name="inputName">is</param>
<param name="contentDisposition">filename="xxx.xls"</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
这里重点是配置 result,即导出的数据流对象(类型为 stream)。
Action 类
...
InputStream is;
public String export() {
Label label;
WritableWorkbook workbook;
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
workbook = Workbook.createWorkbook(os);
WritableSheet sheet = workbook.createSheet("sheet 名称", 0);
/**
* 获取数据
*/
...
// 创建 Excel 标题行
createTitleRow(sheet);
// 设置列宽
setColumnWidth(sheet);
// 填充数据(Excel)
fillData(sheet, data);
workbook.write();
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
is = new ByteArrayInputStream(os.toByteArray());
return "excel";
}
...
/**
* 填充数据(Excel)
*
* @param sheet
* @param data
* @throws WriteException
*/
private void fillData(WritableSheet sheet, List<Entity> data) throws WriteException {
int row = 1;
for (Entity entity : data) {
int column = 0;
sheet.addCell(new Label(column++, row, valueOf(entity .getXXX
())));
...
row++;
}
}
/**
* 设置列宽(Excel)
*
* @param sheet
*/
private void setColumnWidth(WritableSheet sheet) {
for (int i = 0; i < 6; i++) {
sheet.setColumnView(i, 20);
}
}
/**
* 创建标题行(Excel)
*
* @param sheet
* @throws WriteException
*/
private void createTitleRow(WritableSheet sheet) throws WriteException {
int row = 0;
int index = 0;
sheet.addCell(new Label(index++, row, "标题列"));
...
}
jxl 比 poi 轻量级,而且因为是老项目,你懂的 O(∩_∩)O
HTML
<input type="button" value="导 出"
onclick="export();">
js
function exportLeaveMessage() {
var xxx=encodeURIComponent($("#xxx").val());
...
window.open("<%=request.getContextPath()%>/xxx/xxx?xxx="+xxx);
}
注意:因为查询条件可能包含中文,所以这里必须使用 encodeURIComponent 进行编码。
是不是很简单呀 O(∩_∩)O哈哈~