java、Extjs导出数据库里的数据至Excel并下载至本地进行数据备份方法之一——使用servlet
2014-05-09 15:05
911 查看
推荐使用这种方式,因为封装性更好,当需要导出的表列需要变动时,只需要在js文件中改动就行了,不像使用Action方法时需要变动Action中的Java代码。
每次点击导出按钮后,调用ExportExcel函数并传入fileName、columnItemsStr、sql三个参数,该函数完成Excel文件导出至客户端的功能。传入参数时需要注意Extjs传递中文参数至后台时乱码的处理。本文中已经做了处理,具体是:在js中对中文参数作两次编码处理,如:var fileName = "光纤段"; var url = 'ExportExcel' + '?fileName=' + encodeURI(encodeURI(fileName)) + '&columnItemsStr='
+ encodeURI(encodeURI(columnItemsStr)) +'&sql=' + sql;,后台接收参数时,要进行解码:String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");,这样在后台就能获取到中文参数。
servlet文件内容(导出Excel文件功能的封装):
DB封装:
Extjs代码中的调用语句:
实现效果如下:
下载后的文件内容:
每次点击导出按钮后,调用ExportExcel函数并传入fileName、columnItemsStr、sql三个参数,该函数完成Excel文件导出至客户端的功能。传入参数时需要注意Extjs传递中文参数至后台时乱码的处理。本文中已经做了处理,具体是:在js中对中文参数作两次编码处理,如:var fileName = "光纤段"; var url = 'ExportExcel' + '?fileName=' + encodeURI(encodeURI(fileName)) + '&columnItemsStr='
+ encodeURI(encodeURI(columnItemsStr)) +'&sql=' + sql;,后台接收参数时,要进行解码:String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");,这样在后台就能获取到中文参数。
servlet文件内容(导出Excel文件功能的封装):
package com.otdrmsys.servlet; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.net.URLDecoder; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import com.otdrmsys.util.DB; /** * Servlet implementation class ExportExcel */ public class ExportExcel extends HttpServlet { private static final long serialVersionUID = 1L; public static final Logger errorLogger = Logger.getLogger("dailyError"); public static final Logger infoLogger = Logger.getLogger("dailyInfo"); /** * @see HttpServlet#HttpServlet() */ public ExportExcel() { super(); } /** */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8"); String columnItemsStr = URLDecoder.decode(request.getParameter("columnItemsStr"),"UTF-8"); String sql = request.getParameter("sql"); String[] columnItems = columnItemsStr.split(",");//从字符串形式的列名中获取列名数组 Connection conn = DB.createConn(); PreparedStatement ps = DB.prepare(conn, sql); ResultSet rs = null; try { rs = ps.executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); } HSSFWorkbook workbook = new HSSFWorkbook(); try { HSSFSheet sheet = workbook.createSheet(); createTag(columnItems, sheet);// 写表格的列名 createValue(rs, sheet);// 获取数据集,然后获得数据,写文件 //通过Response把数据以Excel格式保存 response.reset(); response.setContentType("application/msexcel;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=\"" + new String((fileName + ".xls").getBytes("GBK"),"ISO8859_1") + "\""); OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); //输出文件到客户端 outputStream.flush(); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } DB.close(ps); DB.close(conn); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * 创建表格表头 * * @param tags * @param sheet */ private static void createTag(String[] tags, HSSFSheet sheet) { HSSFRow row = sheet.createRow(0); HSSFCell cell = null; // 定义单元格为字符串类型 for (int i = 0; i < tags.length; i++) { cell = row.createCell(i); cell.setCellValue(tags[i]); // cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理 } } /** * 设置表格内容 * * @param res * @param sheet */ private static void createValue(java.sql.ResultSet res, HSSFSheet sheet) { try { int flag = 1; int count = res.getMetaData().getColumnCount(); HSSFRow row = null; HSSFCell cell = null; while (res.next()) { row = sheet.createRow(flag); for (int i = 1; i <= count; i++) { cell = row.createCell(i - 1); Object obj = res.getObject(i); cell.setCellValue(obj + ""); } flag++; } } catch (SQLException e) { e.printStackTrace(); } } }
DB封装:
package com.otdrmsys.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DB { public static Connection createConn() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/wenling_map_db", "root", "hel610"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static PreparedStatement prepare(Connection conn, String sql) { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } return ps; } public static void close(Connection conn) { try { conn.close(); conn = null; } catch (SQLException e) { e.printStackTrace(); } } public static void close(Statement stmt) { try { stmt.close(); stmt = null; } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { rs.close(); rs = null; } catch (SQLException e) { e.printStackTrace(); } } }
Extjs代码中的调用语句:
{ id: 'fiberLineBackupBtnId', text: '导出', hidden: true, tooltip: '备份光纤段信息', iconCls: 'save', handler: function(){ var fileName = "光纤段";// 文件名,不带路径,不带.xls后缀 var columnItemsStr = "光纤段id,光纤段名称,起点,终点,负责人,负责人手机号"; var sql = "select id, name,( " + "select name from _station s where s.id = f.startPoint_id ),( " + "select name from _station s where s.id = f.endPoint_id ),( " + "select name from _repairer r where r.id = f.repairer_id ), ( " + "select phoneNum from _repairer r where r.id = f.repairer_id ) " + "from _fiberline f;"; var url = 'ExportExcel' + '?fileName=' + encodeURI(encodeURI(fileName)) + '&columnItemsStr=' + encodeURI(encodeURI(columnItemsStr)) +'&sql=' + sql; window.location.href = url ; } }
实现效果如下:
下载后的文件内容:
相关文章推荐
- java、Extjs导出数据库里的数据至Excel并下载至本地进行数据备份方法之二——使用Action
- Java导出页面数据或数据库数据至Excel文件并下载,采用JXL技术,小demo(servlet实现)
- Java实现数据库数据导出到Excel中并下载到浏览器本地
- PHP使用外部命令导出数据库,备份到服务器并下载到本地
- Java使用POI将数据导出到Excel的工具方法
- JSP实现从数据库导出数据到Excel下载的方法
- Java 让excel导出大量数据进行分表打成压缩包进行下载
- java中使用JXL对Excel文件进行数据的写入、导出操作
- Java 使用poi把数据库中数据导入Excel的解决方法
- java实现数据库数据导出到Excel并下载查看
- java中使用JXL对Excel文件进行数据的写入、导出操作
- SQL:使用备份向导、SQL命令、导出数据三种方式对已建立的数据库进行备份
- 在vnpy中使用mongdb数据库插入tb导出的csv数据进行回测的方法
- JSP实现从数据库导出数据到Excel下载的方法
- JAVA使用poi进行EXCEL模板导入导出,XSSFCell数据类型
- java导出数据库中Excel表格数据的方法
- PHP使用外部命令导出数据库,备份到服务器并下载到本地
- 导出excel表格到本地服务器, 远程下载 Java
- java下载excel,excel从数据库获取数据
- JSP从数据库导出数据到Excel下载的实现