在实际项目中可能出现将数据生成Excel表格,然后导入到本地。或者使用Excel模板将数据导出,这个或许在项目中比较常用。
认识Excel表格
使用POI创建Excel
通过Apache POI文档可以清楚的了解到如何去创建一个Excel表格。
* Excel 2003: HSSFWorkbook, HSSFSheet, HSSFRow, HSSFCell, etc.(对于2003)
* Excel 2007: XSSFWorkbook, XSSFSheet, XSSFRow, XSSFCell, etc.(对于2007)
1.HSSFWorkbook : 相当于一个excel文件
Workbook wb = new HSSFWorkbook();
2.HSSFSheet:一张excel表,excel左下角的sheet0,sheet1..
Sheet sheet1 = wb.createSheet("new sheet");//参数new sheet是工作表的表名
3.HSSFRow:一张表格中的某一行
Row row = sheet.createRow((short)0);//参数表示创建第几行,索引从0开始
4.创建一个单元格
HSSFCell cell = row.createCell(0);//参数表示创建第几列,索引从0开始
到这里就可以新建一个简单的Excel表格了。
写入数据到Excel并导出
private static void createExcel(ArrayList<String> list) {
//获取当前时间
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
String date = df.format(new Date());// new Date()为获取当前系统时间,也可使用当前时间戳
//存储路径--获取桌面位置
FileSystemView view = FileSystemView.getFileSystemView();
File directory = view.getHomeDirectory();
System.out.println(directory);
//存储Excel的路径
String path = directory+"\\"+date+".xlsx";
System.out.println(path);
try {
//定义一个Excel表格
XSSFWorkbook wb = new XSSFWorkbook(); //创建工作薄
XSSFSheet sheet = wb.createSheet("sheet1"); //创建工作表
XSSFRow row = sheet.createRow(0); //行
XSSFCell cell; //单元格
//添加表头数据
for (int i = 0; i < list.size(); i++) {
//从前端接受到的参数封装成list集合,然后遍历下标从而取出对应的值
String value = list.get(i);
//将取到的值依次写到Excel的第一行的cell中
row.createCell(i).setCellValue(value);
}
//输出流,下载时候的位置
// FileWriter outputStream1 = new FileWriter(path);
FileOutputStream outputStream = new FileOutputStream(path);
wb.write(outputStream);
outputStream.flush();
outputStream.close();
System.out.println("写入成功");
} catch (Exception e) {
System.out.println("写入失败");
e.printStackTrace();
}
}
读出Excel表格
/**
* 从指定路径读取Excel文件,返回类型为List<Map<String,String>>
*
* @param path
* @throws IOException
*/
private static ArrayList<Map<String, String>> readExcel(String path) throws Exception {
ArrayList<Map<String, String>> mapList = new ArrayList<>();
File file = new File(path);
//判断文件是否存在
if (file.isFile() && file.exists()) {
System.out.println(file.getPath());
//获取文件的后缀名 \\ .是特殊字符
String[] split = file.getName().split("\\.");
System.out.println(split[1]);
Workbook wb;
//根据文件后缀(xls/xlsx)进行判断
if ("xls".equals(split[1])) {
// //获取文件流对象
FileInputStream inputStream = new FileInputStream(file);
wb = new HSSFWorkbook(inputStream);
}else if ("xlsx".equals(split[1])){
wb = new XSSFWorkbook(file);
}else {
System.out.println("文件类型错误");
return null;
}
//开始解析
Sheet sheet = wb.getSheetAt(0);
//第一行是列名,所以从第二行开始遍历
int firstRowNum = sheet.getFirstRowNum() + 1;
int lastRowNum = sheet.getLastRowNum();
//遍历行
for (int rIndex = firstRowNum; rIndex <= lastRowNum; rIndex++) {
Map map =new HashMap();
//获取当前行的内容
Row row = sheet.getRow(rIndex);
if (row != null) {
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
for (int cIndex = firstCellNum; cIndex < lastCellNum; cIndex++) {
row.getCell(cIndex).setCellType(Cell.CELL_TYPE_STRING);
//获取单元格的值
String value = row.getCell(cIndex).getStringCellValue();
System.out.println(value);
//获取此单元格对应第一行的值
String key = sheet.getRow(0).getCell(cIndex).getStringCellValue();
System.out.println(key);
//第一行中的作为键,第n行的作为值
map.put(key, value);
System.out.println(map);
}
}
mapList.add(map);
System.out.println("读取成功");
System.out.println(mapList);
}
}
return mapList;
}
这就使用POI对Excel的基本操作,还有更多的复杂的操作请参考官方文档。
可能需要添加的包
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>