项目中我们经常用到导出功能,将数据导出以便于审查和统计等。本文主要使用Apache POI实现导出数据。

POI中文文档

简介

ApachePOI是Apache软件基金会的开放源码函式库,POI提供API给java程序对Microsoft Office格式档案读和写的功能。

HSSF概况

HSSF是Horrible
SpreadSheet
Format的缩写,通过HSSF,你可以用纯java代码来读取、写入、修改Excel文件。HSSF为读取操作提供了两类API:usermodel和eventusermodel,既”用户模型“和”事件-用户模型“。

POI Excel 文档结构类

  1. HSSFWorkbook excel文档对象
  2. HSSFSheet excelsheet
  3. HSSFRow excel的行
  4. HSSFCell excel的单元格
  5. HSSFFont excel字体
  6. HSSFName 名称
  7. HSSFDataFormat 日期格式
  8. HSSFHeader sheet
  9. HSSFFooter sheet
  10. HSSFCellStyle cell样式
  11. HSSFDateUtil 日期
  12. HSSFPrintSetup 打印
  13. HSSFErrorConstants 错误信息表
EXCEL常用操作方法

得到Excel常用对象

  1. POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));
  2. //得到Excel工作簿对象
  3. HSSFWorkbook wb = new HSSFWorkbook(fs);
  4. //得到Excel工作表对象
  5. HSSFSheet sheet = wb.getSheetAt(0);
  6. //得到Excel工作表的行
  7. HSSFRow row = sheet.getRow(i);
  8. //得到Excel工作表指定行的单元格
  9. HSSFCell cell = row.getCell((short) j);
  10. cellStyle = cell.getCellStyle();//得到单元格样式  

建立Excel常用对象

  1. HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象
  2. HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象
  3. HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行
  4. cellStyle = wb.createCellStyle();//创建单元格样式
  5. row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格
  6. row.createCell((short)0).setCellValue(1); //设置Excel工作表的值
设置表格
  1. //设置sheet名称和单元格内容
  2. wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);
  3. cell.setEncoding((short) 1);
  4. cell.setCellValue("单元格内容");
  5.  
  6. //取得sheet的数目
  7. wb.getNumberOfSheets()
  8.  
  9. //根据index取得sheet对象
  10. HSSFSheet sheet = wb.getSheetAt(0);
  11.  
  12. //取得有效的行数
  13. int rowcount = sheet.getLastRowNum();
  14.  
  15. //取得一行的有效单元格个数
  16. row.getLastCellNum();
  17.  
  18. //单元格值类型读写
  19. cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型
  20. cell.getNumericCellValue();//读取为数值类型的单元格内容
  21.  
  22. //设置列宽、行高
  23. sheet.setColumnWidth((short)column,(short)width);
  24. row.setHeight((short)height);
  25.  
  26. //添加区域,合并单元格
  27. Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo,(short)columnTo);//合并从第rowFrom行columnFrom列
  28. sheet.addMergedRegion(region);// 到rowTo行columnTo的区域
  29. //得到所有区域
  30. sheet.getNumMergedRegions()
  31.  
  32. //保存Excel文件
  33. FileOutputStream fileOut = new FileOutputStream(path);
  34. wb.write(fileOut);

开始实现

pom.xml
  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>${poi.version</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>org.apache.poi</groupId>
  9. <artifactId>poiscratchpad</artifactId>
  10. <version>${poi.version</version>
  11. </dependency>
  12.  
  13. <dependency>
  14. <groupId>org.apache.poi</groupId>
  15. <artifactId>poiooxml</artifactId>
  16. <version>${poi.version</version>
  17. </dependency>
excel导出工具类
  1. public class ExcelExport {
  2. //表头
  3. private String title;
  4. //各个列的表头
  5. private String[] heardList;
  6. //各个列的元素key值
  7. private String[] heardKey;
  8. //需要填充的数据信息
  9. private List<Map> data;
  10. //字体大小
  11. private int fontSize = 14;
  12. //行高
  13. private int rowHeight = 30;
  14. //列宽
  15. private int columWidth = 200;
  16. //工作表
  17. private String sheetName = "sheet1";
  18.  
  19. public String getTitle() {
  20. return title;
  21. }
  22.  
  23. public ExcelExport setTitle(String title) {
  24. this.title = title;
  25. return this;
  26. }
  27.  
  28. public String[] getHeardList() {
  29. return heardList;
  30. }
  31.  
  32. public ExcelExport setHeardList(String[] heardList) {
  33. this.heardList = heardList;
  34. return this;
  35. }
  36.  
  37. public String[] getHeardKey() {
  38. return heardKey;
  39. }
  40.  
  41. public ExcelExport setHeardKey(String[] heardKey) {
  42. this.heardKey = heardKey;
  43. return this;
  44. }
  45.  
  46. public List<Map> getData() {
  47. return data;
  48. }
  49.  
  50. public ExcelExport setData(List<Map> data) {
  51. this.data = data;
  52. return this;
  53. }
  54.  
  55. public int getFontSize() {
  56. return fontSize;
  57. }
  58.  
  59. public ExcelExport setFontSize(int fontSize) {
  60. this.fontSize = fontSize;
  61. return this;
  62. }
  63.  
  64. public int getRowHeight() {
  65. return rowHeight;
  66. }
  67.  
  68. public ExcelExport setRowHeight(int rowHeight) {
  69. this.rowHeight = rowHeight;
  70. return this;
  71. }
  72.  
  73. public int getColumWidth() {
  74. return columWidth;
  75. }
  76.  
  77. public ExcelExport setColumWidth(int columWidth) {
  78. this.columWidth = columWidth;
  79. return this;
  80. }
  81.  
  82. public String getSheetName() {
  83. return sheetName;
  84. }
  85.  
  86. public ExcelExport setSheetName(String sheetName) {
  87. this.sheetName = sheetName;
  88. return this;
  89. }
  90.  
  91. /**
  92. * 开始导出数据信息
  93. *
  94. * @throws ExcelException 抛出数据异常类
  95. */
  96. public byte[] exportExport(HttpServletRequest request, HttpServletResponse response) throws ExcelException {
  97. //检查参数配置信息
  98. checkConfig();
  99. //创建工作簿
  100. HSSFWorkbook wb = new HSSFWorkbook();
  101. //创建工作表
  102. HSSFSheet wbSheet = wb.createSheet(this.sheetName);
  103. //在第0行创建rows
  104. HSSFRow row = wbSheet.createRow((int) 0);
  105. //创建单元格,设置表头,表头居中
  106. HSSFCellStyle style = wb.createCellStyle();
  107. //设置单元格样式
  108. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  109. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  110. HSSFFont font = wb.createFont();
  111. font.setFontHeightInPoints((short) this.fontSize);
  112.  
  113. //设置列头元素
  114. HSSFCell cellHead = null;
  115. for (int i = 0; i < heardList.length; i++) {
  116. cellHead = row.createCell(i);
  117. cellHead.setCellValue(heardList[i]);
  118. cellHead.setCellStyle(style);
  119. }
  120.  
  121. //开始写入实体数据信息
  122. style.setFont(font);
  123. for (int i = 0; i < data.size(); i++) {
  124. HSSFRow roww = wbSheet.createRow((int) i + 1);
  125. Map map = data.get(i);
  126. HSSFCell cell = null;
  127. for (int j = 0; j < heardKey.length; j++) {
  128. cell = roww.createCell(j);
  129. cell.setCellStyle(style);
  130. Object valueObject = map.get(heardKey[j]);
  131. String value = null;
  132. if (valueObject == null) {
  133. valueObject = "";
  134. }
  135. if (valueObject instanceof String) {
  136. //取出的数据是字符串直接赋值
  137. value = (String) map.get(heardKey[j]);
  138. } else if (valueObject instanceof Integer) {
  139. //取出的数据是Integer
  140. value = String.valueOf(((Integer) (valueObject)).floatValue());
  141. } else if (valueObject instanceof BigDecimal) {
  142. //取出的数据是BigDecimal
  143. value = String.valueOf(((BigDecimal) (valueObject)).floatValue());
  144. } else {
  145. value = valueObject.toString();
  146. }
  147. cell.setCellValue(Strings.isNullOrEmpty(value) ? "" : value);
  148. }
  149. }
  150. //设置行高
  151. //设置行高的过程需要注意的一不包含标题
  152. for (int i = 0; i < data.size() + 1; i++) {
  153. HSSFRow hssfRow = wbSheet.getRow(i);
  154. hssfRow.setHeightInPoints(this.rowHeight);
  155. }
  156. //设置列宽
  157. if (data.size() > 0) {
  158. for (int i = 0; i < data.get(0).size(); i++) {
  159. wbSheet.setColumnWidth(i, MSExcelUtils.pixel2WidthUnits(this.columWidth));
  160. }
  161. } else {
  162. for (int i = 0; i < heardList.length; i++) {
  163. wbSheet.setColumnWidth(i, MSExcelUtils.pixel2WidthUnits(this.columWidth));
  164. }
  165. }
  166. //导出数据
  167. try {
  168. //设置Http响应头告诉浏览器下载这个附件
  169. response.setHeader("Content-Disposition", "attachment;Filename=" + System.currentTimeMillis() + ".xls");
  170. OutputStream outputStream = response.getOutputStream();
  171. wb.write(outputStream);
  172. outputStream.close();
  173. return wb.getBytes();
  174. } catch (Exception ex) {
  175. ex.printStackTrace();
  176. throw new ExcelException("导出Excel出现严重异常,异常信息:" + ex.getMessage());
  177. }
  178.  
  179. }
  180.  
  181. /**
  182. * 检查数据配置问题
  183. *
  184. * @throws ExcelException 抛出数据异常类
  185. */
  186. protected void checkConfig() throws ExcelException {
  187. if (heardKey == null || heardList.length == 0) {
  188. throw new ExcelException("列名数组不能为空或者为NULL");
  189. }
  190.  
  191. if (fontSize < 0 || rowHeight < 0 || columWidth < 0) {
  192. throw new ExcelException("字体、宽度或者高度不能为负值");
  193. }
  194.  
  195. if (Strings.isNullOrEmpty(sheetName)) {
  196. throw new ExcelException("工作表表名不能为NULL");
  197. }
  198. }
  199. }
Service层
  1. /**
  2. * 导出分类销售统计
  3. *
  4. * @param request
  5. * @param response
  6. * @param startDate 开始日期
  7. * @param endDate 结束日期
  8. * @param searchKey 关键字
  9. * @param storeId 店铺id
  10. * @param organId 组织id
  11. * @return
  12. */
  13. public byte[] exportSaleCategory(HttpServletRequest request, HttpServletResponse response, String startDate,String endDate, String searchKey, String storeId, String organId) {
  14. Integer count = augeSaleMapper.countShowCategoryStatistics(storeId, organId, startDate, endDate, searchKey);
  15. List<Map> maps = augeSaleMapper.selectShowCategoryStatistics(storeId, organId, startDate, endDate,searchKey, 0, count);
  16. String[] rowsName = new String[]{"商品分类", "销售数量", "销售金额", "毛利额", "毛利率"};
  17. String[] parames = new String[]{"name", "saleCount", "itemSumPrice", "grossProfit", "grossProfitMargin"};
  18. //创建导出工具类
  19. ExcelExport excelExport = new ExcelExport();
  20. excelExport.setHeardKey(parames).setData(maps).setHeardList(rowsName);
  21. byte[] bytes = excelExport.exportExport(request, response);
  22. return bytes;
  23. }
Controller层
  1. @RequestMapping(value = "/exportSaleCategory", method = RequestMethod.GET)
  2. public ResponseEntity<byte[]> exportSaleCategory(HttpServletRequest request, HttpServletResponse response, String startDate, String endDate, String searchKey, String storeId) throws Exception {
  3. AugeAdmin admin = (AugeAdmin) session.getAttribute("admin");
  4. HttpHeaders headers = new HttpHeaders();
  5. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  6. String fileName = new String(("品类销售统计.xls").getBytes("UTF-8"), "iso-8859-1");
  7. headers.setContentDispositionFormData("attachment", fileName);
  8. byte[] bytes = saleService.exportSaleCategory(request, response, Strings.emptyToNull(startDate),
  9. Strings.emptyToNull(endDate), Strings.emptyToNull(searchKey), Strings.emptyToNull(storeId), admin.getOrganId());
  10. return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);
  11. }
前端页面
  1. $("#exportBtn").on('click', function () {
  2. var startDate = $('#startDate').val();
  3. var endDate = $('#endDate').val();
  4. var storeId = $("#storeId").val();
  5. var url = "${basePath}/sale/exportSaleCategory?startDate=" + startDate + "&endDate=" +endDate + "&storeId=" + storeId;
  6. window.location.href = url;
  7. });
测试结果

Apache POI导出excel表格的更多相关文章

  1. 使用org.apache.poi导出Excel表格

    public HSSFWorkbook MakeExcel(List<TransactionLogVO> logList) { // SimpleDateFormat sdf = new ...

  2. 使用Apache POI导出Excel小结--导出XLS格式文档

    使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI ...

  3. apache poi导出excel报表

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.POI为"P ...

  4. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  5. 使用poi导出Excel表格,jar包冲突

    HTTP Status 500 – Internal Server Error Type Exception Report Message Handler processing failed; nes ...

  6. 复杂的POI导出Excel表格(多行表头、合并单元格)

    poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...

  7. apache POI 导出excel相关方法

    apache POI 操作excel无比强大.同时有操作word和ppt的接口. 下面讲解poi中常用方法. 1,设置列宽 HSSFSheet sheet = wb.getSheetAt(0); sh ...

  8. Apache POI导出excel

    public String exportXls(HttpServletRequest request, HttpServletResponse response) { try { HSSFWorkbo ...

  9. poi导出excel表格

    package poiexcel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; ...

随机推荐

  1. 内存管理cpuset,mempolicy[原理]

    介绍cpuset,mbind,set_mempolicy在内存管理上的应用 change log :确定先从mempolicy的man 手册翻译开始研究,计划如下 .先从man手册入手,通过实现mem ...

  2. 从零开始学 Web 之 移动Web(六)响应式布局

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  3. 以ActiveMQ为例JAVA消息中间件学习【2】

    前言 之前我们学习了什么是消息中间件,以ActiveMQ为例做了一个最简单的消息中间件的实现.但是我们做的就只能算是个例子而已,因为在实际的项目中肯定会有spring插一脚,所以spring肯定有来管 ...

  4. php 图像裁剪(自定义裁剪图片大小)

    <?php /** * 图像裁剪 * @param $title string 原图路径 * @param $content string 需要裁剪的宽 * @param $encode str ...

  5. SQL 同一张表中相同字段的内容合并为一条记录(不同字段的那一列每个记录后面加逗号)

    一.创建表 create table stuUnion ( sid int identity primary key, cid int, id ) ) 二.添加数据 insert into stuUn ...

  6. 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器

    首先,非常感谢赵老大的CodeTimer,它让我们更好的了解到代码执行的性能,从而可以让我们从性能的角度来考虑问题,有些东西可能我们认为是这样的,但经理测试并非如何,这正应了我之前的那名话:“机器最能 ...

  7. 《Photoshop CS4手绘艺术技法》

    书名 <Photoshop CS4手绘艺术技法> 图片 时间 2017-4月  学习 想了想当初的学习动机,自己P图片可是P的是实在是丑就会做几张动图.看完了才发现这行博大精深而且自己的审 ...

  8. ModBus通信协议的【主从模式】

    主从模式 (1) 至少且只有一个主机,其他的都是从机 (2) 不管任何时候,从机都不能主动向主机发送数据 (3) 主机具有访问从机的权限,从机不可以主动访问从机,任何一次数据交换,都要由主机发起 (4 ...

  9. C# 循环语句 for

    循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变. for格式 for(初始条件;循环条件;状态改变) { 循环体 } break ——中断循环,跳出整个循环 continu ...

  10. js 对url进行编码和解码的三种方式

    一.escape 和 unescape escape 原理:对除 ASCII字母.数字.标点符号(@ * _ + - . /) 以外的字符进行编码 .编码的字符被替换成了十六进制的转义序列 不编码的字 ...