利用Java将数据库中的数据导出为excel表格,导出完后可以下载,并压缩成zip格式

使用poi导出excel表,可以设置列宽、单元格合并居中、背景色设置等。

主要代码如下:

前端js代码

 1 <body>
 2     <button onclick="test()">导出 excel表</button>
 3 
 4     <a id="download" href="#"> <span id="spanId" />
 5     </a>
 6 </body>
 7 <script type="text/javascript">
 8   
 9 function test(){
10    $.ajax({
11             //提交数据的类型 POST GET
12             type:"POST",
13             //提交的网址
14             url:"Excel.html",
15             //提交的数据
16             data:{"name":"zhangjinru"},
17             //返回数据的格式
18             datatype: "json",//"xml", "html", "script", "json", "jsonp", "text".
19             //在请求之前调用的函数
20            // beforeSend:function(){$("#msg").html("logining");},
21             //成功返回之后调用的函数             
22             success:function(data){
23              $("#download").attr("href", "/download/"+data.StringUrl);
24              //自动点击
25              $("#spanId").click();
26             },
27             //调用执行后调用的函数
28             complete: function(XMLHttpRequest, textStatus){
29             },
30             //调用出错执行的函数
31             error: function(){
32                 //请求出错处理
33             }         
34          });
35   }
36   </script>
View Code

后台主要代码

  1 package com.zhang;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileNotFoundException;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 import java.io.PrintWriter;
  9 import java.sql.Connection;
 10 import java.sql.PreparedStatement;
 11 import java.sql.ResultSet;
 12 import java.sql.ResultSetMetaData;
 13 import java.util.zip.ZipEntry;
 14 import java.util.zip.ZipOutputStream;
 15 
 16 import javax.servlet.ServletException;
 17 import javax.servlet.http.HttpServlet;
 18 import javax.servlet.http.HttpServletRequest;
 19 import javax.servlet.http.HttpServletResponse;
 20 
 21 import org.apache.poi.ss.usermodel.Cell;
 22 import org.apache.poi.ss.usermodel.CellStyle;
 23 import org.apache.poi.ss.usermodel.IndexedColors;
 24 import org.apache.poi.ss.usermodel.Row;
 25 import org.apache.poi.ss.usermodel.Sheet;
 26 import org.apache.poi.ss.util.CellRangeAddress;
 27 import org.apache.poi.xssf.streaming.SXSSFSheet;
 28 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 29 import org.apache.poi.xssf.usermodel.XSSFRichTextString;
 30 
 31 public class Excel extends HttpServlet {    
 32     /**
 33      *    查询数据库中的数据,然后将其导出到Excel表中。将导出的Excel表压缩成Zip文件。
 34      *    点击导出后可以将Zip文件下载到文本地。单元格可以合并,可以设置背景色和居中
 35      */
 36     private static final String file="D:/software/tomcat/webapps/DbToExcel/download/";
 37     private static final String zipFile="D:/software/tomcat/webapps/DbToExcel/download/";
 38     private static final long serialVersionUID = 1L;
 39     
 40     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 41         doPost(request,response);
 42     }
 43     
 44     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 45         System.out.println(request.getParameter("name"));
 46         
 47         response.setHeader("Access-Control-Allow-Origin", "*");
 48         response.setHeader("Access-Control-Allow-Methods", "*");
 49         response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");         
 50         response.setCharacterEncoding("utf-8");
 51         //response.setContentType("text/html;charset=utf-8");
 52         response.setContentType("application/json;charset=utf-8");
 53         
 54         //得到数据库连接
 55         Connection conn=DBUtil.getConnection();
 56         String sql="SELECT id AS id ,username AS 用户名 ,birthday AS 生日,sex AS 性别,address AS 地址 FROM TEST";
 57         PreparedStatement pstmt;
 58         try {
 59             pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
 60             //设置每次只读取一部分数据
 61             pstmt.setFetchSize(1000);
 62             pstmt.setFetchDirection(ResultSet.FETCH_REVERSE);
 63             ResultSet    rs = pstmt.executeQuery();
 64             
 65             //一旦这个Workbook中数据量超过1000就会写入到磁盘中
 66             SXSSFWorkbook workbook = new SXSSFWorkbook(1000);
 67             Sheet sheet = (Sheet) workbook.createSheet();
 68             //设置宽度 sheet.setColumnWidth(m, “列名”.getBytes().length*2*256);
 69             sheet.setColumnWidth(0, 1000);
 70             sheet.setColumnWidth(1, 2000);
 71             sheet.setColumnWidth(2, 3000);
 72             sheet.setColumnWidth(3, 1000);
 73             sheet.setColumnWidth(4, 4000);
 74             workbook.setSheetName(0,  "sheet1");
 75             Row row = sheet.createRow((short) 0);
 76             Cell cell;
 77             CellStyle cellStyle;
 78             //单元格合并
 79             sheet.addMergedRegion(new CellRangeAddress( 0,  0,  0,  4));//参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号
 80             cell = row.createCell((short) 0);
 81             cell.setCellType(Cell.CELL_TYPE_STRING);
 82             cell.setCellValue(new XSSFRichTextString("数据流向"));
 83             //设置背景色
 84             cellStyle=workbook.createCellStyle();
 85             cellStyle.setFillForegroundColor(IndexedColors.CORAL.getIndex());
 86             cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
 87 
 88             cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中
 89 //            cellStyle.setAlignment(CellStyle.VERTICAL_CENTER); // 垂直居中
 90             cell.setCellStyle(cellStyle);
 91 
 92             /*    
 93             cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框
 94              cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框 
 95             cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框 
 96             cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框 
 97              */            
 98 
 99             //获取有多少列
100             ResultSetMetaData md = rs.getMetaData();
101             int nColumn = md.getColumnCount();
102             row =  sheet.createRow(1);
103             cellStyle=workbook.createCellStyle();
104             for (int i = 1; i <= nColumn; i++) {
105                 cell = row.createCell((short) (i-1));
106                 //设置数据类型Cell.CELL_TYPE_STRING Cell.CELL_TYPE_NUMERIC Cell.CELL_TYPE_FORMULA Cell.CELL_TYPE_BOOLEAN Cell.CELL_TYPE_BLANK Cell.CELL_TYPE_ERROR
107                 cell.setCellType(Cell.CELL_TYPE_STRING);
108                 //设置值
109                 cell.setCellValue(new XSSFRichTextString(md.getColumnLabel(i)));
110                 //设置背景色
111                 cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
112                 cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
113                 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中
114                 cell.setCellStyle(cellStyle);
115             }
116 
117             int iRow = 2;
118             while (rs.next()) {
119                 row =  sheet.createRow(iRow);
120                 for (int j = 1; j <= nColumn; j++) {
121                     cell = row.createCell((short) (j - 1));
122                     cell.setCellType(Cell.CELL_TYPE_STRING);
123                     if (rs.getObject(j) != null) {
124                         cell.setCellValue(new XSSFRichTextString(rs.getObject(j).toString()));
125                     } else {
126                         cell.setCellValue("");
127                     }
128                 }
129                 //每1000行将数据存入硬盘
130                 if (iRow % 1000 == 0) {
131                     ((SXSSFSheet) sheet).flushRows();
132                 }
133                 iRow++;
134             }
135 
136             String filename=System.currentTimeMillis()+".xlsx";
137             String savefile=file+filename;
138             String zipfilename=System.currentTimeMillis()+".zip";
139             String zipsavefile=zipFile+zipfilename;
140             FileOutputStream fOut = new FileOutputStream(savefile);
141             workbook.write(fOut);
142             fOut.flush();
143             fOut.close();
144 
145             //将文件转换成Zip文件
146             FiletoZip(savefile, zipsavefile);
147             
148             //将下载路径返回给前端
149             PrintWriter  out = response.getWriter();  
150             out.write("{\"StringUrl\":\""+zipfilename+"\"}");
151             out.close();  
152         } catch (Exception e) {
153             e.printStackTrace();
154         }
155 
156     }
157     
158     /**
159      * 将文件压缩成zip文件
160      * @param file 文件路径
161      * @param zipFile 压缩后的文件路径
162      * @throws IOException
163      * @throws FileNotFoundException
164      */
165     private void FiletoZip(String file, String zipFile) throws IOException,FileNotFoundException {
166         File f = new File(file);
167         File ff = new File(zipFile);
168         if (!f.exists()) {
169             ff.createNewFile();
170         }
171         FileInputStream in = new FileInputStream(file);
172         FileOutputStream out = new FileOutputStream(zipFile);
173         ZipOutputStream zipOut = new ZipOutputStream(out);
174         String fileName = file.substring(file.lastIndexOf('/') + 1, file.length());
175         // 创建指向压缩原始文件的入流
176         ZipEntry entry = new ZipEntry(fileName);
177         zipOut.putNextEntry(entry);
178         // 向压缩文件中输出数据
179         int number = 0;
180         byte[] buffer = new byte[512];
181         while ((number = in.read(buffer)) != -1) {
182             zipOut.write(buffer, 0, number);
183         }
184         zipOut.close();
185         out.close();
186         in.close();
187         
188 //        f.delete();
189     }
190 
191     /**
192      * 设置跨越
193      */
194     @Override
195     protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
196         resp.setHeader("Access-Control-Allow-Credentials", "false");
197         resp.setHeader("Access-Control-Allow-Origin", "*");
198         resp.setHeader("Access-Control-Allow-Methods", "*");
199         resp.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
200         resp.setContentType("application/json");
201         resp.setCharacterEncoding("utf-8");
202         super.doOptions(req, resp);
203     }
204 }
View Code

注意:如果数据超过1048575条会报下面的错误

 

本项目使用的jar包和源码下载链接:http://download.csdn.net/detail/u013865056/9908167

posted on 2017-07-23 21:30  zhangjinru123  阅读(348)  评论(0编辑  收藏  举报