Java Apache POI 操作 Excel 导出
Java Apache POI 操作 Excel 导出
Java 可以通过 Apache POI 操作 Excel 的导入导出
Apache POI 是一套操作 Microsoft Office 套件的开源 Java API
更多精彩
- 更多技术博客,请移步 asing1elife’s blog
JAR 包依赖及介绍
实现步骤
创建 Excel 实体类,用于同一接收导出数据
-
headers
用于存储导出数据时规定的表格头部内容 -
cells
是一个在 List 中嵌套 List 的结构
- 外层的 List 表示行数据
- 内层的 List 表示列数据
- 结合起来也就是有多少行多少列的数据
- 如果导出的内容存在多个 sheet ,只需要使用一个 Map ,通过 key-value 的形式包装 Excel 实体类即可
- 例如
Map<String, Excel> excels
,Map 中的 key 就是 sheet 的名称
- 例如
public class Excel { // 表头 private List<String> headers = Lists.newArrayList(); // 内容 private List<List<String>> cells = Lists.newArrayList(); // 省略 Getter/Setter 方法 }
举一个上述实体类使用的例子
- 传入的数据本身就很复杂,需要导出的数据也存在多个 sheet
private Map<String, Excel> wrapFeedbackQuestions(Map<String, ArrayList<FeedbackQuestion>> feedbackQuestionMap) { Map<String, Excel> excels = Maps.newHashMap(); if (feedbackQuestionMap.isEmpty()) { throw new TSharkException("统计数据转换异常,请咨询管理员"); } List<String> divide = Lists.newArrayList(); feedbackQuestionMap.forEach((k, v) -> { Excel excel = new Excel(); excel.addHeader("题目"); excel.addHeader("小计"); v.forEach(feedbackQuestion -> { // 按照约定格式每行添加数据 List<String> row = Lists.newArrayList(); row.add(feedbackQuestion.getContent()); row.add(feedbackQuestion.getCount().toString()); excel.addCell(row); }); excels.put(k, excel); }); return excels; }
构建 ExcelExportUtil 工具类
-
Map<String, Excel> excel
是通过上述操作构建好的数据结构 -
String filePath
是生成 Excel 后,存放文件的地址 -
initHeaderStyle()
和initCellStyle()
是对表格样式的初始化,在后续步骤中提供 -
formatLongValue()
是为了防止单元格内容过长,而设置的超过一定量长度添加换行符
public static String export(Map<String, Excel> excel, String filePath) { HSSFWorkbook workbook = new HSSFWorkbook(); // 表头样式 HSSFCellStyle headerStyle = initHeaderStyle(workbook); // 单元格样式 HSSFCellStyle cellStyle = initCellStyle(workbook); excel.forEach((key, value) -> { HSSFSheet sheet = workbook.createSheet(key); List<String> headers = value.getHeaders(); List<List<String>> cells = value.getCells(); // 表头包装 HSSFRow headerRow = sheet.createRow(0); for (int i = 0; i < headers.size(); i++) { HSSFCell cell = headerRow.createCell(i); cell.setCellValue(headers.get(i)); cell.setCellStyle(headerStyle); } // 内容包装 for (int j = 0; j < cells.size(); j++) { HSSFRow row = sheet.createRow(j + 1); List<String> child = cells.get(j); for (int k = 0; k < child.size(); k++) { HSSFCell cell = row.createCell(k); cell.setCellValue(formatLongValue(child.get(k))); cell.setCellStyle(cellStyle); } } // 自动撑开列宽 sheet.autoSizeColumn((short) 0); sheet.autoSizeColumn((short) 1); }); // 保存文件并返回名称 String fileName = FileUtil.getRandomFileNameByDate(); try { String fullFileName = filePath + fileName + FILE_SUFFIX; FileOutputStream stream = new FileOutputStream(fullFileName); workbook.write(stream); stream.flush(); } catch (Exception e) { logger.error("Excel导出失败,", e); } return fileName; }
initHeaderStyle() 初始化表头样式
- 对表头单元格的字体、颜色、背景做一些自定义操作
private static HSSFCellStyle initHeaderStyle(HSSFWorkbook workbook) { // 表头字体 HSSFFont font = workbook.createFont(); font.setFontHeightInPoints((short) 15); font.setColor(HSSFColor.WHITE.index); // 表头样式 HSSFCellStyle headerStyle = workbook.createCellStyle(); headerStyle.setFont(font); headerStyle.setWrapText(true); headerStyle.setFillBackgroundColor(HSSFColor.GREEN.index); headerStyle.setFillForegroundColor(HSSFColor.GREEN.index); // 需要设置此项,单元格背景色才会生效 headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); return headerStyle; }
initCellStyle 初始化单元格样式
private static HSSFCellStyle initCellStyle(HSSFWorkbook workbook) { // 单元格字体 HSSFFont font = workbook.createFont(); font.setFontHeightInPoints((short) 15); // 单元格样式 HSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setFont(font); cellStyle.setWrapText(true); return cellStyle; }
formatLongValue 格式化超长内容
- 需要单元格启用
setWrapText = true
才会生效
private static String formatLongValue(String value) { // 长度限制 int limit = 50; // 没有达到限制直接返回 if (value.length() < 50) { return value; } StringBuilder stringBuilder = new StringBuilder(); // 设置长度限制的正则匹配 Pattern p = Pattern.compile("(.{" + limit + "}|.*)"); Matcher m = p.matcher(value); while (m.find()) { String group = m.group(); // 字符不存在则跳过 if (group == null || group.trim().equals("")) { continue; } // 超过限制添加换行符 stringBuilder.append(group); stringBuilder.append("\n"); } return stringBuilder.toString(); }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
phar反序列化
参考文献:https://xz.aliyun.com/t/2715https://www.jianshu.com/p/19e3ee990cb7 phar原理: 一个标志,格式为xxx<?php xxx;__HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。ps:要将php.ini中的 phar.readonly选项设置为Off。 一个例子 序列化 <?php class TestObject { } $phar = new Phar("phar.phar"); //后缀名必须为phar $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub $o = new TestObject(); $o -> data='sheng'; $phar->setMetadata($o); //将自定义的meta-data存入mani...
- 下一篇
C语言什么是结构体?初步学习C语言结构体三部曲
阅读须知: 结构体部分内容,涉及结构体定义,结构体变量,结构体指针,结构体数组,更多内容敬请关注。 结构体是由若干个"成员"组成的,每一个成员要有成员名称和类型,成员可以是基本数据类型或者一个结构体。一旦定义结构体类型,使用它的方式和其他类型一样,可以声明这个结构体的对象、指针和数组。下面我们先来定义一个描述歌曲的结构体: 上面的song就是一个机构体,它包含有4个成员,成员分别有不同的数据类型,通过上面的例子我们能总结出定义结构的一般格式:struct 结构体名称 {成员列表}; struct是一个C语言的关键字,是定义结构体所必须的。[结构体名称]就是上面的song,有时候可以省略。成员列表必须用花括号{}括起来,最后是分号。 想要使用结构体,就必须先声明结构体变量,如果你想说在上个练习中的song是变量的话,那你就大错特错了。song是我们定义的结构体名称,就想int一样,只不过song是我们定义的,而int是C语言定义好的。我们可以使用2种方式来声明结构体变量: 定义好结构体后再声明变量 在定义机构体时就声明变量 当我们使用这种方式声明结构体变量时,结构体名称song可以省略不...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境