Excel的导入导出
在对工作中经常会遇到和Excel打交道,不管是导出数据到Excel表中又或者是从Excel表中导入数据到数据库,下面就基于Apache POI对Excel的导入导出做一下说明。
简单的说一下什么是POI
简单的说一下可以更好地理解之后的代码。其实所谓的POI就是Apache软件的开放源码函式库的一种,POI提供API给Java程序对Microsoft Office格式档案读和写的功能,可以用来操作Excel、Word、PPT的读写功能,这里主要对Excel进行说明。
写数据
写数据的整体操作步骤
先来说说写数据大概分为几部分,
- 设置文件格式(如果是直接网页上下载的那种一定要设置,不然很有可能出现乱码);
- 画一下Excel的表格头(一个有表格头的文件可以更清晰的看出文件里的数据是什么);
- 用来填充数据;
- 最后一步就是将所有的信息写到Excel中。
每个步骤的具体实现
- 设置文件格式:
其中的gb2312和iso8859-1 就是类型的固定写法,不做具体的说明,有需求的话可以问一下度娘一目了然。
- 根据文件名字来判断需要使用的是HSSFWorkbook还是XSSFWorkbook。HSSFWorkbook是用来出来后缀名为.xls的Excel,而XSSFWorkbook是用来处理后缀名为.xlsx。
~~~java
private Workbook getWorkbook(String fileName) {
private Workbook getWorkbook(String fileName) {
if (fileName.endsWith("xls")) {
return new HSSFWorkbook();
}
return new XSSFWorkbook(); }
~~~
- 刻画Excel的表格头
想要表格头更加好看点可以通过workbook.createCellStyle()这个方法来添加样式,可以设置大小,边框布局等等,这里只设置了长度和颜色private void createSheetHeader(Workbook workbook, Sheet sheet, List<String> titles) { if (!CollectionUtils.isEmpty(titles)) { //设置默认长度 sheet.setDefaultColumnWidth(25); int colIndex = 0; Row row = sheet.createRow(0); CellStyle cs = workbook.createCellStyle(); //设置居中 cs.setAlignment(HorizontalAlignment.CENTER); //设置颜色 cs.setFillForegroundColor(new HSSFColor.PALE_BLUE().getIndex()); cs.setFillPattern(FillPatternType.SOLID_FOREGROUND); for (String title : titles) { Cell cell = row.createCell(colIndex++); cell.setCellValue(title); cell.setCellStyle(cs); } } }
看一下成品效果:
- 填充数据,这里以自定义的User类来说明,具体场景根据各自具体需要来添加。
private void fillData(Sheet sheet, List<User> data) { if (!CollectionUtils.isEmpty(data)) { int rowIndex = 1; for (User user : data) { Row row = sheet.createRow(rowIndex++); Cell cell = row.createCell(0); cell.setCellValue(user.getName()); cell = row.createCell(1); cell.setCellValue(user.getEmployeeId()); cell = row.createCell(2); cell.setCellValue(user.getPost()); } } }
- 写入文件
- 这里有两种写入文件的说明,一种是以文件的形式
OutputStream os = response.getOutputStream(); workbook.write(os);
- 另一种是以HttpServletResponse的输出流
File file = new File(filePath); file.createNewFile(); FileOutputStream stream = FileUtils.openOutputStream(file); workbook.write(stream);
- 最终结果
测试实现,以文件为例public class ExcelTest { private static final Logger LOGGER = LoggerFactory.getLogger(ExcelTest.class); public static void main(String[] args) { ExcelUtil util = new ExcelUtil(); List<String> titleList = new ArrayList<>(); titleList.add("名字"); titleList.add("工号"); titleList.add("岗位"); List<User> dataList = new ArrayList<>(); dataList.add(new User("z3", "0211", "部门主管")); dataList.add(new User("l4", "0455", "部门经理")); dataList.add(new User("w5", "0982", "开发主管")); try { util.export(titleList, dataList, "导出", "你需要导出的地址:..\\Desktop\\export.xls"); } catch (IOException e) { LOGGER.error(e.getMessage(), e); } }
}
~~~
读数据
读取数据在其实需要完成写数据的基础上,因为它同样需要一个模板,也就是所谓的表头,以及里面的数据,在读取数据的时候就将之前写入数据的那部分代码对应的SET改成GET就好了。
同样需要先校验一下文件的类型,用来区分是使用HSSFWorkbook来处理还是用XSSFWorkbook来处理
private Workbook getWorkBook(InputStream is, String fileName) {
try {
if (fileName == null) {
return null;
}
if (fileName.endsWith(".xls")) {
return new HSSFWorkbook(is);
} else {
return new XSSFWorkbook(is);
}
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
return null;
} finally {
try {
is.close();
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
}
}
}
读取的时候需要注意: 获取Excel中数据的时候需要对应列和实体中的对应属性
private void importUserResource(InputStream is, String fileName) {
Workbook wb = getWorkBook(is, fileName);
if (wb == null) {
return;
}
Sheet workSheet = wb.getSheetAt(0);
User user = new User();
for (int i = 1; ; i++) {
Row row = workSheet.getRow(i);
if (row == null) {
break;
}
user.setName(row.getCell(0).getStringCellValue());
user.setEmployeeId(row.getCell(1).getStringCellValue());
user.setPost(row.getCell(2).getStringCellValue());
userDao.insert(user);
}
}
总结
对Excel的操作其实没有你想的那么简单,但是还是需要自己去实际编写以下,上面我还写了一个response的写入Excel的操作,有兴趣的可以接着我的代码自己实现一下。