0
点赞
收藏
分享

微信扫一扫

使用POI让java可以操作Excel(3)


1. 将数据批量导出至Excel(.xls)

  • 前端借助jQuery-EasyUI来实现

在jquery-easyui-1.9.4/themes/icon.css文件尾部添加

.icon-export-excel{
background:url('icons/ExportExcel.png') no-repeat center center;
}

​​图标 ExportExcel.png 在这里​​

前端HTML示例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery EasyUI Demo for Java</title>
<!-- 主题可以通过themes/下的easyui.css进行更换 -->
<link rel="stylesheet" type="text/css" href="jquery-easyui-1.9.4/themes/ui-cupertino/easyui.css">
<link rel="stylesheet" type="text/css" href="jquery-easyui-1.9.4/themes/icon.css">
<link rel="stylesheet" type="text/css" href="jquery-easyui-1.9.4/demo/demo.css">
<script type="text/javascript" src="jquery-easyui-1.9.4/jquery.min.js"></script>
<script type="text/javascript" src="jquery-easyui-1.9.4/jquery.easyui.min.js"></script>
<script type="text/javascript" src="jquery-easyui-1.9.4/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript">var url;

function deleteUser() {
var row = $('#dg').datagrid('getSelected');
if (row) {
$.messager.confirm("系统提示", "您确定要删除这条记录吗?", function(r) {
if (r) {
$.post('userDelete', {
delId: row.id
}, function(result) {
if (result.success) {
$.messager.alert("系统提示", "已成功删除这条记录!");
$("#dg").datagrid("reload"); //刷新前端
} else {
$.messager.alert("系统提示", result.errorMsg);
}
}, 'json');
}
});
}
}

function newUser() {
$("#dlg").dialog('open').dialog('setTitle', '添加用户');
$('#fm').form('clear');
url = 'userSave'; //Ajax发送至后端服务器
}


function editUser() {
var row = $('#dg').datagrid('getSelected');
if (row) {
$("#dlg").dialog('open').dialog('setTitle', '编辑用户');
$('#fm').form('load', row); //加载当前行的数据
url = 'userSave?id=' + row.id; //Ajax发送至后端服务器
}
}


function saveUser() {
$('#fm').form('submit', {
url: url, //Ajax发送至后端服务器对应的url
onSubmit: function() {
return $(this).form('validate');
},
success: function(result) {
var result = eval('(' + result + ')'); //转化为前端JSON
if (result.errorMsg) {
$.messager.alert("系统提示", result.errorMsg);
return;
} else {
$.messager.alert("系统提示", "保存成功");
$('#dlg').dialog('close');
$("#dg").datagrid("reload"); //刷新前端
}
}
});
}

/*
* ajax无法直接接收导出的excel。
* 因为ajax只处理返回的字符流,而后端返回前端的excel是二进制的字节流,ajax无法处理。
* 对于二进制的字节流只能交给浏览器来处理。
*/
function exportUser() {
var searchVal=$('#searchBox').val();
console.log("查找关键字:"+searchVal);

if(searchVal!=""){
//使用window.open()方法,浏览器会“跳窗”,闪一下。
//window.open("exportExcel?searchKey="+searchVal);
window.location.href="exportExcel?searchKey="+searchVal;
}else{
//window.open("exportExcel");
window.location.href="exportExcel";
}
}

function searchUser(){
var searchVal=$('#searchBox').val();
console.log("查找关键字:"+searchVal);
if(searchVal!=''){ //查找框有输入
$('#dg').datagrid({
url:'userList',
queryParams: {
"searchVal":searchVal
}
});
}else{ //没有输入则全量显示
$('#dg').datagrid({
url:'userList',
queryParams: {}
});
}
}</script>
</head>
<body>
<!-- url属性表示要从Web服务器上请求数据,且与后端交互的是JSON串。交互通过Ajax(XHR)来完成。 -->
<!-- 可以将jQuery EasyUI涉及到的组件都放在这个页面上统一调度。 -->
<table id="dg" title="用户管理" class="easyui-datagrid"style="width:1024px;height:450px" url="userList" toolbar="#toolbar"
pagination="true" rownumbers="true" fitColumns="true" singleSelect="true">
<thead>
<tr>
<th field="id" width="50" hidden="true">编号</th>
<th field="name" width="50">姓名</th>
<th field="phone" width="50">电话</th>
<th field="email" width="50">Email</th>
<th field="qq" width="50">QQ</th>
</tr>
</thead>
</table>

<div id="toolbar">
<div>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="newUser()">添加用户</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-edit" plain="true" onclick="editUser()">编辑用户</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-remove" plain="true" onclick="deleteUser()">删除用户</a>
</div>
<div>
<!-- href=“javascript:void(0);”意为执行一个js的空方法,这样既执行了链接动作,页面又可以不跳转。 -->
<input id="searchBox" type="text"style="border:#87CEFA 1px solid;"/>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-search" plain="true" onclick="searchUser()">搜索</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-export-excel" plain="true" onclick="exportUser()">导出用户</a>
</div>
</div>

<div id="dlg" class="easyui-dialog"style="width:400px;height:250px;padding:10px 20px" closed="true" buttons="#dlg-buttons">
<form id="fm" method="post">
<table cellspacing="10px;">
<tr>
<td>姓名:</td>
<td><input name="name" class="easyui-validatebox" required="true"style="width: 200px;"></td>
</tr>
<tr>
<td>联系电话:</td>
<td><input name="phone" class="easyui-validatebox" required="true"style="width: 200px;"></td>
</tr>
<tr>
<td>Email:</td>
<td><input name="email" class="easyui-validatebox" validType="email" required="true"style="width: 200px;"></td>
</tr>
<tr>
<td>QQ:</td>
<td><input name="qq" class="easyui-validatebox" required="true"style="width: 200px;"></td>
</tr>
</table>
</form>
</div>

<div id="dlg-buttons">
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-ok" onclick="saveUser()">保存</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')">关闭</a>
</div>
</body>
</html>

  • Dao的关键代码

public class UserDao {
public ResultSet exportExcel(Connection con) throws Exception {
String sql = "select * from t_user";
PreparedStatement pstmt = con.prepareStatement(sql);
return pstmt.executeQuery();
}

public ResultSet exportExcel(Connection con, String searchKey) throws Exception {
String sql = "select * from t_user where name like ? or phone like ? or email like ? or qq like ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, "%" + searchKey + "%");
pstmt.setString(2, "%" + searchKey + "%");
pstmt.setString(3, "%" + searchKey + "%");
pstmt.setString(4, "%" + searchKey + "%");
return pstmt.executeQuery();
}

public ResultSet userList(Connection con, PageBean pageBean) throws Exception {
String sql = "select * from t_user limit ?,?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, pageBean.getStart());
pstmt.setInt(2, pageBean.getRows());
return pstmt.executeQuery();
}

public ResultSet userList(Connection con, PageBean pageBean, String searchKey) throws Exception {
String sql = "select * from t_user where name like ? or phone like ? or email like ? or qq like ? limit ?,?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, "%" + searchKey + "%");
pstmt.setString(2, "%" + searchKey + "%");
pstmt.setString(3, "%" + searchKey + "%");
pstmt.setString(4, "%" + searchKey + "%");
pstmt.setInt(5, pageBean.getStart());
pstmt.setInt(6, pageBean.getRows());
return pstmt.executeQuery();
}

public int userCount(Connection con) throws Exception {
String sql = "select count(*) as total from t_user";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
return rs.getInt("total");
} else {
return 0;
}
}

public int userCount(Connection con, String searchKey) throws Exception {
String sql = "select count(*) as total from t_user where name like ? or phone like ? or email like ? or qq like ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, "%" + searchKey + "%");
pstmt.setString(2, "%" + searchKey + "%");
pstmt.setString(3, "%" + searchKey + "%");
pstmt.setString(4, "%" + searchKey + "%");
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
return rs.getInt("total");
} else {
return 0;
}
}
......
}

  • 几个工具类

mport java.sql.ResultSet;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

// 将数据库的查询结果导入Excel
public class ExcelUtil {

public static void fillExcelData(ResultSet rs, Workbook wb, String[] headers) throws Exception {
int rowIndex = 0;
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(rowIndex++);
for (int i = 0; i < headers.length; i++) {
row.createCell(i).setCellValue(headers[i]);
}
while (rs.next()) {
row = sheet.createRow(rowIndex++);
for (int i = 0; i < headers.length; i++) {
row.createCell(i).setCellValue(rs.getObject(i + 1).toString());
}
}
}
}

import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Workbook;

public class ResponseUtil {

//将JSON返回前端
public static void write(HttpServletResponse response, Object o) throws Exception {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(o.toString());
out.flush();
out.close();
}

//将导出的Excel返回前端
public static void export(HttpServletResponse response, Workbook wb, String fileName) throws Exception {
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
}

  • 写个处理前端Excel导出请求的Servlet

web.xml

<servlet>
<servlet-name>exportExcelServlet</servlet-name>
<servlet-class>com.bee.web.ExportExcelServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>exportExcelServlet</servlet-name>
<url-pattern>/exportExcel</url-pattern>
</servlet-mapping>

Servlet

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;

import com.bee.dao.UserDao;
import com.bee.utils.DBUtil;
import com.bee.utils.ExcelUtil;
import com.bee.utils.ResponseUtil;

public class ExportExcelServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private DBUtil dbUtil = new DBUtil();
private UserDao userDao = new UserDao();

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8"); // 设定编码
String searchKey = request.getParameter("searchKey");

Connection con = null;
try {
con = dbUtil.getConnection();
Workbook wb = new HSSFWorkbook(); //新建一个xls文件
String[] headers = { "编号", "姓名", "电话", "Email", "QQ" };
ResultSet rs = null;
if (searchKey != null) {
// HTTP GET的URL参数默认是ISO-8859-1编码
searchKey = new String(searchKey.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("导出结果:" + searchKey);
rs = userDao.exportExcel(con, searchKey);
} else {
rs = userDao.exportExcel(con);
}
ExcelUtil.fillExcelData(rs, wb, headers); // 得到wb
ResponseUtil.export(response, wb, searchKey != null ? "导出搜索结果(" + searchKey + ").xls" : "导出全量.xls");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
dbUtil.closeConnection(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

  • 处理easyui-datagrid组件显示的Servlet

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bee.dao.UserDao;
import com.bee.model.PageBean;
import com.bee.utils.DBUtil;
import com.bee.utils.JsonUtil;
import com.bee.utils.ResponseUtil;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class UserListServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

DBUtil dbUtil = new DBUtil();
UserDao userDao = new UserDao();

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String page = request.getParameter("page");
String rows = request.getParameter("rows");

String searchKey = request.getParameter("searchVal");
System.out.println("查找:" + searchKey);

PageBean pageBean = new PageBean(Integer.parseInt(page), Integer.parseInt(rows));

Connection con = null;
try {
con = dbUtil.getConnection();
JSONObject result = new JSONObject();
JSONArray jsonArray = null;
int total = 0;
if (searchKey != null) {
jsonArray = JsonUtil.formatRsToJsonArray(userDao.userList(con, pageBean, searchKey));
total = userDao.userCount(con, searchKey);
} else {
jsonArray = JsonUtil.formatRsToJsonArray(userDao.userList(con, pageBean));
total = userDao.userCount(con);
}
result.put("rows", jsonArray);
result.put("total", total);
ResponseUtil.write(response, result); //返回JSON
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
dbUtil.closeConnection(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

2. 根据模版导出Excel

  • 思路
    先自定义一个Excel模版文件,并把格式等等设定好。然后利用POI以文件流的方式打开预先定义的Excel模版文件——注意不是使用 Workbook wb = new HSSFWorkbook(); 来新建Excel。 最后把数据写入Excel模版文件并返回前端即可。
  • 修改导出Excel的工具类

public class ExcelUtil {
......
public static Workbook fillExcelData(ResultSet rs, String templateFileName) throws Exception {
InputStream is = ExcelUtil.class.getResourceAsStream("/com/bee/template/" + templateFileName);
POIFSFileSystem pfs = new POIFSFileSystem(is);
Workbook wb = new HSSFWorkbook(pfs);
Sheet sheet = wb.getSheetAt(0); // 取得第一个sheet
int cellNums = sheet.getRow(0).getLastCellNum(); // 获取列数(getRow(0)是第一行)
int rowIndex = 1; // 第二行开始
while (rs.next()) {
Row row = sheet.createRow(rowIndex++);
for (int i = 0; i < cellNums; i++) {
row.createCell(i).setCellValue(rs.getObject(i + 1).toString());
}
}
return wb;
}
}

  • 修改导出处理的Servlet

public class ExportExcelServlet extends HttpServlet {
......
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("utf-8"); // 设定编码
String searchKey = request.getParameter("searchKey");

Connection con = null;
try {
con = dbUtil.getConnection();
ResultSet rs = null;
if (searchKey != null) {
// HTTP GET的URL参数默认是ISO-8859-1编码
searchKey = new String(searchKey.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("导出结果:" + searchKey);
rs = userDao.exportExcel(con, searchKey);
} else {
rs = userDao.exportExcel(con);
}
Workbook wb = ExcelUtil.fillExcelData(rs, "template.xls");
ResponseUtil.export(response, wb, searchKey != null ? "导出搜索结果(" + searchKey + ").xls" : "导出全量.xls");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
dbUtil.closeConnection(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}


举报

相关推荐

0 条评论