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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果