在经常处理数据的项目中经常有上传下载导入导出这种功能,前几篇写过上传txt以及解析,这套代码本来是一个功能,先是上传txt到服务器然后解析,转码,在导出到excel中。业务流程较为繁琐不便透露,这里在发布一个导出的文章,记录一下顺便看看对大家有帮助没:
先是建立一个文件路径和一个list,下边导出使用:
String txtFilePath = request.getServletContext().getRealPath("./")
+ File.separator + System.currentTimeMillis() +"_oldFile";
List<Map<String,Object>> mapList = new ArrayList<Map<String,Object>>();
实例HSSFWorkbook,这种情况是考虑要生成多个sheet页,这样的话下边执完几次createExcel就创建几个sheet页,都在一个excel中:
HSSFWorkbook workboot = new HSSFWorkbook();
createExcel(workboot,txtFilePath,mapList);
workboot.close();
下边是导出的代码以及一些常用格式样式的设置,这里不拆开写了,注释很明确:
private void createExcel(HSSFWorkbook workboot, String txtFilePath, List<Map<String, Object>> mapList) throws FileNotFoundException, IOException {
// TODO Auto-generated method stub
//创建sheet页,括号里的sheet页的名字,如果不添加默认是sheet1、sheet2....
HSSFSheet sheet = workboot.createSheet("sheet第一页");
HSSFRow row = null;
HSSFCell cell = null;
//设置列宽
sheet.setColumnWidth(0, 4*256);//(第几列:从0开始,宽度为字节*256)
sheet.setColumnWidth(1, 4*256);
sheet.setColumnWidth(2, 6*256);
//sheet.setDefaultColumnWidth((short)7);//默认列宽
HSSFCellStyle style = workboot.createCellStyle();
style.setWrapText(true);//自动换行
style.setAlignment(HSSFCellStyle.ALIGN_LEFT);//左对齐
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
// 背景色
/*style.setFillForegroundColor(HSSFColor.YELLOW.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setFillBackgroundColor(HSSFColor.YELLOW.index); */
// 设置边框
/*style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN); */
HSSFFont font = workboot.createFont();
//设置字体
font.setFontName("宋体");
font.setFontHeightInPoints((short)12);
style.setFont(font);
/*
* 每个sheet页都可以分页,用分页符隔开,这里每隔十条数据一分页,打印的时候a4纸能放的内容有限,是个考虑范围
*/
for(int i = 0; i<= mapList.size()/10; i++){
if(i * 10 == mapList.size())
break;
String pageTotal = "";//总页数
String page = String.valueOf(i+1); // 当前页
if(mapList.size()%10 ==0){
pageTotal = String.valueOf(mapList.size()/10);
}else{
pageTotal = String.valueOf(mapList.size()/10+1);
}
//创建每一页的排头信息
row = sheet.createRow(sheet.getLastRowNum()+1);
cell = row.createCell(0);
cell.setCellStyle(style);
cell.setCellValue("第 " + page + " 页/共 " + pageTotal + "页");
cell = row.createCell(1);
cell.setCellStyle(style);
cell = row.createCell(2);
cell.setCellStyle(style);
//合并单元格(起始行,结束行,起始单元格,结束单元格)
CellRangeAddress hebinhang = new CellRangeAddress(sheet.getLastRowNum(),
sheet.getLastRowNum(),0,2);
sheet.addMergedRegion(hebinhang);
for(int k = i*10; k < (i+1)*10; k++){
if( k == mapList.size()){
break;
}
row = sheet.createRow(sheet.getLastRowNum()+1);
for(int ce = 0; ce < 3; ce ++){
cell = row.createCell(ce);
cell.setCellStyle(style);
//根据实际情况向单元格存值
cell.setCellValue(!mapList.get(k).get(String.valueOf(ce)).toString().equals("") ?
mapList.get(k).get(String.valueOf(ce)).toString() : "(空)");
}
}
//添加一个分页符
sheet.setRowBreak(sheet.getLastRowNum());
}
workboot.write(new FileOutputStream(txtFilePath));
}
最后提醒一下,这里使用的jar均为3.15,分别是poi-3.15.jar、poi-ooxml-3.15.jar、poi-ooxml-schemas-3.15.jar。因为样式方面,比如对齐方式的写法在3.15版本jar里已经不推荐使用,3.17的自然就给干掉了,至于3.17版本里对于样式的一些写法这里就不一一介绍了,做个提醒。
其实大概步骤就是:
- 实例workboot,创建工作簿
- 创建sheet页
- 创建样式,样式创建的顺序并没有要求,先创建出来方便后边单元格或者sheet页的添加
- 创建行
- 创建列,添加样式,存值
- 写入工作簿
- 释放