Java导出Excel表格

利用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>

后台主要代码

  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 }

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

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

时间: 2024-10-07 06:42:29

Java导出Excel表格的相关文章

java 导出excel表格数据

本篇文章基于java把数据库中的数据以Excel的方式导出,欢迎各位大神吐槽: 1.基于maven jar包引入如下: 1 <dependency> 2 <groupId>net.sourceforge.jexcelapi</groupId> 3 <artifactId>jxl</artifactId> 4 <version>2.6.12</version> 5 </dependency> 2.首先创建数据库对

Java导出Excel三表头

1.问题背景 Java导出Excel表格时,表头出现了三个,即多表头Excel 2.实现源码 /** * * @Project:Report * @Title:ThreeHead.java * @Package:com.you.excel * @Description: * @Author:YouHaiDong * @Date:2015年11月4日 下午3:10:12 * @Version: */ package com.you.excel; import java.io.FileOutputS

java代码实现导出Excel表格、工具ssm框架、maven、idea

第一步.导入依赖 <!--生成excel文件--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId&g

java中使用jxl导出Excel表格详细通用步骤

该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入session中备份一份,在调用导出方法时,从session中获取即可, 如果为后台直接导出,直接查询数据库后将结果传入即可,当然也可以在导出Excel方法中查询. 查询方法: // 获取查询结果存入session中        Object resultList = request.getAttr

Java导出Excel Sheet页

1.问题背景 导出Excel表格时,首先要生成Sheet页,下面将介绍如何生成Sheet页 2.实现源码 /** * * @Project: * @Title:ExcelExport.java * @Package:report.utils * @Description: * @Author:YouHaiDong * @Date:2015年11月2日 下午6:29:22 * @Version: */ package report.utils; import java.io.FileNotFoun

java生成excel表格和pdf并实现下载弹出框

今天在pdf和excel中都实现了在浏览器弹出下载框 将之前在网上查找的生成excel表格代码稍微修改下: public class CreateSimpleExcelToDisk { /** * @功能:手工构建一个简单格式的Excel */ private static List<News> getNews() throws Exception { List<News> data = new ArrayList<News>(); NewsDao dao = new

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

Java导出Excel合并单元格

1.问题背景 利用POI导出Excel表格,在导出的过程中涉及到双表头,即需要合并单元格 2.实现源码 /** * * @Project:Report * @Title:MergeCell.java * @Package:com.you.excel * @Description: * @Author:YouHaiDong * @Date:2015年11月4日 下午2:36:46 * @Version: */ package com.you.excel; import java.io.FileOu