您的位置:首页 > 编程语言 > Java开发

【小白做项目Java】——POI导入和导出 execl文件

2017-07-21 17:04 465 查看

前提

    在项目遇到要求上传并且能解析Excel文件的功能。在这个功能利用Apache POI刚好能完美解决。

何为POI

   Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

HSSF概况

    HSSF是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。关于本文中涉及到Execl的导出和导入使用的是HSSFWorkBook对象。

    使用POI,需要在项目中引入关于POI的jar包。例如(poi-3.9-20121203.jar)

导入

计算机中文件的传输都是以流来传输了,所以接收到上传的execl文件,本质上也是流。

/**
* @Title: importXls
* @Description: 批量导入
* @author 贾文静
* @return
* @throws IOException
* @throws FileNotFoundException
* @throws
* @date:2017年7月10日.下午4:25:27
*/
public String importXls() throws Exception{
String flag = "1";
//使用POI解析execl文件
try {
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(myFile));
//获得第一个sheet页
HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
List<Region> list = new ArrayList<Region>();
for (Row row : sheet) {
int rowNum = row.getRowNum();
if (rowNum == 0) {
//第一行,标题行,忽略
continue;
}
//以行为单位,解析数据
String id = row.getCell(0).getStringCellValue();
String province = row.getCell(1).getStringCellValue();
String city = row.getCell(2).getStringCellValue();
String district = row.getCell(3).getStringCellValue();
String postcode = row.getCell(4).getStringCellValue();
list.add(region);
}
//存入解析之后的数据
regionService.saveBatch(list);
} catch (Exception e) {
flag = "0";
}
//文件格式设置
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
//是否导入成功的标识
ServletActionContext.getResponse().getWriter().print(flag);
return NONE;
}

导出

    相对导入,导出功能会相对复杂一些,涉及execl文件的创建,sheet的创建,还表头标题的创建,以及名称的创建等等。但是总体上来说使用POI解决还是非常容易的。具体的见代码吧。

/*
* 使用POI写入Execl文件提供下载
* 贾文静-2017年7月21日17:03:35
*/
public String exportXls() throws IOException{
//查询要导出的数据放入list
List<Subarea> list = subareaService.findAll();

//在内存中创建一个Execl文件,通过输出流写到客户端提供下载
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个sheet页
HSSFSheet sheet = workbook.createSheet("分区数据");
//创建标题行
HSSFRow headRow = sheet.createRow(0);
headRow.createCell(0).setCellValue("分区编号");
headRow.createCell(1).setCellValue("区域编号");
headRow.createCell(2).setCellValue("地址关键字");
headRow.createCell(3).setCellValue("省市区");
//循环在execl中放入数据
for (Subarea subarea : list) {
HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1);
dataRow.createCell(0).setCellValue(subarea.getId());
dataRow.createCell(1).setCellValue(subarea.getRegion().getId());
dataRow.createCell(2).setCellValue(subarea.getAddresskey());
Region region = subarea.getRegion();
dataRow.createCell(3).setCellValue(region.getProvince()+region.getCity()+region.getDistrict());
}
String filename = "分区数据.xls";
String agent = ServletActionContext.getRequest().getHeader("User-Agent");
String encodeDownloadFilename = FileUtils.encodeDownloadFilename(filename, agent);
//下载输入内容的设置
//一个流两个头 输出流,输出文件格式,输出文件名称
ServletOutputStream out = ServletActionContext.getResponse().getOutputStream();
//根据文件名称判断文件编码格式
String contentType = ServletActionContext.getServletContext().getMimeType(filename);
ServletActionContext.getResponse().setContentType(filename);
//下载设置
ServletActionContext.getResponse().setHeader("content-disposition", "attchment;filename="+filename);
workbook.write(out);
return NONE;

}


【总结】

    只要用过就是很简单的内容,利用封装的函数实现execl文件的读取和写入。其中关键是HSSFWorkBook,其本质就是创建了一个Execl对象。其余的操作就是一些方法的操作,知道大概方向就好!多做一点,多知道一点,没有哪一种经历是一无所获的。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: