利用poi进行数据的excel导出
2019独角兽企业重金招聘Python工程师标准>>>
添加maven依赖:
<!-- poi --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17-beta1</version> </dependency><!-- fast json --> <dependency> <groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.31</version> </dependency>
主要代码:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.liyang.entity.UserEntity; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.List;/** * 导出excel工具 * * @author 李阳 * @mail ly_triangle@126.com * 15002992382 * 2017-07-24 */ public class ExcelUtil {/** * 根据给定的数据在前端页面导出excel * * @param fileName 文件名 * @param wb 工作簿 * @param response * @throws IOException */ public static void exportDatasExcel(String fileName, Workbook wb, HttpServletResponse response) throws IOException { //清空前端缓存 response.reset(); //指定前端文件mime类型 response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-Disposition", "attachment;fileName="+ new String(replaceSpecialChars(fileName).getBytes(), "iso8859-1")+ ".xlsx");//字节数组输出流 ByteArrayOutputStream out = new ByteArrayOutputStream();//将工作簿写进字节数组输出流中 wb.write(out);//创建字节数组输入流,将输出流中的数据写进该输入流中,最后创建输入流的缓冲流,便于读取数据 BufferedInputStream bufferIn = new BufferedInputStream(new ByteArrayInputStream(out.toByteArray()));//获得response输出流,并获得输出流的缓冲流,便于写入数据 BufferedOutputStream bufferOut = new BufferedOutputStream(response.getOutputStream());//每次输出文件1000字节长度数据到输出流 byte[] buffer = new byte[1000];int bytesRead;//读取输入缓冲流中的数据,经过缓冲输出流发送给前端下载 while (-1 != (bytesRead = bufferIn.read(buffer))) {bufferOut.write(buffer, 0, bytesRead);}bufferOut.flush();bufferIn.close();bufferOut.close();}/** * 创建excel表格(记录性结果) * * @param titles 标题集合 * @param keys key值集合,用于读取json对象中的数据 * @param objects 数据对象集合 * @return */ private static Workbook buildWorkbook(List<String> titles, List<String> keys, List<Object> objects, String fileName) {//创建工作簿 Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook(); //创建表格 Sheet sheet = wb.createSheet(replaceSpecialChars(fileName));//第一行 Row row = sheet.createRow(0);//第二行 Row row1 = sheet.createRow(1);//创建数据单元格样式 CellStyle style = creatStyle(wb);//创建标题单元格样式CellStyle titleStyle = creatTitleStyle(wb);Cell cell;Cell cell1;//遍历标题,标题占两行 for (int t = 0; t < titles.size(); t++) {//创建标题单元格并设置标题单元格的值 cell = row.createCell(t);cell.setCellValue(titles.get(t));//创建第二行单元格 cell1 = row1.createCell(t);//合并上下单元格(标题占两行) sheet.addMergedRegion(new CellRangeAddress(0, 1, t, t));//对单元格使用样式 cell.setCellStyle(titleStyle );cell1.setCellStyle(titleStyle );}//将对象集合转换成json对象数组 JSONArray array = JSON.parseArray(JSON.toJSONString(objects));//遍历json对象数组,将数据写进excel中 for (int r = 2; r < array.size() + 2; r++) {JSONObject o = array.getJSONObject(r - 2);//创建行 row = sheet.createRow(r);//创建行单元格,并赋值 for (int c = 0; c < keys.size(); c++) {String value = o.get(keys.get(c)) == null ? "" : o.get(keys.get(c)).toString();cell = row.createCell(c);cell.setCellValue(value);cell.setCellStyle(style);}}// 最后一列宽自适应sheet.autoSizeColumn(titles.size()-1);//获得工作簿 return wb;}
创建复杂excel表格(非记录性数据,需要一定模板):
/** * 动态生成复杂excel * * @param rowSize 行数 * @param columnSize 列数 * @param models 单元格实例集合(每一个单元格(包括合并的单元格)起止行列四个索引和单元格的值) * @param fileName 文件名 * @return */ public static Workbook buildWorkbook2(Integer rowSize, Integer columnSize, List<CellModel> models, String fileName) {Workbook wb = new XSSFWorkbook();Sheet sheet = wb.createSheet(replaceSpecialChars(fileName));CellStyle style = creatStyle(wb);CellStyle titleStyle = creatTitleStyle(wb);Row row;Cell cell;//创建空表格 for (int r = 0; r < rowSize; r++) {row = sheet.createRow(r);for (int c = 0; c < columnSize; c++) {cell = row.createCell(c);if (0 == r || 1 == r) {cell.setCellStyle(titleStyle);} else {cell.setCellStyle(style);}}}//单元格赋值并合并单元格 models.forEach(c -> {Integer rowBegin = c.getRowBegin();Integer rowEnd = c.getRowEnd();Integer columnBegin = c.getColumnBegin();Integer columnEnd = c.getColumnEnd();sheet.getRow(rowBegin).getCell(columnBegin).setCellValue(c.getValue().toString());if (rowBegin.intValue() != rowEnd.intValue() || columnBegin.intValue() != columnEnd.intValue())sheet.addMergedRegion(new CellRangeAddress(rowBegin, rowEnd, columnBegin, columnEnd));});short height = sheet.getDefaultRowHeight();sheet.setDefaultRowHeight((short) (height * 1.7));sheet.setDefaultColumnWidth(15);return wb; }
单元格对象:
public class CellModel {private Object value = ""; //单元格值 private Integer rowBegin; //开始行索引 private Integer rowEnd; //结束行索引 private Integer columnBegin; //开始列索引 private Integer columnEnd; //结束列索引.....略
创建标题样式:
/** * create title style * @param wb * @return */ private static CellStyle creatTitleStyle(Workbook wb) {Font font = wb.createFont();font.setFontHeightInPoints((short) 12);font.setFontName("黑体");font.setBold(true);CellStyle titleStyle = wb.createCellStyle();titleStyle.setAlignment(HorizontalAlignment.CENTER);titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);titleStyle.setBorderTop(BorderStyle.THIN);titleStyle.setBorderBottom(BorderStyle.THIN);titleStyle.setBorderLeft(BorderStyle.THIN);titleStyle.setBorderRight(BorderStyle.THIN);//背景色titleStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.SEA_GREEN.getIndex());titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);titleStyle.setFont(font);return titleStyle; }
创建数据样式:
private static CellStyle creatStyle(Workbook wb) {Font font = wb.createFont();//字号font.setFontHeightInPoints((short) 12);//字体font.setFontName("宋体"); //斜体//font.setItalic(true);//加粗//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//创建样式CellStyle style = wb.createCellStyle();// 给样式指定字体style.setFont(font);//纵横向居中style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);//四周边框style.setBorderTop(BorderStyle.THIN);style.setBorderBottom(BorderStyle.THIN);style.setBorderLeft(BorderStyle.THIN);style.setBorderRight(BorderStyle.THIN);return style; }
文件名特殊字符处理(特殊字符统一用空格替换)
private static String replaceSpecialChars(String fileName) {return fileName.replaceAll(":", " ").replaceAll(":", " ").replaceAll("?", " ").replaceAll("\\?", " ").replaceAll("\\*", " ").replaceAll("]", " ").replaceAll("\\[", " ").replaceAll("“", " ").replaceAll("”", " ").replaceAll("\"", " ").replaceAll("\\|", " ").replaceAll(">", " ").replaceAll("<", " ").replaceAll("\\\\", " ").replaceAll("/", " "); }
测试1(记录性结果):
/*** test */ public static void main(String[] args) throws IOException {//构造数据对象集合 List list = Arrays.asList(new UserEntity("kevin", "lee", 5),new UserEntity("david", "lee", null),new UserEntity("kavin", "", 6),new UserEntity("kavein", "lee", 65));//构造标题和key值列表,生成工作簿 Workbook wb = buildWorkbook(Arrays.asList("姓名", "全名", "年龄"),Arrays.asList("stageName", "fullName", "sex"), list);//生成服务器本地文件,如需输出到前端,只需要调用exportDatasExcel方法即可 FileOutputStream fileOut = new FileOutputStream("dataExcel.xlsx");wb.write(fileOut);fileOut.close();wb.close();}
测试2(复杂结果):
public static void main(String[] args) throws IOException {//构造数据对象集合 List list = new ArrayList();list.add(new CellModel("标题", 0, 1, 0, 3)); list.add(new CellModel("购买渠道", 2, 26, 0, 0));list.add(new CellModel("微信", 2, 13, 1, 1));list.add(new CellModel("网站", 14, 26, 1, 1)); list.add(new CellModel("微信平台名称", 2, 3, 2, 3));list.add(new CellModel("大秦帝国", 4, 13, 2, 3));list.add(new CellModel("网站平台名称", 14, 15, 2, 3));list.add(new CellModel("饿狼传说", 16, 26, 2, 3));//构造标题和key值列表,生成工作簿 Workbook wb = buildWorkbook2(27, 5, list, "domo");//生成服务器本地文件,如需输出到前端,只需要调用exportDatasExcel方法即可 FileOutputStream fileOut = new FileOutputStream("domo.xlsx");wb.write(fileOut);fileOut.close();wb.close(); }
测试结果:
记录性结果excel:
复杂excel结果:
转载于:https://my.oschina.net/kevin2kelly/blog/1486059
利用poi进行数据的excel导出相关推荐
- java操作Excel之POI(4)利用POI实现数据的批量导出
后台导出方法: 1 /** 2 * 后台导出方法 3 * 利用POI实现数据的批量导出 4 */ 5 public String export() throws Exception{ 6 Connec ...
- JAVA 利用poi EXCLE模板文档导出数据
JAVA 利用poi EXCLE模板文档导出数据 1.导入jar包 下载地址:添加链接描述 提取码:xqkg 2.EXCLE模板 3.代码示例 package utill;import java.io ...
- PHP 利用PHPExcel到处数据到Excel;还有导出数据乱码的解决方案。
PHP 利用PHPExcel到处数据到Excel:还有导出数据乱码的解决方案. 参考文章: (1)PHP 利用PHPExcel到处数据到Excel:还有导出数据乱码的解决方案. (2)https:// ...
- Laravel 使用PHP_XLSXWriter实现大数据量Excel导出
我在去年写过一篇关于laravel的Excel导出文章:Laravel Excel 实现 Excel/CSV 文件导入导出功能,使用的是Laravel Excel实现的. 该扩展包含Excel导入导出 ...
- 基于easyexcel的MySQL百万级别数据的excel导出功能
前言 最近我做过一个MySQL百万级别数据的excel导出功能,已经正常上线使用了. 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助. 原始需求:用户在U ...
- 数据库数据用Excel导出的3种方法
数据库数据用Excel导出的3种方法 分类: .Net 2008-06-30 11:07 173人阅读 评论(2) 收藏 举报 将数据库数据用Excel导出主要有3种方法:用Excel.Applica ...
- python数据导出excel_python 数据生成excel导出(xlwt,wlsxwrite)代码实例
这篇文章主要介绍了python 数据生成excel导出(xlwt,wlsxwrite)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 话不多 ...
- python 生成excel_python 数据生成excel导出(xlwt,wlsxwrite)代码实例
这篇文章主要介绍了python 数据生成excel导出(xlwt,wlsxwrite)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 话不多 ...
- JSON格式数据转Excel导出
json格式数据转Excel导出的两种方法 第一种table格式数据直接转Excel: 但是用这种方式会出现一种问题,就是当你的table有分页的情况下,只能抓取当前分页的数据. 拿到表格的id就可以 ...
最新文章
- PaddlePaddle yolov3
- Python3 range()函数
- 今日头条极速版怎样签到_今日头条投放广告的费用多少钱?今日头条广告投放完整流程是怎样?...
- UA OPTI512R 傅立叶光学导论11 卷积的性质
- Spring boot的Spring MVC自动配置原理
- cookie的保存时间
- Educational Codeforces Round 73 (Rated for Div. 2)
- 大学计算机应用基础教程第三章,计算机应用基础教程 李健苹 计算机应用基础教程 第3章...
- iOS开发者的一些前端感悟
- JMeter Linux下执行测试
- ios系统——先了解iCloud是什么吧
- 12306自动抢票及自动识别验证码功能(二)
- 计算体重指数BMI -C语言初学
- Learning Local Search Heuristics for Boolean Satisfiability 2020-04-30
- dhcp服务器响应慢,请教下大家DHCP获取慢的原因和解决思路
- tcping扫描所有端口_ping TCP端口的实用小工具tcping
- kaggle比赛流程(转)
- html 网页两边空白,windows7系统打开网页两边空白怎么办
- 计算机的mac改不了怎么办,Win7无法修改MAC怎么办 不能修改MAC的原因及解决方法...
- serverTimezone=UTC的那些坑
热门文章
- JavaWeb(二)——Http协议
- SQL Server 2014安装教程
- void与void*详解
- python怎么限制输出精度_谈谈关于Python里面小数点精度控制的问题
- Python 网络爬虫笔记5 -- Beautiful Soup库实战
- FPGA笔记(1)-逻辑代数与逻辑电路基础
- access开发精要(5)-合计group by
- 【重点EI会议推荐】机器学习主题方向论文征稿:2021计算机、物联网与控制工程国际学术会议(CITCE 2021)...
- Pytorch入门.pptx
- 【数学基础】从零构建统计随机变量生成器之离散基础篇