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

java实现excel的导入和导出

2017-10-30 17:14 323 查看
在网上参考了很多文章,对于excel的导入导出大概看了下,详细的API没有仔细去看,只不过是实现了功能而已。这里贴上代码,一方面自己以后用得时候可以直接拿来用,另一方面有需要实现excel导入导出功能的,也可以大概看看本篇文章。

1,需要的依赖

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>


POI所需要的依赖,基本都包括了。

2,excel导入

这部分实现起来比较简单。上传一个excel文件,最后生成一个List集合。当然前提是excel每列的内容还有数据格式是需要提前定义好的。

/**
* 通过导入excel文件,读出每个单元格的内容。
* InputStream来自于文件上传时的MultipartFile对象
*/
@Override
public List<Shipment> readXls(InputStream is,Integer userId,Integer prodId) throws IOException,
InvalidFormatException {
List<Shipment> shipments=new ArrayList<Shipment>();
HSSFWorkbook book = new HSSFWorkbook(is);
HSSFSheet sheet = book.getSheetAt(0);

/**
* 通常第一行都是标题,所以从第二行开始读取数据
*/
for(int i=1; i<sheet.getLastRowNum()+1; i++) {
HSSFRow row = sheet.getRow(i);
row.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
row.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
String uuid = row.getCell(0).getStringCellValue(); //名称
String dealerName = row.getCell(1).getStringCellValue(); //url
String prodName = row.getCell(2).getStringCellValue();
Shipment shipment=new Shipment();
shipment.setUuid(uuid);
shipment.setDealerName(dealerName);
shipment.setProdName(prodName);
shipment.setUserId(userId);
shipment.setProdId(prodId);
shipment.setCreated(new Date());
shipment.setUpdated(new Date());

shipments.add(shipment);
}

for (Shipment shipment : shipments) {
System.err.println(shipment);
}

return shipments;

}


3,excel导出

excel的导出是以下载的方式进行的。用户点击链接,弹出下载该excel的下载框,用户可以选择将该文件下载到指定位置。

@RequestMapping("/{prodId}/downloadExcel")
public void setUpExcel(HttpServletRequest request, HttpServletResponse response,@PathVariable Integer prodId) throws IOException{
String[] headers = { "数量", "时间"};
SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();
List<DeviceActivePeriod> list=dService.monActiveDevices(30,user.getId(),prodId);
List<StatisticsModel> datasList=dService.getActiveDevs(list);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
//设置列宽
sheet.setDefaultColumnWidth((short) 18);
//创建第一行的对象,第一行一般用于填充标题内容。从第二行开始一般是数据
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
//创建单元格,每行多少数据就创建多少个单元格
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
//给单元格设置内容
cell.setCellValue(text);
}

//遍历集合,将每个集合元素对象的每个值填充到单元格中
for(int i=0;i<datasList.size();i++){
StatisticsModel statisticsModel=datasList.get(i);
//从第二行开始填充数据
row = sheet.createRow(i+1);
//该集合只记录数量和时间,这两个值来自statisticsModel。如果对象比较复杂,需要额外转换,比如Date类型的日期,int,float类型的数值
List<String> datas=new ArrayList<>();

String count=statisticsModel.getValue1().toString();
String time=statisticsModel.getTime();
datas.add(count);
datas.add(time);
for (int j=0;j<datas.size();j++) {
String string=datas.get(j);
HSSFCell cell = row.createCell(j);
HSSFRichTextString richString = new HSSFRichTextString(string);
HSSFFont font3 = workbook.createFont();
//定义Excel数据颜色,这里设置为蓝色
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}

}

response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename="+"Devices.xls");//Excel文件名
try {
response.flushBuffer();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将workbook中的内容写入输出流中
workbook.write(response.getOutputStream());

}


3.1 效果:

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