讲点废话,吐个槽
最近有个要求,表格导出,之前也搞过,但觉得每次都到处找太麻烦了,有些大佬,展示部分代码,看着挺多个类,复制粘贴运行就报错,一检查,少个关键类,没办法跑,要么就是标注个什么什么大全,下载打钱,虽然白嫖不好,毕竟别人学习总结成果,但我爽啊,一直白嫖一直爽,咱自己翻了点资料,总结了一下导出表格大概也就两种情况
标准表格
如果导出的这种表格,那么就是很简单的事,上代码
准备
pom文件
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
实体类
@Data
public class Member {
/**
* 学号
*/
private Integer code;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 生日
*/
private Date birth;
工具类方法
public static void createExcel(Map<String, List<String>> map, String[] strArray) {
// 创建一个webbook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet("sheet1");
// 在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow row = sheet.createRow(0);
// 添加标题行
HSSFCell cell = null;
for (int i = 0; i < strArray.length; i++) {
// 获取行内对应单元格
cell = row.createCell(i);
// 单元格赋值
cell.setCellValue(strArray[i]);
}
// 写入实体数据,实际应用中这些数据从数据库得到,list中字符串的顺序必须和数组strArray中的顺序一致
int i = 0;
for (String str : map.keySet()) {
// 除去标题行,遍历获取后面行号对象
row = sheet.createRow(i + 1);
// 获取要添加到单元格的集合数据
List<String> list = map.get(str);
// 遍历当前行内所有单元格
for (int j = 0; j < strArray.length; j++) {
// 创建单元格,并设置值
row.createCell(j).setCellValue(list.get(j));
}
// 第六步,将文件存到指定位置
try {
FileOutputStream fout = new FileOutputStream("D:/国家机密.xls");
wb.write(fout);
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
i++;
}
}
测试代码
/**
* @Author: wanyuan
* Date: 2020/8/26 16:23
*/
public class DownloadExcel {
public static void main(String[] args) {
Map<String, List<String>> memberMap = getMember();
String[] strArray = excelTitle();
ExcelUtil.createExcel(memberMap, strArray);
}
/**
* 初始化数据,将会被存储到excel表格中
*
* @return
* @throws Exception
*/
private static Map<String, List<String>> getMember() {
List<Member> list = new ArrayList<Member>();
Map<String, List<String>> map = new HashMap<String, List<String>>();
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
try {
Member user1 = new Member(1, "赵丽颖", 18, df.parse("2002-10-16"));
Member user2 = new Member(2, "娜美", 20, df.parse("2000-08-19"));
Member user3 = new Member(3, "汉克库", 25, df.parse("1995-11-22"));
list.add(user1);
list.add(user2);
list.add(user3);
for (int i = 0; i < list.size(); i++) {
ArrayList<String> members = new ArrayList<String>();
members.add(list.get(i).getCode() + "");
members.add(list.get(i).getName());
members.add(list.get(i).getAge() + "");
members.add(df.format(list.get(i).getBirth()));
map.put(list.get(i).getCode() + "", members);
}
} catch (ParseException e) {
e.printStackTrace();
}
return map;
}
/**
* 创建标题行数据
*/
public static String[] excelTitle() {
String[] strArray = { "学号", "姓名", "年龄", "生日" };
return strArray;
}
}
输出结果
非正常表格
非常简单的一个例子,填写的简历,让导出成为表格,那就不是循环遍历,挨着存入的了,而是需要人为控制表格的填写
所以需要一个模板文件,如:
工具类
public static void readExcel(String[] strArray){
try{
// Excel模板文件路径
String temlateRealPath = "D:/国家机密.xls";
//读取模板文件创建Excel表格对象
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(temlateRealPath)));
// 获取模板文件第一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = workbook.getSheetAt(0);
// 根据要求,可以得出结论,我们需要填写的单元格是2-B,2-D,3-B,3-D
// 获取对应行号
HSSFRow row = sheet.getRow(1);
// 对应单元格填入数据
row.getCell(1).setCellValue(strArray[0]);
row.getCell(3).setCellValue(strArray[1]);
row = sheet.getRow(2);
row.getCell(1).setCellValue(strArray[2]);
row.getCell(3).setCellValue(strArray[3]);
try {
// 输出流
FileOutputStream fout = new FileOutputStream("D:/维多利亚的秘密.xls");
workbook.write(fout);
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}catch (Exception e){
e.printStackTrace();
}
}
测试代码
/**
* @Author: wanyuan
* Date: 2020/8/26 16:23
*/
public class DownloadExcel {
public static void main(String[] args) {
String[] strArray = excelTitle();
ExcelUtil.readExcel(strArray);
}
/**
* 准备数据
*/
public static String[] excelTitle() {
String[] strArray = { "赵丽颖", "18", "160", "2002-10-16" };
return strArray;
}
}
输出结果
总结
- 标准表格导出很简单,高兴就好
- 奇奇怪怪的表格导出,没发现其他什么好一点的办法,如果有大佬知道别的好办法,可以告诉小弟一声
- 第二个工具类导出方法具体逻辑根据模板文件来定,但愿你们没有这种需求(PS:对提这个需求的产品经理说句,一路走好,愿天堂没有痛苦,愿天堂没有纷争)